diff options
Diffstat (limited to 'doc/gpgme.info-1')
-rw-r--r-- | doc/gpgme.info-1 | 6615 |
1 files changed, 6615 insertions, 0 deletions
diff --git a/doc/gpgme.info-1 b/doc/gpgme.info-1 new file mode 100644 index 0000000..35b948a --- /dev/null +++ b/doc/gpgme.info-1 @@ -0,0 +1,6615 @@ +This is /home/wk/w/gpgme/doc/gpgme.info, produced by makeinfo version +4.13 from /home/wk/w/gpgme/doc/gpgme.texi. + +INFO-DIR-SECTION GNU Libraries +START-INFO-DIR-ENTRY +* GPGME: (gpgme). Adding support for cryptography to your program. +END-INFO-DIR-ENTRY + + Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 g10 +Code GmbH. + + 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 3 of the + License, or (at your option) any later version. The text of the + license can be found in the section entitled "Copying". + + This document 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. + + This file documents the GPGME library. + + This is Edition 1.3.2, last updated 2 May 2012, of `The `GnuPG Made +Easy' Reference Manual', for Version 1.3.2. + + Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2010 g10 +Code GmbH. + + 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 3 of the + License, or (at your option) any later version. The text of the + license can be found in the section entitled "Copying". + + This document 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. + + +File: gpgme.info, Node: Top, Next: Introduction, Up: (dir) + +Main Menu +********* + +This is Edition 1.3.2, last updated 2 May 2012, of `The `GnuPG Made +Easy' Reference Manual', for Version 1.3.2 of the GPGME library. + +* Menu: + +* Introduction:: How to use this manual. +* Preparation:: What you should do before using the library. +* Protocols and Engines:: Supported crypto protocols. +* Algorithms:: Supported algorithms. +* Error Handling:: Error numbers and their meanings. +* Exchanging Data:: Passing data to and from GPGME. +* Contexts:: Handling GPGME contexts. + +Appendices + +* UI Server Protocol:: The GnuPG UI Server Protocol. + +* Library Copying:: The GNU Lesser General Public License says + how you can copy and share `GnuPG Made Easy'. +* Copying:: The GNU General Public License says how you + can copy and share this manual. + +Indices + +* Concept Index:: Index of concepts and programs. +* Function and Data Index:: Index of functions, variables and data types. + + + --- The Detailed Node Listing --- + +Introduction + +* Getting Started:: Purpose of the manual, and how to use it. +* Features:: Reasons to install and use GPGME. +* Overview:: Basic architecture of the GPGME library. + +Preparation + +* Header:: What header file you need to include. +* Building the Source:: Compiler options to be used. +* Largefile Support (LFS):: How to use GPGME with LFS. +* Using Automake:: Compiler options to be used the easy way. +* Using Libtool:: Avoiding compiler options entirely. +* Library Version Check:: Getting and verifying the library version. +* Signal Handling:: How GPGME affects signal handling. +* Multi Threading:: How GPGME can be used in an MT environment. + +Protocols and Engines + +* Engine Version Check:: Verifying the engine version. +* Engine Information:: Obtaining more information about the engines. +* Engine Configuration:: Changing the engine configuration. +* OpenPGP:: Support for the OpenPGP protocol. +* Cryptographic Message Syntax:: Support for the CMS. + +Algorithms + +* Public Key Algorithms:: A list of all public key algorithms. +* Hash Algorithms:: A list of all hash algorithms. + +Error Handling + +* Error Values:: The error value and what it means. +* Error Codes:: A list of important error codes. +* Error Sources:: A list of important error sources. +* Error Strings:: How to get a descriptive string from a value. + +Exchanging Data + +* Creating Data Buffers:: Creating new data buffers. +* Destroying Data Buffers:: Releasing data buffers. +* Manipulating Data Buffers:: Operations on data buffers. + +Creating Data Buffers + +* Memory Based Data Buffers:: Creating memory based data buffers. +* File Based Data Buffers:: Creating file based data buffers. +* Callback Based Data Buffers:: Creating callback based data buffers. + +Manipulating Data Buffers + +* Data Buffer I/O Operations:: I/O operations on data buffers. +* Data Buffer Meta-Data:: Meta-data manipulation of data buffers. + +Contexts + +* Creating Contexts:: Creating new GPGME contexts. +* Destroying Contexts:: Releasing GPGME contexts. +* Result Management:: Managing the result of crypto operations. +* Context Attributes:: Setting properties of a context. +* Key Management:: Managing keys with GPGME. +* Trust Item Management:: Managing trust items with GPGME. +* Crypto Operations:: Using a context for cryptography. +* Run Control:: Controlling how operations are run. + +Context Attributes + +* Protocol Selection:: Selecting the protocol used by a context. +* Crypto Engine:: Configuring the crypto engine. +* ASCII Armor:: Requesting ASCII armored output. +* Text Mode:: Choosing canonical text mode. +* Included Certificates:: Including a number of certificates. +* Key Listing Mode:: Selecting key listing mode. +* Passphrase Callback:: Getting the passphrase from the user. +* Progress Meter Callback:: Being informed about the progress. +* Locale:: Setting the locale of a context. + +Key Management + +* Listing Keys:: Browsing the list of available keys. +* Information About Keys:: Requesting detailed information about keys. +* Key Signatures:: Listing the signatures on a key. +* Manipulating Keys:: Operations on keys. +* Generating Keys:: Creating new key pairs. +* Exporting Keys:: Retrieving key data from the key ring. +* Importing Keys:: Adding keys to the key ring. +* Deleting Keys:: Removing keys from the key ring. +* Advanced Key Editing:: Advanced key edit operation. + +Trust Item Management + +* Listing Trust Items:: Browsing the list of available trust items. +* Information About Trust Items:: Requesting information about trust items. +* Manipulating Trust Items:: Operations on trust items. + +Crypto Operations + +* Decrypt:: Decrypting a ciphertext. +* Verify:: Verifying a signature. +* Decrypt and Verify:: Decrypting a signed ciphertext. +* Sign:: Creating a signature. +* Encrypt:: Encrypting a plaintext. + +Sign + +* Selecting Signers:: How to choose the keys to sign with. +* Creating a Signature:: How to create a signature. +* Signature Notation Data:: How to add notation data to a signature. + +Encrypt + +* Encrypting a Plaintext:: How to encrypt a plaintext. + +Run Control + +* Waiting For Completion:: Waiting until an operation is completed. +* Using External Event Loops:: Advanced control over what happens when. +* Cancellation:: How to end pending operations prematurely. + +Using External Event Loops + +* I/O Callback Interface:: How I/O callbacks are registered. +* Registering I/O Callbacks:: How to use I/O callbacks for a context. +* I/O Callback Example:: An example how to use I/O callbacks. +* I/O Callback Example GTK+:: How to integrate GPGME in GTK+. +* I/O Callback Example GDK:: How to integrate GPGME in GDK. +* I/O Callback Example Qt:: How to integrate GPGME in Qt. + + +File: gpgme.info, Node: Introduction, Next: Preparation, Prev: Top, Up: Top + +1 Introduction +************** + +`GnuPG Made Easy' (GPGME) is a C language library that allows to add +support for cryptography to a program. It is designed to make access +to public key crypto engines like GnuPG or GpgSM easier for +applications. GPGME provides a high-level crypto API for encryption, +decryption, signing, signature verification and key management. + + GPGME uses GnuPG and GpgSM as its backends to support OpenPGP and +the Cryptographic Message Syntax (CMS). + +* Menu: + +* Getting Started:: Purpose of the manual, and how to use it. +* Features:: Reasons to install and use GPGME. +* Overview:: Basic architecture of the GPGME library. + + +File: gpgme.info, Node: Getting Started, Next: Features, Up: Introduction + +1.1 Getting Started +=================== + +This manual documents the GPGME library programming interface. All +functions and data types provided by the library are explained. + + The reader is assumed to possess basic knowledge about cryptography +in general, and public key cryptography in particular. The underlying +cryptographic engines that are used by the library are not explained, +but where necessary, special features or requirements by an engine are +mentioned as far as they are relevant to GPGME or its users. + + This manual can be used in several ways. If read from the beginning +to the end, it gives a good introduction into the library and how it +can be used in an application. Forward references are included where +necessary. Later on, the manual can be used as a reference manual to +get just the information needed about any particular interface of the +library. Experienced programmers might want to start looking at the +examples at the end of the manual, and then only read up those parts of +the interface which are unclear. + + +File: gpgme.info, Node: Features, Next: Overview, Prev: Getting Started, Up: Introduction + +1.2 Features +============ + +GPGME has a couple of advantages over other libraries doing a similar +job, and over implementing support for GnuPG or other crypto engines +into your application directly. + +it's free software + Anybody can use, modify, and redistribute it under the terms of + the GNU Lesser General Public License (*note Library Copying::). + +it's flexible + GPGME provides transparent support for several cryptographic + protocols by different engines. Currently, GPGME supports the + OpenPGP protocol using GnuPG as the backend, and the Cryptographic + Message Syntax using GpgSM as the backend. + +it's easy + GPGME hides the differences between the protocols and engines from + the programmer behind an easy-to-use interface. This way the + programmer can focus on the other parts of the program, and still + integrate strong cryptography in his application. Once support for + GPGME has been added to a program, it is easy to add support for + other crypto protocols once GPGME backends provide them. + + +File: gpgme.info, Node: Overview, Prev: Features, Up: Introduction + +1.3 Overview +============ + +GPGME provides a data abstraction that is used to pass data to the +crypto engine, and receive returned data from it. Data can be read +from memory or from files, but it can also be provided by a callback +function. + + The actual cryptographic operations are always set within a context. +A context provides configuration parameters that define the behaviour +of all operations performed within it. Only one operation per context +is allowed at any time, but when one operation is finished, you can run +the next operation in the same context. There can be more than one +context, and all can run different operations at the same time. + + Furthermore, GPGME has rich key management facilities including +listing keys, querying their attributes, generating, importing, +exporting and deleting keys, and acquiring information about the trust +path. + + With some precautions, GPGME can be used in a multi-threaded +environment, although it is not completely thread safe and thus needs +the support of the application. + + +File: gpgme.info, Node: Preparation, Next: Protocols and Engines, Prev: Introduction, Up: Top + +2 Preparation +************* + +To use GPGME, you have to perform some changes to your sources and the +build system. The necessary changes are small and explained in the +following sections. At the end of this chapter, it is described how +the library is initialized, and how the requirements of the library are +verified. + +* Menu: + +* Header:: What header file you need to include. +* Building the Source:: Compiler options to be used. +* Largefile Support (LFS):: How to use GPGME with LFS. +* Using Automake:: Compiler options to be used the easy way. +* Using Libtool:: Avoiding compiler options entirely. +* Library Version Check:: Getting and verifying the library version. +* Signal Handling:: How GPGME affects signal handling. +* Multi Threading:: How GPGME can be used in an MT environment. + + +File: gpgme.info, Node: Header, Next: Building the Source, Up: Preparation + +2.1 Header +========== + +All interfaces (data types and functions) of the library are defined in +the header file `gpgme.h'. You must include this in all programs using +the library, either directly or through some other header file, like +this: + + #include <gpgme.h> + + The name space of GPGME is `gpgme_*' for function names and data +types and `GPGME_*' for other symbols. Symbols internal to GPGME take +the form `_gpgme_*' and `_GPGME_*'. + + Because GPGME makes use of the GPG Error library, using GPGME will +also use the `GPG_ERR_*' name space directly, and the `gpg_err*' and +`gpg_str*' name space indirectly. + + +File: gpgme.info, Node: Building the Source, Next: Largefile Support (LFS), Prev: Header, Up: Preparation + +2.2 Building the Source +======================= + +If you want to compile a source file including the `gpgme.h' header +file, you must make sure that the compiler can find it in the directory +hierarchy. This is accomplished by adding the path to the directory in +which the header file is located to the compilers include file search +path (via the `-I' option). + + However, the path to the include file is determined at the time the +source is configured. To solve this problem, gpgme ships with a small +helper program `gpgme-config' that knows about the path to the include +file and other configuration options. The options that need to be +added to the compiler invocation at compile time are output by the +`--cflags' option to `gpgme-config'. The following example shows how +it can be used at the command line: + + gcc -c foo.c `gpgme-config --cflags` + + Adding the output of `gpgme-config --cflags' to the compiler command +line will ensure that the compiler can find the GPGME header file. + + A similar problem occurs when linking the program with the library. +Again, the compiler has to find the library files. For this to work, +the path to the library files has to be added to the library search +path (via the `-L' option). For this, the option `--libs' to +`gpgme-config' can be used. For convenience, this option also outputs +all other options that are required to link the program with GPGME (in +particular, the `-lgpgme' option). The example shows how to link +`foo.o' with the GPGME library to a program `foo'. + + gcc -o foo foo.o `gpgme-config --libs` + + Of course you can also combine both examples to a single command by +specifying both options to `gpgme-config': + + gcc -o foo foo.c `gpgme-config --cflags --libs` + + If you want to link to one of the thread-safe versions of GPGME, you +must specify the `--thread' option before any other option to select +the thread package you want to link with. Supported thread packages +are `--thread=pth' and `--thread=pthread'. + + +File: gpgme.info, Node: Largefile Support (LFS), Next: Using Automake, Prev: Building the Source, Up: Preparation + +2.3 Largefile Support (LFS) +=========================== + +GPGME is compiled with largefile support by default, if it is available +on the system. This means that GPGME supports files larger than two +gigabyte in size, if the underlying operating system can. On some +systems, largefile support is already the default. On such systems, +nothing special is required. However, some systems provide only +support for files up to two gigabyte in size by default. Support for +larger file sizes has to be specifically enabled. + + To make a difficult situation even more complex, such systems provide +two different types of largefile support. You can either get all +relevant functions replaced with alternatives that are largefile +capable, or you can get new functions and data types for largefile +support added. Those new functions have the same name as their +smallfile counterparts, but with a suffix of 64. + + An example: The data type `off_t' is 32 bit wide on GNU/Linux PC +systems. To address offsets in large files, you can either enable +largefile support add-on. Then a new data type `off64_t' is provided, +which is 64 bit wide. Or you can replace the existing `off_t' data +type with its 64 bit wide counterpart. All occurences of `off_t' are +then automagically replaced. + + As if matters were not complex enough, there are also two different +types of file descriptors in such systems. This is important because +if file descriptors are exchanged between programs that use a different +maximum file size, certain errors must be produced on some file +descriptors to prevent subtle overflow bugs from occuring. + + As you can see, supporting two different maximum file sizes at the +same time is not at all an easy task. However, the maximum file size +does matter for GPGME, because some data types it uses in its +interfaces are affected by that. For example, the `off_t' data type is +used in the `gpgme_data_seek' function, to match its POSIX counterpart. +This affects the call-frame of the function, and thus the ABI of the +library. Furthermore, file descriptors can be exchanged between GPGME +and the application. + + For you as the user of the library, this means that your program must +be compiled in the same file size mode as the library. Luckily, there +is absolutely no valid reason for new programs to not enable largefile +support by default and just use that. The compatibility modes (small +file sizes or dual mode) can be considered an historic artefact, only +useful to allow for a transitional period. + + GPGME is compiled using largefile support by default. This means +that your application must do the same, at least as far as it is +relevant for using the `gpgme.h' header file. All types in this header +files refer to their largefile counterparts, if they are different from +any default types on the system. + + You can enable largefile support, if it is different from the default +on the system the application is compiled on, by using the Autoconf +macro `AC_SYS_LARGEFILE'. If you do this, then you don't need to worry +about anything else: It will just work. In this case you might also +want to use `AC_FUNC_FSEEKO' to take advantage of some new interfaces, +and `AC_TYPE_OFF_T' (just in case). + + If you do not use Autoconf, you can define the preprocessor symbol +`_FILE_OFFSET_BITS' to 64 _before_ including any header files, for +example by specifying the option `-D_FILE_OFFSET_BITS=64' on the +compiler command line. You will also want to define the preprocessor +symbol `LARGEFILE_SOURCE' to 1 in this case, to take advantage of some +new interfaces. + + If you do not want to do either of the above, you probably know +enough about the issue to invent your own solution. Just keep in mind +that the GPGME header file expects that largefile support is enabled, +if it is available. In particular, we do not support dual mode +(`_LARGEFILE64_SOURCE'). + + +File: gpgme.info, Node: Using Automake, Next: Using Libtool, Prev: Largefile Support (LFS), Up: Preparation + +2.4 Using Automake +================== + +It is much easier if you use GNU Automake instead of writing your own +Makefiles. If you do that you do not have to worry about finding and +invoking the `gpgme-config' script at all. GPGME provides an extension +to Automake that does all the work for you. + + -- Macro: AM_PATH_GPGME ([MINIMUM-VERSION], [ACTION-IF-FOUND], + [ACTION-IF-NOT-FOUND]) + -- Macro: AM_PATH_GPGME_PTH ([MINIMUM-VERSION], [ACTION-IF-FOUND], + [ACTION-IF-NOT-FOUND]) + -- Macro: AM_PATH_GPGME_PTHREAD ([MINIMUM-VERSION], [ACTION-IF-FOUND], + [ACTION-IF-NOT-FOUND]) + Check whether GPGME (at least version MINIMUM-VERSION, if given) + exists on the host system. If it is found, execute + ACTION-IF-FOUND, otherwise do ACTION-IF-NOT-FOUND, if given. + + Additionally, the function defines `GPGME_CFLAGS' to the flags + needed for compilation of the program to find the `gpgme.h' header + file, and `GPGME_LIBS' to the linker flags needed to link the + program to the GPGME library. + + `AM_PATH_GPGME_PTH' checks for the version of GPGME that can be + used with GNU Pth, and defines `GPGME_PTH_CFLAGS' and + `GPGME_PTH_LIBS'. + + `AM_PATH_GPGME_PTHREAD' checks for the version of GPGME that can + be used with the native pthread implementation, and defines + `GPGME_PTHREAD_CFLAGS' and `GPGME_PTHREAD_LIBS'. + + You can use the defined Autoconf variables like this in your +`Makefile.am': + + AM_CPPFLAGS = $(GPGME_CFLAGS) + LDADD = $(GPGME_LIBS) + + +File: gpgme.info, Node: Using Libtool, Next: Library Version Check, Prev: Using Automake, Up: Preparation + +2.5 Using Libtool +================= + +The easiest way is to just use GNU Libtool. If you use libtool, and +link to `libgpgme.la', `libgpgme-pth.la' or `libgpgme-pthread.la' +respectively, everything will be done automatically by Libtool. + + +File: gpgme.info, Node: Library Version Check, Next: Signal Handling, Prev: Using Libtool, Up: Preparation + +2.6 Library Version Check +========================= + + -- Function: const char * gpgme_check_version + (const char *REQUIRED_VERSION) + The function `gpgme_check_version' has four purposes. It can be + used to retrieve the version number of the library. In addition it + can verify that the version number is higher than a certain + required version number. In either case, the function initializes + some sub-systems, and for this reason alone it must be invoked + early in your program, before you make use of the other functions + in GPGME. The last purpose is to run selftests. + + As a side effect for W32 based systems, the socket layer will get + initialized. + + If REQUIRED_VERSION is `NULL', the function returns a pointer to a + statically allocated string containing the version number of the + library. + + If REQUIRED_VERSION is not `NULL', it should point to a string + containing a version number, and the function checks that the + version of the library is at least as high as the version number + provided. In this case, the function returns a pointer to a + statically allocated string containing the version number of the + library. If REQUIRED_VERSION is not a valid version number, or if + the version requirement is not met, the function returns `NULL'. + + If you use a version of a library that is backwards compatible with + older releases, but contains additional interfaces which your + program uses, this function provides a run-time check if the + necessary features are provided by the installed version of the + library. + + If a selftest fails, the function may still succeed. Selftest + errors are returned later when invoking `gpgme_new', so that a + detailed error code can be returned (historically, + `gpgme_check_version' does not return a detailed error code). + + After initializing GPGME, you should set the locale information to +the locale required for your output terminal. This locale information +is needed for example for the curses and Gtk pinentry. Here is an +example of a complete initialization: + + #include <locale.h> + #include <gpgme.h> + + void + init_gpgme (void) + { + /* Initialize the locale environment. */ + setlocale (LC_ALL, ""); + gpgme_check_version (NULL); + gpgme_set_locale (NULL, LC_CTYPE, setlocale (LC_CTYPE, NULL)); + #ifdef LC_MESSAGES + gpgme_set_locale (NULL, LC_MESSAGES, setlocale (LC_MESSAGES, NULL)); + #endif + } + + Note that you are highly recommended to initialize the locale +settings like this. GPGME can not do this for you because it would not +be thread safe. The conditional on LC_MESSAGES is only necessary for +portability to W32 systems. + + +File: gpgme.info, Node: Signal Handling, Next: Multi Threading, Prev: Library Version Check, Up: Preparation + +2.7 Signal Handling +=================== + +The GPGME library communicates with child processes (the crypto +engines). If a child process dies unexpectedly, for example due to a +bug, or system problem, a `SIGPIPE' signal will be delivered to the +application. The default action is to abort the program. To protect +against this, `gpgme_check_version' sets the `SIGPIPE' signal action to +`SIG_IGN', which means that the signal will be ignored. + + GPGME will only do that if the signal action for `SIGPIPE' is +`SIG_DEF' at the time `gpgme_check_version' is called. If it is +something different, `GPGME' will take no action. + + This means that if your application does not install any signal +handler for `SIGPIPE', you don't need to take any precautions. If you +do install a signal handler for `SIGPIPE', you must be prepared to +handle any `SIGPIPE' events that occur due to GPGME writing to a +defunct pipe. Furthermore, if your application is multi-threaded, and +you install a signal action for `SIGPIPE', you must make sure you do +this either before `gpgme_check_version' is called or afterwards. + + +File: gpgme.info, Node: Multi Threading, Prev: Signal Handling, Up: Preparation + +2.8 Multi Threading +=================== + +The GPGME library is not entirely thread-safe, but it can still be used +in a multi-threaded environment if some care is taken. If the +following requirements are met, there should be no race conditions to +worry about: + + * GPGME supports the thread libraries pthread and GNU Pth. The + support for this has to be enabled at compile time. GPGME will + automatically detect the location in which the thread libraries + are installed and activate the support for them at build time. + + Support for other thread libraries is very easy to add. Please + contact us if you have the need. + + * If you want to use GPGME with threads, you must link to the right + version of the library. The name of the right library is + `libgpgme-' followed by the name of the thread package you use. + For example, if you use GNU Pth, the right name is `libgpgme-pth'. + Use the Automake macros or `gpgme-config' program for simplicity. + + * The function `gpgme_check_version' must be called before any other + function in the library, because it initializes the thread support + subsystem in GPGME. To achieve this in multi-threaded programs, + you must synchronize the memory with respect to other threads that + also want to use GPGME. For this, it is sufficient to call + `gpgme_check_version' before creating the other threads using + GPGME(1). + + * Any `gpgme_data_t' and `gpgme_ctx_t' object must only be accessed + by one thread at a time. If multiple threads want to deal with + the same object, the caller has to make sure that operations on + that object are fully synchronized. + + * Only one thread at any time is allowed to call `gpgme_wait'. If + multiple threads call this function, the caller must make sure that + all invocations are fully synchronized. It is safe to start + asynchronous operations while a thread is running in gpgme_wait. + + * The function `gpgme_strerror' is not thread safe. You have to use + `gpgme_strerror_r' instead. + + ---------- Footnotes ---------- + + (1) At least this is true for POSIX threads, as `pthread_create' is +a function that synchronizes memory with respects to other threads. +There are many functions which have this property, a complete list can +be found in POSIX, IEEE Std 1003.1-2003, Base Definitions, Issue 6, in +the definition of the term "Memory Synchronization". For other thread +packages other, more relaxed or more strict rules may apply. + + +File: gpgme.info, Node: Protocols and Engines, Next: Algorithms, Prev: Preparation, Up: Top + +3 Protocols and Engines +*********************** + +GPGME supports several cryptographic protocols, however, it does not +implement them. Rather it uses backends (also called engines) which +implement the protocol. GPGME uses inter-process communication to pass +data back and forth between the application and the backend, but the +details of the communication protocol and invocation of the backend is +completely hidden by the interface. All complexity is handled by +GPGME. Where an exchange of information between the application and +the backend is necessary, GPGME provides the necessary callback function +hooks and further interfaces. + + -- Data type: enum gpgme_protocol_t + The `gpgme_protocol_t' type specifies the set of possible protocol + values that are supported by GPGME. The following protocols are + supported: + + `GPGME_PROTOCOL_OpenPGP' + This specifies the OpenPGP protocol. + + `GPGME_PROTOCOL_CMS' + This specifies the Cryptographic Message Syntax. + + `GPGME_PROTOCOL_ASSUAN' + Under development. Please ask on <gnupg-devel@gnupg.org> for + help. + + `GPGME_PROTOCOL_G13' + Under development. Please ask on <gnupg-devel@gnupg.org> for + help. + + `GPGME_PROTOCOL_UISERVER' + Under development. Please ask on <gnupg-devel@gnupg.org> for + help. + + `GPGME_PROTOCOL_UNKNOWN' + Reserved for future extension. You may use this to indicate + that the used protocol is not known to the application. + Currently, GPGME does not accept this value in any operation, + though, except for `gpgme_get_protocol_name'. + + -- Function: const char * gpgme_get_protocol_name + (gpgme_protocol_t PROTOCOL) + The function `gpgme_get_protocol_name' returns a statically + allocated string describing the protocol PROTOCOL, or `NULL' if + the protocol number is not valid. + +* Menu: + +* Engine Version Check:: Verifying the engine version. +* Engine Information:: Obtaining more information about the engines. +* Engine Configuration:: Changing the engine configuration. +* OpenPGP:: Support for the OpenPGP protocol. +* Cryptographic Message Syntax:: Support for the CMS. + + +File: gpgme.info, Node: Engine Version Check, Next: Engine Information, Up: Protocols and Engines + +3.1 Engine Version Check +======================== + + -- Function: gpgme_error_t gpgme_engine_check_version + (gpgme_protocol_t PROTOCOL) + The function `gpgme_engine_check_version' verifies that the engine + implementing the protocol PROTOCOL is installed in the expected + path and meets the version requirement of GPGME. + + This function returns the error code `GPG_ERR_NO_ERROR' if the + engine is available and `GPG_ERR_INV_ENGINE' if it is not. + + +File: gpgme.info, Node: Engine Information, Next: Engine Configuration, Prev: Engine Version Check, Up: Protocols and Engines + +3.2 Engine Information +====================== + + -- Data type: gpgme_engine_info_t + The `gpgme_engine_info_t' type specifies a pointer to a structure + describing a crypto engine. The structure contains the following + elements: + + `gpgme_engine_info_t next' + This is a pointer to the next engine info structure in the + linked list, or `NULL' if this is the last element. + + `gpgme_protocol_t protocol' + This is the protocol for which the crypto engine is used. + You can convert this to a string with + `gpgme_get_protocol_name' for printing. + + `const char *file_name' + This is a string holding the file name of the executable of + the crypto engine. Currently, it is never `NULL', but using + `NULL' is reserved for future use, so always check before you + use it. + + `const char *home_dir' + This is a string holding the directory name of the crypto + engine's configuration directory. If it is `NULL', then the + default directory is used. + + `const char *version' + This is a string containing the version number of the crypto + engine. It might be `NULL' if the version number can not be + determined, for example because the executable doesn't exist + or is invalid. + + `const char *req_version' + This is a string containing the minimum required version + number of the crypto engine for GPGME to work correctly. + This is the version number that `gpgme_engine_check_version' + verifies against. Currently, it is never `NULL', but using + `NULL' is reserved for future use, so always check before you + use it. + + -- Function: gpgme_error_t gpgme_get_engine_info + (gpgme_engine_info_t *INFO) + The function `gpgme_get_engine_info' returns a linked list of + engine info structures in INFO. Each info structure describes the + defaults of one configured backend. + + The memory for the info structures is allocated the first time this + function is invoked, and must not be freed by the caller. + + This function returns the error code `GPG_ERR_NO_ERROR' if + successful, and a system error if the memory could not be + allocated. + + Here is an example how you can provide more diagnostics if you +receive an error message which indicates that the crypto engine is +invalid. + + gpgme_ctx_t ctx; + gpgme_error_t err; + + [...] + + if (gpgme_err_code (err) == GPG_ERR_INV_ENGINE) + { + gpgme_engine_info_t info; + err = gpgme_get_engine_info (&info); + if (!err) + { + while (info && info->protocol != gpgme_get_protocol (ctx)) + info = info->next; + if (!info) + fprintf (stderr, "GPGME compiled without support for protocol %s", + gpgme_get_protocol_name (info->protocol)); + else if (info->file_name && !info->version) + fprintf (stderr, "Engine %s not installed properly", + info->file_name); + else if (info->file_name && info->version && info->req_version) + fprintf (stderr, "Engine %s version %s installed, " + "but at least version %s required", info->file_name, + info->version, info->req_version); + else + fprintf (stderr, "Unknown problem with engine for protocol %s", + gpgme_get_protocol_name (info->protocol)); + } + } + + +File: gpgme.info, Node: Engine Configuration, Next: OpenPGP, Prev: Engine Information, Up: Protocols and Engines + +3.3 Engine Configuration +======================== + +You can change the configuration of a backend engine, and thus change +the executable program and configuration directory to be used. You can +make these changes the default or set them for some contexts +individually. + + -- Function: gpgme_error_t gpgme_set_engine_info + (gpgme_protocol_t PROTO, const char *FILE_NAME, + const char *HOME_DIR) + The function `gpgme_set_engine_info' changes the default + configuration of the crypto engine implementing the protocol PROTO. + + FILE_NAME is the file name of the executable program implementing + this protocol, and HOME_DIR is the directory name of the + configuration directory for this crypto engine. If HOME_DIR is + `NULL', the engine's default will be used. + + The new defaults are not applied to already created GPGME contexts. + + This function returns the error code `GPG_ERR_NO_ERROR' if + successful, or an eror code on failure. + + The functions `gpgme_ctx_get_engine_info' and +`gpgme_ctx_set_engine_info' can be used to change the engine +configuration per context. *Note Crypto Engine::. + + +File: gpgme.info, Node: OpenPGP, Next: Cryptographic Message Syntax, Prev: Engine Configuration, Up: Protocols and Engines + +3.4 OpenPGP +=========== + +OpenPGP is implemented by GnuPG, the GNU Privacy Guard. This is the +first protocol that was supported by GPGME. + + The OpenPGP protocol is specified by `GPGME_PROTOCOL_OpenPGP'. + + +File: gpgme.info, Node: Cryptographic Message Syntax, Prev: OpenPGP, Up: Protocols and Engines + +3.5 Cryptographic Message Syntax +================================ + +CMS is implemented by GpgSM, the S/MIME implementation for GnuPG. + + The CMS protocol is specified by `GPGME_PROTOCOL_CMS'. + + +File: gpgme.info, Node: Algorithms, Next: Error Handling, Prev: Protocols and Engines, Up: Top + +4 Algorithms +************ + +The crypto backends support a variety of algorithms used in public key +cryptography.(1) The following sections list the identifiers used to +denote such an algorithm. + +* Menu: + +* Public Key Algorithms:: A list of all public key algorithms. +* Hash Algorithms:: A list of all hash algorithms. + + ---------- Footnotes ---------- + + (1) Some engines also provide symmetric only encryption; see the +description of the encryption function on how to use this. + + +File: gpgme.info, Node: Public Key Algorithms, Next: Hash Algorithms, Up: Algorithms + +4.1 Public Key Algorithms +========================= + +Public key algorithms are used for encryption, decryption, signing and +verification of signatures. + + -- Data type: enum gpgme_pubkey_algo_t + The `gpgme_pubkey_algo_t' type specifies the set of all public key + algorithms that are supported by GPGME. Possible values are: + + `GPGME_PK_RSA' + This value indicates the RSA (Rivest, Shamir, Adleman) + algorithm. + + `GPGME_PK_RSA_E' + Deprecated. This value indicates the RSA (Rivest, Shamir, + Adleman) algorithm for encryption and decryption only. + + `GPGME_PK_RSA_S' + Deprecated. This value indicates the RSA (Rivest, Shamir, + Adleman) algorithm for signing and verification only. + + `GPGME_PK_DSA' + This value indicates DSA, the Digital Signature Algorithm. + + `GPGME_PK_ELG' + This value indicates ElGamal. + + `GPGME_PK_ELG_E' + This value also indicates ElGamal and is used specifically in + GnuPG. + + `GPGME_PK_ELG_E' + This value also indicates ElGamal and is used specifically in + GnuPG. + + `GPGME_PK_ECDSA' + This value indicates ECDSA, the Elliptic Curve Digital + Signature Algorithm as defined by FIPS 186-2. + + `GPGME_PK_ECDH' + This value indicates ECDH, the Eliptic Curve Diffie-Hellmann + encryption algorithm as defined by the ECC in OpenPGP draft. + + + -- Function: const char * gpgme_pubkey_algo_name + (gpgme_pubkey_algo_t ALGO) + The function `gpgme_pubkey_algo_name' returns a pointer to a + statically allocated string containing a description of the public + key algorithm ALGO. This string can be used to output the name of + the public key algorithm to the user. + + If ALGO is not a valid public key algorithm, `NULL' is returned. + + +File: gpgme.info, Node: Hash Algorithms, Prev: Public Key Algorithms, Up: Algorithms + +4.2 Hash Algorithms +=================== + +Hash (message digest) algorithms are used to compress a long message to +make it suitable for public key cryptography. + + -- Data type: enum gpgme_hash_algo_t + The `gpgme_hash_algo_t' type specifies the set of all hash + algorithms that are supported by GPGME. Possible values are: + + `GPGME_MD_MD5' + + `GPGME_MD_SHA1' + + `GPGME_MD_RMD160' + + `GPGME_MD_MD2' + + `GPGME_MD_TIGER' + + `GPGME_MD_HAVAL' + + `GPGME_MD_SHA256' + + `GPGME_MD_SHA384' + + `GPGME_MD_SHA512' + + `GPGME_MD_MD4' + + `GPGME_MD_CRC32' + + `GPGME_MD_CRC32_RFC1510' + + `GPGME_MD_CRC24_RFC2440' + + -- Function: const char * gpgme_hash_algo_name (gpgme_hash_algo_t ALGO) + The function `gpgme_hash_algo_name' returns a pointer to a + statically allocated string containing a description of the hash + algorithm ALGO. This string can be used to output the name of the + hash algorithm to the user. + + If ALGO is not a valid hash algorithm, `NULL' is returned. + + +File: gpgme.info, Node: Error Handling, Next: Exchanging Data, Prev: Algorithms, Up: Top + +5 Error Handling +**************** + +Many functions in GPGME can return an error if they fail. For this +reason, the application should always catch the error condition and +take appropriate measures, for example by releasing the resources and +passing the error up to the caller, or by displaying a descriptive +message to the user and cancelling the operation. + + Some error values do not indicate a system error or an error in the +operation, but the result of an operation that failed properly. For +example, if you try to decrypt a tempered message, the decryption will +fail. Another error value actually means that the end of a data buffer +or list has been reached. The following descriptions explain for many +error codes what they mean usually. Some error values have specific +meanings if returned by a certain functions. Such cases are described +in the documentation of those functions. + + GPGME uses the `libgpg-error' library. This allows to share the +error codes with other components of the GnuPG system, and thus pass +error values transparently from the crypto engine, or some helper +application of the crypto engine, to the user. This way no information +is lost. As a consequence, GPGME does not use its own identifiers for +error codes, but uses those provided by `libgpg-error'. They usually +start with `GPG_ERR_'. + + However, GPGME does provide aliases for the functions defined in +libgpg-error, which might be preferred for name space consistency. + +* Menu: + +* Error Values:: The error value and what it means. +* Error Sources:: A list of important error sources. +* Error Codes:: A list of important error codes. +* Error Strings:: How to get a descriptive string from a value. + + +File: gpgme.info, Node: Error Values, Next: Error Sources, Up: Error Handling + +5.1 Error Values +================ + + -- Data type: gpgme_err_code_t + The `gpgme_err_code_t' type is an alias for the `libgpg-error' + type `gpg_err_code_t'. The error code indicates the type of an + error, or the reason why an operation failed. + + A list of important error codes can be found in the next section. + + -- Data type: gpgme_err_source_t + The `gpgme_err_source_t' type is an alias for the `libgpg-error' + type `gpg_err_source_t'. The error source has not a precisely + defined meaning. Sometimes it is the place where the error + happened, sometimes it is the place where an error was encoded + into an error value. Usually the error source will give an + indication to where to look for the problem. This is not always + true, but it is attempted to achieve this goal. + + A list of important error sources can be found in the next section. + + -- Data type: gpgme_error_t + The `gpgme_error_t' type is an alias for the `libgpg-error' type + `gpg_error_t'. An error value like this has always two + components, an error code and an error source. Both together form + the error value. + + Thus, the error value can not be directly compared against an error + code, but the accessor functions described below must be used. + However, it is guaranteed that only 0 is used to indicate success + (`GPG_ERR_NO_ERROR'), and that in this case all other parts of the + error value are set to 0, too. + + Note that in GPGME, the error source is used purely for + diagnostical purposes. Only the error code should be checked to + test for a certain outcome of a function. The manual only + documents the error code part of an error value. The error source + is left unspecified and might be anything. + + -- Function: static inline gpgme_err_code_t gpgme_err_code + (gpgme_error_t ERR) + The static inline function `gpgme_err_code' returns the + `gpgme_err_code_t' component of the error value ERR. This + function must be used to extract the error code from an error + value in order to compare it with the `GPG_ERR_*' error code + macros. + + -- Function: static inline gpgme_err_source_t gpgme_err_source + (gpgme_error_t ERR) + The static inline function `gpgme_err_source' returns the + `gpgme_err_source_t' component of the error value ERR. This + function must be used to extract the error source from an error + value in order to compare it with the `GPG_ERR_SOURCE_*' error + source macros. + + -- Function: static inline gpgme_error_t gpgme_err_make + (gpgme_err_source_t SOURCE, gpgme_err_code_t CODE) + The static inline function `gpgme_err_make' returns the error + value consisting of the error source SOURCE and the error code + CODE. + + This function can be used in callback functions to construct an + error value to return it to the library. + + -- Function: static inline gpgme_error_t gpgme_error + (gpgme_err_code_t CODE) + The static inline function `gpgme_error' returns the error value + consisting of the default error source and the error code CODE. + + For GPGME applications, the default error source is + `GPG_ERR_SOURCE_USER_1'. You can define + `GPGME_ERR_SOURCE_DEFAULT' before including `gpgme.h' to change + this default. + + This function can be used in callback functions to construct an + error value to return it to the library. + + The `libgpg-error' library provides error codes for all system error +numbers it knows about. If ERR is an unknown error number, the error +code `GPG_ERR_UNKNOWN_ERRNO' is used. The following functions can be +used to construct error values from system errnor numbers. + + -- Function: gpgme_error_t gpgme_err_make_from_errno + (gpgme_err_source_t SOURCE, int ERR) + The function `gpgme_err_make_from_errno' is like `gpgme_err_make', + but it takes a system error like `errno' instead of a + `gpgme_err_code_t' error code. + + -- Function: gpgme_error_t gpgme_error_from_errno (int ERR) + The function `gpgme_error_from_errno' is like `gpgme_error', but + it takes a system error like `errno' instead of a + `gpgme_err_code_t' error code. + + Sometimes you might want to map system error numbers to error codes +directly, or map an error code representing a system error back to the +system error number. The following functions can be used to do that. + + -- Function: gpgme_err_code_t gpgme_err_code_from_errno (int ERR) + The function `gpgme_err_code_from_errno' returns the error code + for the system error ERR. If ERR is not a known system error, the + function returns `GPG_ERR_UNKNOWN_ERRNO'. + + -- Function: int gpgme_err_code_to_errno (gpgme_err_code_t ERR) + The function `gpgme_err_code_to_errno' returns the system error + for the error code ERR. If ERR is not an error code representing + a system error, or if this system error is not defined on this + system, the function returns `0'. + + +File: gpgme.info, Node: Error Sources, Next: Error Codes, Prev: Error Values, Up: Error Handling + +5.2 Error Sources +================= + +The library `libgpg-error' defines an error source for every component +of the GnuPG system. The error source part of an error value is not +well defined. As such it is mainly useful to improve the diagnostic +error message for the user. + + If the error code part of an error value is `0', the whole error +value will be `0'. In this case the error source part is of course +`GPG_ERR_SOURCE_UNKNOWN'. + + The list of error sources that might occur in applications using +GPGME is: + +`GPG_ERR_SOURCE_UNKNOWN' + The error source is not known. The value of this error source is + `0'. + +`GPG_ERR_SOURCE_GPGME' + The error source is GPGME itself. This is the default for errors + that occur in the GPGME library. + +`GPG_ERR_SOURCE_GPG' + The error source is GnuPG, which is the crypto engine used for the + OpenPGP protocol. + +`GPG_ERR_SOURCE_GPGSM' + The error source is GPGSM, which is the crypto engine used for the + CMS protocol. + +`GPG_ERR_SOURCE_GCRYPT' + The error source is `libgcrypt', which is used by crypto engines + to perform cryptographic operations. + +`GPG_ERR_SOURCE_GPGAGENT' + The error source is `gpg-agent', which is used by crypto engines + to perform operations with the secret key. + +`GPG_ERR_SOURCE_PINENTRY' + The error source is `pinentry', which is used by `gpg-agent' to + query the passphrase to unlock a secret key. + +`GPG_ERR_SOURCE_SCD' + The error source is the SmartCard Daemon, which is used by + `gpg-agent' to delegate operations with the secret key to a + SmartCard. + +`GPG_ERR_SOURCE_KEYBOX' + The error source is `libkbx', a library used by the crypto engines + to manage local keyrings. + +`GPG_ERR_SOURCE_USER_1' + +`GPG_ERR_SOURCE_USER_2' + +`GPG_ERR_SOURCE_USER_3' + +`GPG_ERR_SOURCE_USER_4' + These error sources are not used by any GnuPG component and can be + used by other software. For example, applications using GPGME can + use them to mark error values coming from callback handlers. Thus + `GPG_ERR_SOURCE_USER_1' is the default for errors created with + `gpgme_error' and `gpgme_error_from_errno', unless you define + `GPGME_ERR_SOURCE_DEFAULT' before including `gpgme.h'. + + +File: gpgme.info, Node: Error Codes, Next: Error Strings, Prev: Error Sources, Up: Error Handling + +5.3 Error Codes +=============== + +The library `libgpg-error' defines many error values. Most of them are +not used by `GPGME' directly, but might be returned by GPGME because it +received them from the crypto engine. The below list only includes +such error codes that have a specific meaning in `GPGME', or which are +so common that you should know about them. + +`GPG_ERR_EOF' + This value indicates the end of a list, buffer or file. + +`GPG_ERR_NO_ERROR' + This value indicates success. The value of this error code is + `0'. Also, it is guaranteed that an error value made from the + error code `0' will be `0' itself (as a whole). This means that + the error source information is lost for this error code, however, + as this error code indicates that no error occured, this is + generally not a problem. + +`GPG_ERR_GENERAL' + This value means that something went wrong, but either there is not + enough information about the problem to return a more useful error + value, or there is no separate error value for this type of + problem. + +`GPG_ERR_ENOMEM' + This value means that an out-of-memory condition occurred. + +`GPG_ERR_E...' + System errors are mapped to GPG_ERR_FOO where FOO is the symbol for + the system error. + +`GPG_ERR_INV_VALUE' + This value means that some user provided data was out of range. + This can also refer to objects. For example, if an empty + `gpgme_data_t' object was expected, but one containing data was + provided, this error value is returned. + +`GPG_ERR_UNUSABLE_PUBKEY' + This value means that some recipients for a message were invalid. + +`GPG_ERR_UNUSABLE_SECKEY' + This value means that some signers were invalid. + +`GPG_ERR_NO_DATA' + This value means that a `gpgme_data_t' object which was expected + to have content was found empty. + +`GPG_ERR_CONFLICT' + This value means that a conflict of some sort occurred. + +`GPG_ERR_NOT_IMPLEMENTED' + This value indicates that the specific function (or operation) is + not implemented. This error should never happen. It can only + occur if you use certain values or configuration options which do + not work, but for which we think that they should work at some + later time. + +`GPG_ERR_DECRYPT_FAILED' + This value indicates that a decryption operation was unsuccessful. + +`GPG_ERR_BAD_PASSPHRASE' + This value means that the user did not provide a correct passphrase + when requested. + +`GPG_ERR_CANCELED' + This value means that the operation was canceled. + +`GPG_ERR_INV_ENGINE' + This value means that the engine that implements the desired + protocol is currently not available. This can either be because + the sources were configured to exclude support for this engine, or + because the engine is not installed properly. + +`GPG_ERR_AMBIGUOUS_NAME' + This value indicates that a user ID or other specifier did not + specify a unique key. + +`GPG_ERR_WRONG_KEY_USAGE' + This value indicates that a key is not used appropriately. + +`GPG_ERR_CERT_REVOKED' + This value indicates that a key signature was revoced. + +`GPG_ERR_CERT_EXPIRED' + This value indicates that a key signature expired. + +`GPG_ERR_NO_CRL_KNOWN' + This value indicates that no certificate revocation list is known + for the certificate. + +`GPG_ERR_NO_POLICY_MATCH' + This value indicates that a policy issue occured. + +`GPG_ERR_NO_SECKEY' + This value indicates that no secret key for the user ID is + available. + +`GPG_ERR_MISSING_CERT' + This value indicates that a key could not be imported because the + issuer certificate is missing. + +`GPG_ERR_BAD_CERT_CHAIN' + This value indicates that a key could not be imported because its + certificate chain is not good, for example it could be too long. + +`GPG_ERR_UNSUPPORTED_ALGORITHM' + This value means a verification failed because the cryptographic + algorithm is not supported by the crypto backend. + +`GPG_ERR_BAD_SIGNATURE' + This value means a verification failed because the signature is + bad. + +`GPG_ERR_NO_PUBKEY' + This value means a verification failed because the public key is + not available. + +`GPG_ERR_USER_1' + +`GPG_ERR_USER_2' + +`...' + +`GPG_ERR_USER_16' + These error codes are not used by any GnuPG component and can be + freely used by other software. Applications using GPGME might use + them to mark specific errors returned by callback handlers if no + suitable error codes (including the system errors) for these + errors exist already. + + +File: gpgme.info, Node: Error Strings, Prev: Error Codes, Up: Error Handling + +5.4 Error Strings +================= + + -- Function: const char * gpgme_strerror (gpgme_error_t ERR) + The function `gpgme_strerror' returns a pointer to a statically + allocated string containing a description of the error code + contained in the error value ERR. This string can be used to + output a diagnostic message to the user. + + This function is not thread safe. Use `gpgme_strerror_r' in + multi-threaded programs. + + -- Function: int gpgme_strerror_r (gpgme_error_t ERR, char *BUF, + size_t BUFLEN) + The function `gpgme_strerror_r' returns the error string for ERR + in the user-supplied buffer BUF of size BUFLEN. This function is, + in contrast to `gpgme_strerror', thread-safe if a thread-safe + `strerror_r' function is provided by the system. If the function + succeeds, 0 is returned and BUF contains the string describing the + error. If the buffer was not large enough, ERANGE is returned and + BUF contains as much of the beginning of the error string as fits + into the buffer. + + -- Function: const char * gpgme_strsource (gpgme_error_t ERR) + The function `gpgme_strerror' returns a pointer to a statically + allocated string containing a description of the error source + contained in the error value ERR. This string can be used to + output a diagnostic message to the user. + + The following example illustrates the use of `gpgme_strerror': + + gpgme_ctx_t ctx; + gpgme_error_t err = gpgme_new (&ctx); + if (err) + { + fprintf (stderr, "%s: creating GpgME context failed: %s: %s\n", + argv[0], gpgme_strsource (err), gpgme_strerror (err)); + exit (1); + } + + +File: gpgme.info, Node: Exchanging Data, Next: Contexts, Prev: Error Handling, Up: Top + +6 Exchanging Data +***************** + +A lot of data has to be exchanged between the user and the crypto +engine, like plaintext messages, ciphertext, signatures and information +about the keys. The technical details about exchanging the data +information are completely abstracted by GPGME. The user provides and +receives the data via `gpgme_data_t' objects, regardless of the +communication protocol between GPGME and the crypto engine in use. + + -- Data type: gpgme_data_t + The `gpgme_data_t' type is a handle for a container for generic + data, which is used by GPGME to exchange data with the user. + + `gpgme_data_t' objects do not provide notifications on events. It +is assumed that read and write operations are blocking until data is +available. If this is undesirable, the application must ensure that +all GPGME data operations always have data available, for example by +using memory buffers or files rather than pipes or sockets. This might +be relevant, for example, if the external event loop mechanism is used. + +* Menu: + +* Creating Data Buffers:: Creating new data buffers. +* Destroying Data Buffers:: Releasing data buffers. +* Manipulating Data Buffers:: Operations on data buffers. + + +File: gpgme.info, Node: Creating Data Buffers, Next: Destroying Data Buffers, Up: Exchanging Data + +6.1 Creating Data Buffers +========================= + +Data objects can be based on memory, files, or callback functions +provided by the user. Not all operations are supported by all objects. + +* Menu: + +* Memory Based Data Buffers:: Creating memory based data buffers. +* File Based Data Buffers:: Creating file based data buffers. +* Callback Based Data Buffers:: Creating callback based data buffers. + + +File: gpgme.info, Node: Memory Based Data Buffers, Next: File Based Data Buffers, Up: Creating Data Buffers + +6.1.1 Memory Based Data Buffers +------------------------------- + +Memory based data objects store all data in allocated memory. This is +convenient, but only practical for an amount of data that is a fraction +of the available physical memory. The data has to be copied from its +source and to its destination, which can often be avoided by using one +of the other data object + + -- Function: gpgme_error_t gpgme_data_new (gpgme_data_t *DH) + The function `gpgme_data_new' creates a new `gpgme_data_t' object + and returns a handle for it in DH. The data object is memory + based and initially empty. + + The function returns the error code `GPG_ERR_NO_ERROR' if the data + object was successfully created, `GPG_ERR_INV_VALUE' if DH is not + a valid pointer, and `GPG_ERR_ENOMEM' if not enough memory is + available. + + -- Function: gpgme_error_t gpgme_data_new_from_mem (gpgme_data_t *DH, + const char *BUFFER, size_t SIZE, int COPY) + The function `gpgme_data_new_from_mem' creates a new + `gpgme_data_t' object and fills it with SIZE bytes starting from + BUFFER. + + If COPY is not zero, a private copy of the data is made. If COPY + is zero, the data is taken from the specified buffer as needed, + and the user has to ensure that the buffer remains valid for the + whole life span of the data object. + + The function returns the error code `GPG_ERR_NO_ERROR' if the data + object was successfully created, `GPG_ERR_INV_VALUE' if DH or + BUFFER is not a valid pointer, and `GPG_ERR_ENOMEM' if not enough + memory is available. + + -- Function: gpgme_error_t gpgme_data_new_from_file (gpgme_data_t *DH, + const char *FILENAME, int COPY) + The function `gpgme_data_new_from_file' creates a new + `gpgme_data_t' object and fills it with the content of the file + FILENAME. + + If COPY is not zero, the whole file is read in at initialization + time and the file is not used anymore after that. This is the only + mode supported currently. Later, a value of zero for COPY might + cause all reads to be delayed until the data is needed, but this is + not yet implemented. + + The function returns the error code `GPG_ERR_NO_ERROR' if the data + object was successfully created, `GPG_ERR_INV_VALUE' if DH or + FILENAME is not a valid pointer, `GPG_ERR_NOT_IMPLEMENTED' if CODE + is zero, and `GPG_ERR_ENOMEM' if not enough memory is available. + + -- Function: gpgme_error_t gpgme_data_new_from_filepart + (gpgme_data_t *DH, const char *FILENAME, FILE *FP, + off_t OFFSET, size_t LENGTH) + The function `gpgme_data_new_from_filepart' creates a new + `gpgme_data_t' object and fills it with a part of the file + specified by FILENAME or FP. + + Exactly one of FILENAME and FP must be non-zero, the other must be + zero. The argument that is not zero specifies the file from which + LENGTH bytes are read into the data object, starting from OFFSET. + + The function returns the error code `GPG_ERR_NO_ERROR' if the data + object was successfully created, `GPG_ERR_INV_VALUE' if DH and + exactly one of FILENAME and FP is not a valid pointer, and + `GPG_ERR_ENOMEM' if not enough memory is available. + + +File: gpgme.info, Node: File Based Data Buffers, Next: Callback Based Data Buffers, Prev: Memory Based Data Buffers, Up: Creating Data Buffers + +6.1.2 File Based Data Buffers +----------------------------- + +File based data objects operate directly on file descriptors or +streams. Only a small amount of data is stored in core at any time, so +the size of the data objects is not limited by GPGME. + + -- Function: gpgme_error_t gpgme_data_new_from_fd (gpgme_data_t *DH, + int FD) + The function `gpgme_data_new_from_fd' creates a new `gpgme_data_t' + object and uses the file descriptor FD to read from (if used as an + input data object) and write to (if used as an output data object). + + When using the data object as an input buffer, the function might + read a bit more from the file descriptor than is actually needed + by the crypto engine in the desired operation because of internal + buffering. + + Note that GPGME assumes that the file descriptor is set to blocking + mode. Errors during I/O operations, except for EINTR, are usually + fatal for crypto operations. + + The function returns the error code `GPG_ERR_NO_ERROR' if the data + object was successfully created, and `GPG_ERR_ENOMEM' if not + enough memory is available. + + -- Function: gpgme_error_t gpgme_data_new_from_stream + (gpgme_data_t *DH, FILE *STREAM) + The function `gpgme_data_new_from_stream' creates a new + `gpgme_data_t' object and uses the I/O stream STREAM to read from + (if used as an input data object) and write to (if used as an + output data object). + + When using the data object as an input buffer, the function might + read a bit more from the stream than is actually needed by the + crypto engine in the desired operation because of internal + buffering. + + Note that GPGME assumes that the stream is in blocking mode. + Errors during I/O operations, except for EINTR, are usually fatal + for crypto operations. + + The function returns the error code `GPG_ERR_NO_ERROR' if the data + object was successfully created, and `GPG_ERR_ENOMEM' if not + enough memory is available. + + +File: gpgme.info, Node: Callback Based Data Buffers, Prev: File Based Data Buffers, Up: Creating Data Buffers + +6.1.3 Callback Based Data Buffers +--------------------------------- + +If neither memory nor file based data objects are a good fit for your +application, you can implement the functions a data object provides +yourself and create a data object from these callback functions. + + -- Data type: ssize_t (*gpgme_data_read_cb_t) (void *HANDLE, +void *BUFFER, size_t SIZE) + The `gpgme_data_read_cb_t' type is the type of functions which + GPGME calls if it wants to read data from a user-implemented data + object. The function should read up to SIZE bytes from the + current read position into the space starting at BUFFER. The + HANDLE is provided by the user at data object creation time. + + Note that GPGME assumes that the read blocks until data is + available. Errors during I/O operations, except for EINTR, are + usually fatal for crypto operations. + + The function should return the number of bytes read, 0 on EOF, and + -1 on error. If an error occurs, ERRNO should be set to describe + the type of the error. + + -- Data type: ssize_t (*gpgme_data_write_cb_t) (void *HANDLE, +const void *BUFFER, size_t SIZE) + The `gpgme_data_write_cb_t' type is the type of functions which + GPGME calls if it wants to write data to a user-implemented data + object. The function should write up to SIZE bytes to the current + write position from the space starting at BUFFER. The HANDLE is + provided by the user at data object creation time. + + Note that GPGME assumes that the write blocks until data is + available. Errors during I/O operations, except for EINTR, are + usually fatal for crypto operations. + + The function should return the number of bytes written, and -1 on + error. If an error occurs, ERRNO should be set to describe the + type of the error. + + -- Data type: off_t (*gpgme_data_seek_cb_t) (void *HANDLE, +off_t OFFSET, int WHENCE) + The `gpgme_data_seek_cb_t' type is the type of functions which + GPGME calls if it wants to change the current read/write position + in a user-implemented data object, just like the `lseek' function. + + The function should return the new read/write position, and -1 on + error. If an error occurs, ERRNO should be set to describe the + type of the error. + + -- Data type: void (*gpgme_data_release_cb_t) (void *HANDLE) + The `gpgme_data_release_cb_t' type is the type of functions which + GPGME calls if it wants to destroy a user-implemented data object. + The HANDLE is provided by the user at data object creation time. + + -- Data type: struct gpgme_data_cbs + This structure is used to store the data callback interface + functions described above. It has the following members: + + `gpgme_data_read_cb_t read' + This is the function called by GPGME to read data from the + data object. It is only required for input data object. + + `gpgme_data_write_cb_t write' + This is the function called by GPGME to write data to the + data object. It is only required for output data object. + + `gpgme_data_seek_cb_t seek' + This is the function called by GPGME to change the current + read/write pointer in the data object (if available). It is + optional. + + `gpgme_data_release_cb_t release' + This is the function called by GPGME to release a data + object. It is optional. + + -- Function: gpgme_error_t gpgme_data_new_from_cbs (gpgme_data_t *DH, + gpgme_data_cbs_t CBS, void *HANDLE) + The function `gpgme_data_new_from_cbs' creates a new + `gpgme_data_t' object and uses the user-provided callback functions + to operate on the data object. + + The handle HANDLE is passed as first argument to the callback + functions. This can be used to identify this data object. + + The function returns the error code `GPG_ERR_NO_ERROR' if the data + object was successfully created, and `GPG_ERR_ENOMEM' if not + enough memory is available. + + The following interface is deprecated and only provided for backward +compatibility. Don't use it. It will be removed in a future version +of GPGME. + + -- Function: gpgme_error_t gpgme_data_new_with_read_cb + (gpgme_data_t *DH, int (*READFUNC) (void *HOOK, char *BUFFER, + size_t COUNT, size_t *NREAD), void *HOOK_VALUE) + The function `gpgme_data_new_with_read_cb' creates a new + `gpgme_data_t' object and uses the callback function READFUNC to + retrieve the data on demand. As the callback function can supply + the data in any way it wants, this is the most flexible data type + GPGME provides. However, it can not be used to write data. + + The callback function receives HOOK_VALUE as its first argument + whenever it is invoked. It should return up to COUNT bytes in + BUFFER, and return the number of bytes actually read in NREAD. It + may return `0' in NREAD if no data is currently available. To + indicate `EOF' the function should return with an error code of + `-1' and set NREAD to `0'. The callback function may support to + reset its internal read pointer if it is invoked with BUFFER and + NREAD being `NULL' and COUNT being `0'. + + The function returns the error code `GPG_ERR_NO_ERROR' if the data + object was successfully created, `GPG_ERR_INV_VALUE' if DH or + READFUNC is not a valid pointer, and `GPG_ERR_ENOMEM' if not + enough memory is available. + + +File: gpgme.info, Node: Destroying Data Buffers, Next: Manipulating Data Buffers, Prev: Creating Data Buffers, Up: Exchanging Data + +6.2 Destroying Data Buffers +=========================== + + -- Function: void gpgme_data_release (gpgme_data_t DH) + The function `gpgme_data_release' destroys the data object with + the handle DH. It releases all associated resources that were not + provided by the user in the first place. + + -- Function: char * gpgme_data_release_and_get_mem (gpgme_data_t DH, + size_t *LENGTH) + The function `gpgme_data_release_and_get_mem' is like + `gpgme_data_release', except that it returns the data buffer and + its length that was provided by the object. + + The user has to release the buffer with `gpgme_free'. In case the + user provided the data buffer in non-copy mode, a copy will be + made for this purpose. + + In case an error returns, or there is no suitable data buffer that + can be returned to the user, the function will return `NULL'. In + any case, the data object DH is destroyed. + + -- Function: void gpgme_free (void *BUFFER) + The function `gpgme_free' releases the memory returned by + `gpgme_data_release_and_get_mem'. It should be used instead of + the system libraries `free' function in case different allocators + are used in a single program. + + +File: gpgme.info, Node: Manipulating Data Buffers, Prev: Destroying Data Buffers, Up: Exchanging Data + +6.3 Manipulating Data Buffers +============================= + +Data buffers contain data and meta-data. The following operations can +be used to manipulate both. + +* Menu: + +* Data Buffer I/O Operations:: I/O operations on data buffers. +* Data Buffer Meta-Data:: Meta-data manipulation of data buffers. + + +File: gpgme.info, Node: Data Buffer I/O Operations, Next: Data Buffer Meta-Data, Up: Manipulating Data Buffers + +6.3.1 Data Buffer I/O Operations +-------------------------------- + + -- Function: ssize_t gpgme_data_read (gpgme_data_t DH, void *BUFFER, + size_t LENGTH) + The function `gpgme_data_read' reads up to LENGTH bytes from the + data object with the handle DH into the space starting at BUFFER. + + If no error occurs, the actual amount read is returned. If the + end of the data object is reached, the function returns 0. + + In all other cases, the function returns -1 and sets ERRNO. + + -- Function: ssize_t gpgme_data_write (gpgme_data_t DH, + const void *BUFFER, size_t SIZE) + The function `gpgme_data_write' writes up to SIZE bytes starting + from BUFFER into the data object with the handle DH at the current + write position. + + The function returns the number of bytes actually written, or -1 + if an error occurs. If an error occurs, ERRNO is set. + + -- Function: off_t gpgme_data_seek (gpgme_data_t DH, off_t OFFSET, + int WHENCE) + The function `gpgme_data_seek' changes the current read/write + position. + + The WHENCE argument specifies how the OFFSET should be + interpreted. It must be one of the following symbolic constants: + + `SEEK_SET' + Specifies that OFFSET is a count of characters from the + beginning of the data object. + + `SEEK_CUR' + Specifies that OFFSET is a count of characters from the + current file position. This count may be positive or + negative. + + `SEEK_END' + Specifies that OFFSET is a count of characters from the end of + the data object. A negative count specifies a position + within the current extent of the data object; a positive + count specifies a position past the current end. If you set + the position past the current end, and actually write data, + you will extend the data object with zeros up to that + position. + + If successful, the function returns the resulting file position, + measured in bytes from the beginning of the data object. You can + use this feature together with `SEEK_CUR' to read the current + read/write position. + + If the function fails, -1 is returned and ERRNO is set. + + The following function is deprecated and should not be used. It will +be removed in a future version of GPGME. + + -- Function: gpgme_error_t gpgme_data_rewind (gpgme_data_t DH) + The function `gpgme_data_rewind' is equivalent to: + + return (gpgme_data_seek (dh, 0, SEEK_SET) == -1) + ? gpgme_error_from_errno (errno) : 0; + + +File: gpgme.info, Node: Data Buffer Meta-Data, Prev: Data Buffer I/O Operations, Up: Manipulating Data Buffers + +6.3.2 Data Buffer Meta-Data +--------------------------- + + -- Function: char * gpgme_data_get_file_name (gpgme_data_t DH) + The function `gpgme_data_get_file_name' returns a pointer to a + string containing the file name associated with the data object. + The file name will be stored in the output when encrypting or + signing the data and will be returned to the user when decrypting + or verifying the output data. + + If no error occurs, the string containing the file name is + returned. Otherwise, `NULL' will be returned. + + -- Function: gpgme_error_t gpgme_data_set_file_name (gpgme_data_t DH, + const char *FILE_NAME) + The function `gpgme_data_set_file_name' sets the file name + associated with the data object. The file name will be stored in + the output when encrypting or signing the data and will be + returned to the user when decrypting or verifying the output data. + + The function returns the error code `GPG_ERR_INV_VALUE' if DH is + not a valid pointer and `GPG_ERR_ENOMEM' if not enough memory is + available. + + -- Data type: enum gpgme_data_encoding_t + The `gpgme_data_encoding_t' type specifies the encoding of a + `gpgme_data_t' object. For input data objects, the encoding is + useful to give the backend a hint on the type of data. For output + data objects, the encoding can specify the output data format on + certain operations. Please note that not all backends support all + encodings on all operations. The following data types are + available: + + `GPGME_DATA_ENCODING_NONE' + This specifies that the encoding is not known. This is the + default for a new data object. The backend will try its best + to detect the encoding automatically. + + `GPGME_DATA_ENCODING_BINARY' + This specifies that the data is encoding in binary form; i.e. + there is no special encoding. + + `GPGME_DATA_ENCODING_BASE64' + This specifies that the data is encoded using the Base-64 + encoding scheme as used by MIME and other protocols. + + `GPGME_DATA_ENCODING_ARMOR' + This specifies that the data is encoded in an armored form as + used by OpenPGP and PEM. + + `GPGME_DATA_ENCODING_URL' + The data is a list of linefeed delimited URLs. This is only + useful with `gpgme_op_import'. + + `GPGME_DATA_ENCODING_URL0' + The data is a list of binary zero delimited URLs. This is + only useful with `gpgme_op_import'. + + `GPGME_DATA_ENCODING_URLESC' + The data is a list of linefeed delimited URLs with all + control and space characters percent escaped. This mode is + is not yet implemented. + + + -- Function: gpgme_data_encoding_t gpgme_data_get_encoding + (gpgme_data_t DH) + The function `gpgme_data_get_encoding' returns the encoding of the + data object with the handle DH. If DH is not a valid pointer + (e.g. `NULL') `GPGME_DATA_ENCODING_NONE' is returned. + + -- Function: gpgme_error_t gpgme_data_set_encoding + (gpgme_data_t DH, gpgme_data_encoding_t ENC) + The function `gpgme_data_set_encoding' changes the encoding of the + data object with the handle DH to ENC. + + +File: gpgme.info, Node: Contexts, Next: UI Server Protocol, Prev: Exchanging Data, Up: Top + +7 Contexts +********** + +All cryptographic operations in GPGME are performed within a context, +which contains the internal state of the operation as well as +configuration parameters. By using several contexts you can run +several cryptographic operations in parallel, with different +configuration. + + -- Data type: gpgme_ctx_t + The `gpgme_ctx_t' type is a handle for a GPGME context, which is + used to hold the configuration, status and result of cryptographic + operations. + +* Menu: + +* Creating Contexts:: Creating new GPGME contexts. +* Destroying Contexts:: Releasing GPGME contexts. +* Result Management:: Managing the result of crypto operations. +* Context Attributes:: Setting properties of a context. +* Key Management:: Managing keys with GPGME. +* Trust Item Management:: Managing trust items with GPGME. +* Crypto Operations:: Using a context for cryptography. +* Run Control:: Controlling how operations are run. + + +File: gpgme.info, Node: Creating Contexts, Next: Destroying Contexts, Up: Contexts + +7.1 Creating Contexts +===================== + + -- Function: gpgme_error_t gpgme_new (gpgme_ctx_t *CTX) + The function `gpgme_new' creates a new `gpgme_ctx_t' object and + returns a handle for it in CTX. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + context was successfully created, `GPG_ERR_INV_VALUE' if CTX is + not a valid pointer, and `GPG_ERR_ENOMEM' if not enough memory is + available. Also, it returns `GPG_ERR_NOT_OPERATIONAL' if + `gpgme_check_version' was not called to initialize GPGME, and + `GPG_ERR_SELFTEST_FAILED' if a selftest failed. Currently, the + only selftest is for Windows MingW32 targets to see if + `-mms-bitfields' was used (as required). + + +File: gpgme.info, Node: Destroying Contexts, Next: Result Management, Prev: Creating Contexts, Up: Contexts + +7.2 Destroying Contexts +======================= + + -- Function: void gpgme_release (gpgme_ctx_t CTX) + The function `gpgme_release' destroys the context with the handle + CTX and releases all associated resources. + + +File: gpgme.info, Node: Result Management, Next: Context Attributes, Prev: Destroying Contexts, Up: Contexts + +7.3 Result Management +===================== + +The detailed result of an operation is returned in operation-specific +structures such as `gpgme_decrypt_result_t'. The corresponding +retrieval functions such as `gpgme_op_decrypt_result' provide static +access to the results after an operation completes. The following +interfaces make it possible to detach a result structure from its +associated context and give it a lifetime beyond that of the current +operation or context. + + -- Function: void gpgme_result_ref (void *RESULT) + The function `gpgme_result_ref' acquires an additional reference + for the result RESULT, which may be of any type + `gpgme_*_result_t'. As long as the user holds a reference, the + result structure is guaranteed to be valid and unmodified. + + -- Function: void gpgme_result_unref (void *RESULT) + The function `gpgme_result_unref' releases a reference for the + result RESULT. If this was the last reference, the result + structure will be destroyed and all resources associated to it + will be released. + + Note that a context may hold its own references to result structures, +typically until the context is destroyed or the next operation is +started. In fact, these references are accessed through the +`gpgme_op_*_result' functions. + + +File: gpgme.info, Node: Context Attributes, Next: Key Management, Prev: Result Management, Up: Contexts + +7.4 Context Attributes +====================== + +* Menu: + +* Protocol Selection:: Selecting the protocol used by a context. +* Crypto Engine:: Configuring the crypto engine. +* ASCII Armor:: Requesting ASCII armored output. +* Text Mode:: Choosing canonical text mode. +* Included Certificates:: Including a number of certificates. +* Key Listing Mode:: Selecting key listing mode. +* Passphrase Callback:: Getting the passphrase from the user. +* Progress Meter Callback:: Being informed about the progress. +* Locale:: Setting the locale of a context. + + +File: gpgme.info, Node: Protocol Selection, Next: Crypto Engine, Up: Context Attributes + +7.4.1 Protocol Selection +------------------------ + + -- Function: gpgme_error_t gpgme_set_protocol (gpgme_ctx_t CTX, + gpgme_protocol_t PROTO) + The function `gpgme_set_protocol' sets the protocol used within + the context CTX to PROTO. All crypto operations will be performed + by the crypto engine configured for that protocol. *Note + Protocols and Engines::. + + Setting the protocol with `gpgme_set_protocol' does not check if + the crypto engine for that protocol is available and installed + correctly. *Note Engine Version Check::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + protocol could be set successfully, and `GPG_ERR_INV_VALUE' if + PROTOCOL is not a valid protocol. + + -- Function: gpgme_protocol_t gpgme_get_protocol (gpgme_ctx_t CTX) + The function `gpgme_get_protocol' retrieves the protocol currently + use with the context CTX. + + +File: gpgme.info, Node: Crypto Engine, Next: ASCII Armor, Prev: Protocol Selection, Up: Context Attributes + +7.4.2 Crypto Engine +------------------- + +The following functions can be used to set and retrieve the +configuration of the crypto engines of a specific context. The default +can also be retrieved without any particular context. *Note Engine +Information::. The default can also be changed globally. *Note Engine +Configuration::. + + -- Function: gpgme_engine_info_t gpgme_ctx_get_engine_info + (gpgme_ctx_t CTX) + The function `gpgme_ctx_get_engine_info' returns a linked list of + engine info structures. Each info structure describes the + configuration of one configured backend, as used by the context + CTX. + + The result is valid until the next invocation of + `gpgme_ctx_set_engine_info' for this particular context. + + This function can not fail. + + -- Function: gpgme_error_t gpgme_ctx_set_engine_info (gpgme_ctx_t CTX, + gpgme_protocol_t PROTO, const char *FILE_NAME, + const char *HOME_DIR) + The function `gpgme_ctx_set_engine_info' changes the configuration + of the crypto engine implementing the protocol PROTO for the + context CTX. + + FILE_NAME is the file name of the executable program implementing + this protocol, and HOME_DIR is the directory name of the + configuration directory for this crypto engine. If HOME_DIR is + `NULL', the engine's default will be used. + + Currently this function must be used before starting the first + crypto operation. It is unspecified if and when the changes will + take effect if the function is called after starting the first + operation on the context CTX. + + This function returns the error code `GPG_ERR_NO_ERROR' if + successful, or an eror code on failure. + + +File: gpgme.info, Node: ASCII Armor, Next: Text Mode, Prev: Crypto Engine, Up: Context Attributes + +7.4.3 ASCII Armor +----------------- + + -- Function: void gpgme_set_armor (gpgme_ctx_t CTX, int YES) + The function `gpgme_set_armor' specifies if the output should be + ASCII armored. By default, output is not ASCII armored. + + ASCII armored output is disabled if YES is zero, and enabled + otherwise. + + -- Function: int gpgme_get_armor (gpgme_ctx_t CTX) + The function `gpgme_get_armor' returns 1 if the output is ASCII + armored, and `0' if it is not, or if CTX is not a valid pointer. + + +File: gpgme.info, Node: Text Mode, Next: Included Certificates, Prev: ASCII Armor, Up: Context Attributes + +7.4.4 Text Mode +--------------- + + -- Function: void gpgme_set_textmode (gpgme_ctx_t CTX, int YES) + The function `gpgme_set_textmode' specifies if canonical text mode + should be used. By default, text mode is not used. + + Text mode is for example used for the RFC2015 signatures; note that + the updated RFC 3156 mandates that the mail user agent does some + preparations so that text mode is not needed anymore. + + This option is only relevant to the OpenPGP crypto engine, and + ignored by all other engines. + + Canonical text mode is disabled if YES is zero, and enabled + otherwise. + + -- Function: int gpgme_get_textmode (gpgme_ctx_t CTX) + The function `gpgme_get_textmode' returns 1 if canonical text mode + is enabled, and `0' if it is not, or if CTX is not a valid pointer. + + +File: gpgme.info, Node: Included Certificates, Next: Key Listing Mode, Prev: Text Mode, Up: Context Attributes + +7.4.5 Included Certificates +--------------------------- + + -- Function: void gpgme_set_include_certs (gpgme_ctx_t CTX, + int NR_OF_CERTS) + The function `gpgme_set_include_certs' specifies how many + certificates should be included in an S/MIME signed message. By + default, only the sender's certificate is included. The possible + values of NR_OF_CERTS are: + + `GPGME_INCLUDE_CERTS_DEFAULT' + Fall back to the default of the crypto backend. This is the + default for GPGME. + + `-2' + Include all certificates except the root certificate. + + `-1' + Include all certificates. + + `0' + Include no certificates. + + `1' + Include the sender's certificate only. + + `n' + Include the first n certificates of the certificates path, + starting from the sender's certificate. The number `n' must + be positive. + + Values of NR_OF_CERTS smaller than -2 are undefined. + + This option is only relevant to the CMS crypto engine, and ignored + by all other engines. + + -- Function: int gpgme_get_include_certs (gpgme_ctx_t CTX) + The function `gpgme_get_include_certs' returns the number of + certificates to include into an S/MIME signed message. + + +File: gpgme.info, Node: Key Listing Mode, Next: Passphrase Callback, Prev: Included Certificates, Up: Context Attributes + +7.4.6 Key Listing Mode +---------------------- + + -- Function: gpgme_error_t gpgme_set_keylist_mode (gpgme_ctx_t CTX, + gpgme_keylist_mode_t MODE) + The function `gpgme_set_keylist_mode' changes the default + behaviour of the key listing functions. The value in MODE is a + bitwise-or combination of one or multiple of the following bit + values: + + `GPGME_KEYLIST_MODE_LOCAL' + The `GPGME_KEYLIST_MODE_LOCAL' symbol specifies that the local + keyring should be searched for keys in the keylisting + operation. This is the default. + + `GPGME_KEYLIST_MODE_EXTERN' + The `GPGME_KEYLIST_MODE_EXTERN' symbol specifies that an + external source should be searched for keys in the keylisting + operation. The type of external source is dependant on the + crypto engine used and whether it is combined with + `GPGME_KEYLIST_MODE_LOCAL'. For example, it can be a remote + keyserver or LDAP certificate server. + + `GPGME_KEYLIST_MODE_SIGS' + The `GPGME_KEYLIST_MODE_SIGS' symbol specifies that the key + signatures should be included in the listed keys. + + `GPGME_KEYLIST_MODE_SIG_NOTATIONS' + The `GPGME_KEYLIST_MODE_SIG_NOTATIONS' symbol specifies that + the signature notations on key signatures should be included + in the listed keys. This only works if + `GPGME_KEYLIST_MODE_SIGS' is also enabled. + + `GPGME_KEYLIST_MODE_EPHEMERAL' + The `GPGME_KEYLIST_MODE_EPHEMERAL' symbol specifies that keys + flagged as ephemeral are included in the listing. + + `GPGME_KEYLIST_MODE_VALIDATE' + The `GPGME_KEYLIST_MODE_VALIDATE' symbol specifies that the + backend should do key or certificate validation and not just + get the validity information from an internal cache. This + might be an expensive operation and is in general not useful. + Currently only implemented for the S/MIME backend and ignored + for other backends. + + + At least one of `GPGME_KEYLIST_MODE_LOCAL' and + `GPGME_KEYLIST_MODE_EXTERN' must be specified. For future binary + compatibility, you should get the current mode with + `gpgme_get_keylist_mode' and modify it by setting or clearing the + appropriate bits, and then using that calculated value in the + `gpgme_set_keylisting_mode' operation. This will leave all other + bits in the mode value intact (in particular those that are not + used in the current version of the library). + + The function returns the error code `GPG_ERR_NO_ERROR' if the mode + could be set correctly, and `GPG_ERR_INV_VALUE' if CTX is not a + valid pointer or MODE is not a valid mode. + + -- Function: gpgme_keylist_mode_t gpgme_get_keylist_mode + (gpgme_ctx_t CTX) + The function `gpgme_get_keylist_mode' returns the current key + listing mode of the context CTX. This value can then be modified + and used in a subsequent `gpgme_set_keylist_mode' operation to + only affect the desired bits (and leave all others intact). + + The function returns 0 if CTX is not a valid pointer, and the + current mode otherwise. Note that 0 is not a valid mode value. + + +File: gpgme.info, Node: Passphrase Callback, Next: Progress Meter Callback, Prev: Key Listing Mode, Up: Context Attributes + +7.4.7 Passphrase Callback +------------------------- + + -- Data type: gpgme_error_t (*gpgme_passphrase_cb_t)(void *HOOK, const +char *UID_HINT, const char *PASSPHRASE_INFO, int PREV_WAS_BAD, int FD) + The `gpgme_passphrase_cb_t' type is the type of functions usable as + passphrase callback function. + + The argument UID_HINT might contain a string that gives an + indication for which user ID the passphrase is required. If this + is not available, or not applicable (in the case of symmetric + encryption, for example), UID_HINT will be `NULL'. + + The argument PASSPHRASE_INFO, if not `NULL', will give further + information about the context in which the passphrase is required. + This information is engine and operation specific. + + If this is the repeated attempt to get the passphrase, because + previous attempts failed, then PREV_WAS_BAD is 1, otherwise it + will be 0. + + The user must write the passphrase, followed by a newline + character, to the file descriptor FD. If the user returns 0 + indicating success, the user must at least write a newline + character before returning from the callback. + + If an error occurs, return the corresponding `gpgme_error_t' + value. You can use the error code `GPG_ERR_CANCELED' to abort the + operation. Otherwise, return `0'. + + -- Function: void gpgme_set_passphrase_cb (gpgme_ctx_t CTX, + gpgme_passphrase_cb_t PASSFUNC, void *HOOK_VALUE) + The function `gpgme_set_passphrase_cb' sets the function that is + used when a passphrase needs to be provided by the user to + PASSFUNC. The function PASSFUNC needs to implemented by the user, + and whenever it is called, it is called with its first argument + being HOOK_VALUE. By default, no passphrase callback function is + set. + + Not all crypto engines require this callback to retrieve the + passphrase. It is better if the engine retrieves the passphrase + from a trusted agent (a daemon process), rather than having each + user to implement their own passphrase query. Some engines do not + even support an external passphrase callback at all, in this case + the error code `GPG_ERR_NOT_SUPPORTED' is returned. + + The user can disable the use of a passphrase callback function by + calling `gpgme_set_passphrase_cb' with PASSFUNC being `NULL'. + + -- Function: void gpgme_get_passphrase_cb (gpgme_ctx_t CTX, + gpgme_passphrase_cb_t *PASSFUNC, void **HOOK_VALUE) + The function `gpgme_get_passphrase_cb' returns the function that + is used when a passphrase needs to be provided by the user in + *PASSFUNC, and the first argument for this function in + *HOOK_VALUE. If no passphrase callback is set, or CTX is not a + valid pointer, `NULL' is returned in both variables. + + PASSFUNC or HOOK_VALUE can be `NULL'. In this case, the + corresponding value will not be returned. + + +File: gpgme.info, Node: Progress Meter Callback, Next: Locale, Prev: Passphrase Callback, Up: Context Attributes + +7.4.8 Progress Meter Callback +----------------------------- + + -- Data type: void (*gpgme_progress_cb_t)(void *HOOK, const char +*WHAT, int TYPE, int CURRENT, int TOTAL) + The `gpgme_progress_cb_t' type is the type of functions usable as + progress callback function. + + The arguments are specific to the crypto engine. More information + about the progress information returned from the GnuPG engine can + be found in the GnuPG source code in the file `doc/DETAILS' in the + section PROGRESS. + + -- Function: void gpgme_set_progress_cb (gpgme_ctx_t CTX, + gpgme_progress_cb_t PROGFUNC, void *HOOK_VALUE) + The function `gpgme_set_progress_cb' sets the function that is + used when progress information about a cryptographic operation is + available. The function PROGFUNC needs to implemented by the + user, and whenever it is called, it is called with its first + argument being HOOK_VALUE. By default, no progress callback + function is set. + + Setting a callback function allows an interactive program to + display progress information about a long operation to the user. + + The user can disable the use of a progress callback function by + calling `gpgme_set_progress_cb' with PROGFUNC being `NULL'. + + -- Function: void gpgme_get_progress_cb (gpgme_ctx_t CTX, + gpgme_progress_cb_t *PROGFUNC, void **HOOK_VALUE) + The function `gpgme_get_progress_cb' returns the function that is + used to inform the user about the progress made in *PROGFUNC, and + the first argument for this function in *HOOK_VALUE. If no + progress callback is set, or CTX is not a valid pointer, `NULL' is + returned in both variables. + + PROGFUNC or HOOK_VALUE can be `NULL'. In this case, the + corresponding value will not be returned. + + +File: gpgme.info, Node: Locale, Prev: Progress Meter Callback, Up: Context Attributes + +7.4.9 Locale +------------ + +A locale setting can be associated with a context. This locale is +passed to the crypto engine, and used for applications like the PIN +entry, which is displayed to the user when entering a passphrase is +required. + + The default locale is used to initialize the locale setting of all +contexts created afterwards. + + -- Function: gpgme_error_t gpgme_set_locale (gpgme_ctx_t CTX, + int CATEGORY, const char *VALUE) + The function `gpgme_set_locale' sets the locale of the context + CTX, or the default locale if CTX is a null pointer. + + The locale settings that should be changed are specified by + CATEGORY. Supported categories are `LC_CTYPE', `LC_MESSAGES', and + `LC_ALL', which is a wildcard you can use if you want to change + all the categories at once. + + The value to be used for the locale setting is VALUE, which will + be copied to GPGME's internal data structures. VALUE can be a + null pointer, which disables setting the locale, and will make PIN + entry and other applications use their default setting, which is + usually not what you want. + + Note that the settings are only used if the application runs on a + text terminal, and that the settings should fit the configuration + of the output terminal. Normally, it is sufficient to initialize + the default value at startup. + + The function returns an error if not enough memory is available. + + +File: gpgme.info, Node: Key Management, Next: Trust Item Management, Prev: Context Attributes, Up: Contexts + +7.5 Key Management +================== + +Some of the cryptographic operations require that recipients or signers +are specified. This is always done by specifying the respective keys +that should be used for the operation. The following section describes +how such keys can be selected and manipulated. + + -- Data type: gpgme_sub_key_t + The `gpgme_sub_key_t' type is a pointer to a subkey structure. + Sub keys are one component of a `gpgme_key_t' object. In fact, + subkeys are those parts that contains the real information about + the individual cryptographic keys that belong to the same key + object. One `gpgme_key_t' can contain several subkeys. The first + subkey in the linked list is also called the primary key. + + The subkey structure has the following members: + + `gpgme_sub_key_t next' + This is a pointer to the next subkey structure in the linked + list, or `NULL' if this is the last element. + + `unsigned int revoked : 1' + This is true if the subkey is revoked. + + `unsigned int expired : 1' + This is true if the subkey is expired. + + `unsigned int disabled : 1' + This is true if the subkey is disabled. + + `unsigned int invalid : 1' + This is true if the subkey is invalid. + + `unsigned int can_encrypt : 1' + This is true if the subkey can be used for encryption. + + `unsigned int can_sign : 1' + This is true if the subkey can be used to create data + signatures. + + `unsigned int can_certify : 1' + This is true if the subkey can be used to create key + certificates. + + `unsigned int can_authenticate : 1' + This is true if the subkey can be used for authentication. + + `unsigned int is_qualified : 1' + This is true if the subkey can be used for qualified + signatures according to local government regulations. + + `unsigned int secret : 1' + This is true if the subkey is a secret key. Note that it + will be false if the key is actually a stub key; i.e. a + secret key operation is currently not possible (offline-key). + + `gpgme_pubkey_algo_t pubkey_algo' + This is the public key algorithm supported by this subkey. + + `unsigned int length' + This is the length of the subkey (in bits). + + `char *keyid' + This is the key ID of the subkey in hexadecimal digits. + + `char *fpr' + This is the fingerprint of the subkey in hexadecimal digits, + if available. + + `long int timestamp' + This is the creation timestamp of the subkey. This is -1 if + the timestamp is invalid, and 0 if it is not available. + + `long int expires' + This is the expiration timestamp of the subkey, or 0 if the + subkey does not expire. + + -- Data type: gpgme_key_sig_t + The `gpgme_key_sig_t' type is a pointer to a key signature + structure. Key signatures are one component of a `gpgme_key_t' + object, and validate user IDs on the key. + + The signatures on a key are only available if the key was retrieved + via a listing operation with the `GPGME_KEYLIST_MODE_SIGS' mode + enabled, because it can be expensive to retrieve all signatures of + a key. + + The signature notations on a key signature are only available if + the key was retrieved via a listing operation with the + `GPGME_KEYLIST_MODE_SIG_NOTATIONS' mode enabled, because it can be + expensive to retrieve all signature notations. + + The key signature structure has the following members: + + `gpgme_key_sig_t next' + This is a pointer to the next key signature structure in the + linked list, or `NULL' if this is the last element. + + `unsigned int revoked : 1' + This is true if the key signature is a revocation signature. + + `unsigned int expired : 1' + This is true if the key signature is expired. + + `unsigned int invalid : 1' + This is true if the key signature is invalid. + + `unsigned int exportable : 1' + This is true if the key signature is exportable. + + `gpgme_pubkey_algo_t pubkey_algo' + This is the public key algorithm used to create the signature. + + `char *keyid' + This is the key ID of the key (in hexadecimal digits) used to + create the signature. + + `long int timestamp' + This is the creation timestamp of the key signature. This is + -1 if the timestamp is invalid, and 0 if it is not available. + + `long int expires' + This is the expiration timestamp of the key signature, or 0 + if the key signature does not expire. + + `gpgme_error_t status' + This is the status of the signature and has the same meaning + as the member of the same name in a `gpgme_signature_t' + object. + + `unsigned int sig_class' + This specifies the signature class of the key signature. The + meaning is specific to the crypto engine. + + `char *uid' + This is the main user ID of the key used to create the + signature. + + `char *name' + This is the name component of `uid', if available. + + `char *comment' + This is the comment component of `uid', if available. + + `char *email' + This is the email component of `uid', if available. + + `gpgme_sig_notation_t notations' + This is a linked list with the notation data and policy URLs. + + -- Data type: gpgme_user_id_t + A user ID is a component of a `gpgme_key_t' object. One key can + have many user IDs. The first one in the list is the main (or + primary) user ID. + + The user ID structure has the following members. + + `gpgme_user_id_t next' + This is a pointer to the next user ID structure in the linked + list, or `NULL' if this is the last element. + + `unsigned int revoked : 1' + This is true if the user ID is revoked. + + `unsigned int invalid : 1' + This is true if the user ID is invalid. + + `gpgme_validity_t validity' + This specifies the validity of the user ID. + + `char *uid' + This is the user ID string. + + `char *name' + This is the name component of `uid', if available. + + `char *comment' + This is the comment component of `uid', if available. + + `char *email' + This is the email component of `uid', if available. + + `gpgme_key_sig_t signatures' + This is a linked list with the signatures on this user ID. + + -- Data type: gpgme_key_t + The `gpgme_key_t' type is a pointer to a key object. It has the + following members: + + `gpgme_keylist_mode_t keylist_mode' + The keylist mode that was active when the key was retrieved. + + `unsigned int revoked : 1' + This is true if the key is revoked. + + `unsigned int expired : 1' + This is true if the key is expired. + + `unsigned int disabled : 1' + This is true if the key is disabled. + + `unsigned int invalid : 1' + This is true if the key is invalid. This might have several + reasons, for a example for the S/MIME backend, it will be set + in during key listsing if the key could not be validated due + to a missing certificates or unmatched policies. + + `unsigned int can_encrypt : 1' + This is true if the key (ie one of its subkeys) can be used + for encryption. + + `unsigned int can_sign : 1' + This is true if the key (ie one of its subkeys) can be used + to create data signatures. + + `unsigned int can_certify : 1' + This is true if the key (ie one of its subkeys) can be used + to create key certificates. + + `unsigned int can_authenticate : 1' + This is true if the key (ie one of its subkeys) can be used + for authentication. + + `unsigned int is_qualified : 1' + This is true if the key can be used for qualified signatures + according to local government regulations. + + `unsigned int secret : 1' + This is true if the key is a secret key. Note, that this + will always be true even if the corresponding subkey flag may + be false (offline/stub keys). + + `gpgme_protocol_t protocol' + This is the protocol supported by this key. + + `char *issuer_serial' + If `protocol' is `GPGME_PROTOCOL_CMS', then this is the + issuer serial. + + `char *issuer_name' + If `protocol' is `GPGME_PROTOCOL_CMS', then this is the + issuer name. + + `char *chain_id' + If `protocol' is `GPGME_PROTOCOL_CMS', then this is the chain + ID, which can be used to built the certificate chain. + + `gpgme_validity_t owner_trust' + If `protocol' is `GPGME_PROTOCOL_OpenPGP', then this is the + owner trust. + + `gpgme_sub_key_t subkeys' + This is a linked list with the subkeys of the key. The first + subkey in the list is the primary key and usually available. + + `gpgme_user_id_t uids' + This is a linked list with the user IDs of the key. The + first user ID in the list is the main (or primary) user ID. + +* Menu: + +* Listing Keys:: Browsing the list of available keys. +* Information About Keys:: Requesting detailed information about keys. +* Key Signatures:: Listing the signatures on a key. +* Manipulating Keys:: Operations on keys. +* Generating Keys:: Creating new key pairs. +* Exporting Keys:: Retrieving key data from the key ring. +* Importing Keys:: Adding keys to the key ring. +* Deleting Keys:: Removing keys from the key ring. +* Changing Passphrases:: Change the passphrase of a key. +* Advanced Key Editing:: Advanced key edit operation. + + +File: gpgme.info, Node: Listing Keys, Next: Information About Keys, Up: Key Management + +7.5.1 Listing Keys +------------------ + + -- Function: gpgme_error_t gpgme_op_keylist_start (gpgme_ctx_t CTX, + const char *PATTERN, int SECRET_ONLY) + The function `gpgme_op_keylist_start' initiates a key listing + operation inside the context CTX. It sets everything up so that + subsequent invocations of `gpgme_op_keylist_next' return the keys + in the list. + + If PATTERN is `NULL', all available keys are returned. Otherwise, + PATTERN contains an engine specific expression that is used to + limit the list to all keys matching the pattern. Note that the + total length of the pattern is restricted to an engine-specific + maximum (a couple of hundred characters are usually accepted). The + pattern should be used to restrict the search to a certain common + name or user, not to list many specific keys at once by listing + their fingerprints or key IDs. + + If SECRET_ONLY is not `0', the list is restricted to secret keys + only. + + The context will be busy until either all keys are received (and + `gpgme_op_keylist_next' returns `GPG_ERR_EOF'), or + `gpgme_op_keylist_end' is called to finish the operation. + + The function returns the error code `GPG_ERR_INV_VALUE' if CTX is + not a valid pointer, and passes through any errors that are + reported by the crypto engine support routines. + + -- Function: gpgme_error_t gpgme_op_keylist_ext_start + (gpgme_ctx_t CTX, const char *PATTERN[], int SECRET_ONLY, + int RESERVED) + The function `gpgme_op_keylist_ext_start' initiates an extended + key listing operation inside the context CTX. It sets everything + up so that subsequent invocations of `gpgme_op_keylist_next' + return the keys in the list. + + If PATTERN or *PATTERN is `NULL', all available keys are returned. + Otherwise, PATTERN is a `NULL' terminated array of strings that + are used to limit the list to all keys matching at least one of + the patterns verbatim. Note that the total length of all patterns + is restricted to an engine-specific maximum (the exact limit also + depends on the number of patterns and amount of quoting required, + but a couple of hundred characters are usually accepted). + Patterns should be used to restrict the search to a certain common + name or user, not to list many specific keys at once by listing + their fingerprints or key IDs. + + If SECRET_ONLY is not `0', the list is restricted to secret keys + only. + + The value of RESERVED must be `0'. + + The context will be busy until either all keys are received (and + `gpgme_op_keylist_next' returns `GPG_ERR_EOF'), or + `gpgme_op_keylist_end' is called to finish the operation. + + The function returns the error code `GPG_ERR_INV_VALUE' if CTX is + not a valid pointer, and passes through any errors that are + reported by the crypto engine support routines. + + -- Function: gpgme_error_t gpgme_op_keylist_next (gpgme_ctx_t CTX, + gpgme_key_t *R_KEY) + The function `gpgme_op_keylist_next' returns the next key in the + list created by a previous `gpgme_op_keylist_start' operation in + the context CTX. The key will have one reference for the user. + *Note Manipulating Keys::. + + This is the only way to get at `gpgme_key_t' objects in GPGME. + + If the last key in the list has already been returned, + `gpgme_op_keylist_next' returns `GPG_ERR_EOF'. + + The function returns the error code `GPG_ERR_INV_VALUE' if CTX or + R_KEY is not a valid pointer, and `GPG_ERR_ENOMEM' if there is not + enough memory for the operation. + + -- Function: gpgme_error_t gpgme_op_keylist_end (gpgme_ctx_t CTX) + The function `gpgme_op_keylist_end' ends a pending key list + operation in the context CTX. + + After the operation completed successfully, the result of the key + listing operation can be retrieved with `gpgme_op_keylist_result'. + + The function returns the error code `GPG_ERR_INV_VALUE' if CTX is + not a valid pointer, and `GPG_ERR_ENOMEM' if at some time during + the operation there was not enough memory available. + + The following example illustrates how all keys containing a certain +string (`g10code') can be listed with their key ID and the name and +e-mail address of the main user ID: + + gpgme_ctx_t ctx; + gpgme_key_t key; + gpgme_error_t err = gpgme_new (&ctx); + + if (!err) + { + err = gpgme_op_keylist_start (ctx, "g10code", 0); + while (!err) + { + err = gpgme_op_keylist_next (ctx, &key); + if (err) + break; + printf ("%s:", key->subkeys->keyid); + if (key->uids && key->uids->name) + printf (" %s", key->uids->name); + if (key->uids && key->uids->email) + printf (" <%s>", key->uids->email); + putchar ('\n'); + gpgme_key_release (key); + } + gpgme_release (ctx); + } + if (gpg_err_code (err) != GPG_ERR_EOF) + { + fprintf (stderr, "can not list keys: %s\n", gpgme_strerror (err)); + exit (1); + } + + -- Data type: gpgme_keylist_result_t + This is a pointer to a structure used to store the result of a + `gpgme_op_keylist_*' operation. After successfully ending a key + listing operation, you can retrieve the pointer to the result with + `gpgme_op_keylist_result'. The structure contains the following + member: + + `unsigned int truncated : 1' + This is true if the crypto backend had to truncate the + result, and less than the desired keys could be listed. + + -- Function: gpgme_keylist_result_t gpgme_op_keylist_result + (gpgme_ctx_t CTX) + The function `gpgme_op_keylist_result' returns a + `gpgme_keylist_result_t' pointer to a structure holding the result + of a `gpgme_op_keylist_*' operation. The pointer is only valid if + the last operation on the context was a key listing operation, and + if this operation finished successfully. The returned pointer is + only valid until the next operation is started on the context. + + In a simple program, for which a blocking operation is acceptable, +the following function can be used to retrieve a single key. + + -- Function: gpgme_error_t gpgme_get_key (gpgme_ctx_t CTX, + const char *FPR, gpgme_key_t *R_KEY, int SECRET) + The function `gpgme_get_key' gets the key with the fingerprint (or + key ID) FPR from the crypto backend and return it in R_KEY. If + SECRET is true, get the secret key. The currently active keylist + mode is used to retrieve the key. The key will have one reference + for the user. + + If the key is not found in the keyring, `gpgme_get_key' returns + the error code `GPG_ERR_EOF' and *R_KEY will be set to `NULL'. + + The function returns the error code `GPG_ERR_INV_VALUE' if CTX or + R_KEY is not a valid pointer or FPR is not a fingerprint or key + ID, `GPG_ERR_AMBIGUOUS_NAME' if the key ID was not a unique + specifier for a key, and `GPG_ERR_ENOMEM' if at some time during + the operation there was not enough memory available. + + +File: gpgme.info, Node: Information About Keys, Next: Key Signatures, Prev: Listing Keys, Up: Key Management + +7.5.2 Information About Keys +---------------------------- + +Please see the beginning of this section for more information about +`gpgme_key_t' objects. + + -- Data type: gpgme_validity_t + The `gpgme_validity_t' type is used to specify the validity of a + user ID in a key. The following validities are defined: + + `GPGME_VALIDITY_UNKNOWN' + The user ID is of unknown validity. The string + representation of this validity is "?". + + `GPGME_VALIDITY_UNDEFINED' + The validity of the user ID is undefined. The string + representation of this validity is "q". + + `GPGME_VALIDITY_NEVER' + The user ID is never valid. The string representation of this + validity is "n". + + `GPGME_VALIDITY_MARGINAL' + The user ID is marginally valid. The string representation + of this validity is "m". + + `GPGME_VALIDITY_FULL' + The user ID is fully valid. The string representation of this + validity is "f". + + `GPGME_VALIDITY_ULTIMATE' + The user ID is ultimately valid. The string representation + of this validity is "u". + + The following interfaces are deprecated and only provided for +backward compatibility. Don't use them. They will be removed in a +future version of GPGME. + + -- Data type: gpgme_attr_t + The `gpgme_attr_t' type is used to specify a key or trust item + attribute. The following attributes are defined: + + `GPGME_ATTR_KEYID' + This is the key ID of a sub key. It is representable as a + string. + + For trust items, the trust item refers to the key with this + ID. + + `GPGME_ATTR_FPR' + This is the fingerprint of a sub key. It is representable as + a string. + + `GPGME_ATTR_ALGO' + This is the crypto algorithm for which the sub key can be + used. It is representable as a string and as a number. The + numbers correspond to the `enum gcry_pk_algos' values in the + gcrypt library. + + `GPGME_ATTR_LEN' + This is the key length of a sub key. It is representable as a + number. + + `GPGME_ATTR_CREATED' + This is the timestamp at creation time of a sub key. It is + representable as a number. + + `GPGME_ATTR_EXPIRE' + This is the expiration time of a sub key. It is + representable as a number. + + `GPGME_ATTR_OTRUST' + XXX FIXME (also for trust items) + + `GPGME_ATTR_USERID' + This is a user ID. There can be more than one user IDs in a + GPGME_KEY_T object. The first one (with index 0) is the + primary user ID. The user ID is representable as a number. + + For trust items, this is the user ID associated with this + trust item. + + `GPGME_ATTR_NAME' + This is the name belonging to a user ID. It is representable + as a string. + + `GPGME_ATTR_EMAIL' + This is the email address belonging to a user ID. It is + representable as a string. + + `GPGME_ATTR_COMMENT' + This is the comment belonging to a user ID. It is + representable as a string. + + `GPGME_ATTR_VALIDITY' + This is the validity belonging to a user ID. It is + representable as a string and as a number. See below for a + list of available validities. + + For trust items, this is the validity that is associated with + this trust item. + + `GPGME_ATTR_UID_REVOKED' + This specifies if a user ID is revoked. It is representable + as a number, and is `1' if the user ID is revoked, and `0' + otherwise. + + `GPGME_ATTR_UID_INVALID' + This specifies if a user ID is invalid. It is representable + as a number, and is `1' if the user ID is invalid, and `0' + otherwise. + + `GPGME_ATTR_LEVEL' + This is the trust level of a trust item. + + `GPGME_ATTR_TYPE' + This returns information about the type of key. For the + string function this will eother be "PGP" or "X.509". The + integer function returns 0 for PGP and 1 for X.509. It is + also used for the type of a trust item. + + `GPGME_ATTR_IS_SECRET' + This specifies if the key is a secret key. It is + representable as a number, and is `1' if the key is revoked, + and `0' otherwise. + + `GPGME_ATTR_KEY_REVOKED' + This specifies if a sub key is revoked. It is representable + as a number, and is `1' if the key is revoked, and `0' + otherwise. + + `GPGME_ATTR_KEY_INVALID' + This specifies if a sub key is invalid. It is representable + as a number, and is `1' if the key is invalid, and `0' + otherwise. + + `GPGME_ATTR_KEY_EXPIRED' + This specifies if a sub key is expired. It is representable + as a number, and is `1' if the key is expired, and `0' + otherwise. + + `GPGME_ATTR_KEY_DISABLED' + This specifies if a sub key is disabled. It is representable + as a number, and is `1' if the key is disabled, and `0' + otherwise. + + `GPGME_ATTR_KEY_CAPS' + This is a description of the capabilities of a sub key. It is + representable as a string. The string contains the letter + "e" if the key can be used for encryption, "s" if the key can + be used for signatures, and "c" if the key can be used for + certifications. + + `GPGME_ATTR_CAN_ENCRYPT' + This specifies if a sub key can be used for encryption. It is + representable as a number, and is `1' if the sub key can be + used for encryption, and `0' otherwise. + + `GPGME_ATTR_CAN_SIGN' + This specifies if a sub key can be used to create data + signatures. It is representable as a number, and is `1' if + the sub key can be used for signatures, and `0' otherwise. + + `GPGME_ATTR_CAN_CERTIFY' + This specifies if a sub key can be used to create key + certificates. It is representable as a number, and is `1' if + the sub key can be used for certifications, and `0' otherwise. + + `GPGME_ATTR_SERIAL' + The X.509 issuer serial attribute of the key. It is + representable as a string. + + `GPGME_ATTR_ISSUE' + The X.509 issuer name attribute of the key. It is + representable as a string. + + `GPGME_ATTR_CHAINID' + The X.509 chain ID can be used to build the certification + chain. It is representable as a string. + + -- Function: const char * gpgme_key_get_string_attr (gpgme_key_t KEY, + gpgme_attr_t WHAT, const void *RESERVED, int IDX) + The function `gpgme_key_get_string_attr' returns the value of the + string-representable attribute WHAT of key KEY. If the attribute + is an attribute of a sub key or an user ID, IDX specifies the sub + key or user ID of which the attribute value is returned. The + argument RESERVED is reserved for later use and should be `NULL'. + + The string returned is only valid as long as the key is valid. + + The function returns `0' if an attribute can't be returned as a + string, KEY is not a valid pointer, IDX out of range, or RESERVED + not `NULL'. + + -- Function: unsigned long gpgme_key_get_ulong_attr (gpgme_key_t KEY, + gpgme_attr_t WHAT, const void *RESERVED, int IDX) + The function `gpgme_key_get_ulong_attr' returns the value of the + number-representable attribute WHAT of key KEY. If the attribute + is an attribute of a sub key or an user ID, IDX specifies the sub + key or user ID of which the attribute value is returned. The + argument RESERVED is reserved for later use and should be `NULL'. + + The function returns `0' if the attribute can't be returned as a + number, KEY is not a valid pointer, IDX out of range, or RESERVED + not `NULL'. + + +File: gpgme.info, Node: Key Signatures, Next: Manipulating Keys, Prev: Information About Keys, Up: Key Management + +7.5.3 Key Signatures +-------------------- + +The following interfaces are deprecated and only provided for backward +compatibility. Don't use them. They will be removed in a future +version of GPGME. + + The signatures on a key are only available if the key was retrieved +via a listing operation with the `GPGME_KEYLIST_MODE_SIGS' mode +enabled, because it is expensive to retrieve all signatures of a key. + + So, before using the below interfaces to retrieve the signatures on a +key, you have to make sure that the key was listed with signatures +enabled. One convenient, but blocking, way to do this is to use the +function `gpgme_get_key'. + + -- Data type: gpgme_attr_t + The `gpgme_attr_t' type is used to specify a key signature + attribute. The following attributes are defined: + + `GPGME_ATTR_KEYID' + This is the key ID of the key which was used for the + signature. It is representable as a string. + + `GPGME_ATTR_ALGO' + This is the crypto algorithm used to create the signature. + It is representable as a string and as a number. The numbers + correspond to the `enum gcry_pk_algos' values in the gcrypt + library. + + `GPGME_ATTR_CREATED' + This is the timestamp at creation time of the signature. It + is representable as a number. + + `GPGME_ATTR_EXPIRE' + This is the expiration time of the signature. It is + representable as a number. + + `GPGME_ATTR_USERID' + This is the user ID associated with the signing key. The + user ID is representable as a number. + + `GPGME_ATTR_NAME' + This is the name belonging to a user ID. It is representable + as a string. + + `GPGME_ATTR_EMAIL' + This is the email address belonging to a user ID. It is + representable as a string. + + `GPGME_ATTR_COMMENT' + This is the comment belonging to a user ID. It is + representable as a string. + + `GPGME_ATTR_KEY_REVOKED' + This specifies if a key signature is a revocation signature. + It is representable as a number, and is `1' if the key is + revoked, and `0' otherwise. + + `GPGME_ATTR_SIG_CLASS' + This specifies the signature class of a key signature. It is + representable as a number. The meaning is specific to the + crypto engine. + + `GPGME_ATTR_SIG_CLASS' + This specifies the signature class of a key signature. It is + representable as a number. The meaning is specific to the + crypto engine. + + `GPGME_ATTR_SIG_STATUS' + This is the same value as returned by `gpgme_get_sig_status'. + + -- Function: const char * gpgme_key_sig_get_string_attr + (gpgme_key_t KEY, int UID_IDX, gpgme_attr_t WHAT, + const void *RESERVED, int IDX) + The function `gpgme_key_sig_get_string_attr' returns the value of + the string-representable attribute WHAT of the signature IDX on + the user ID UID_IDX in the key KEY. The argument RESERVED is + reserved for later use and should be `NULL'. + + The string returned is only valid as long as the key is valid. + + The function returns `0' if an attribute can't be returned as a + string, KEY is not a valid pointer, UID_IDX or IDX out of range, + or RESERVED not `NULL'. + + -- Function: unsigned long gpgme_key_sig_get_ulong_attr + (gpgme_key_t KEY, int UID_IDX, gpgme_attr_t WHAT, + const void *RESERVED, int IDX) + The function `gpgme_key_sig_get_ulong_attr' returns the value of + the number-representable attribute WHAT of the signature IDX on + the user ID UID_IDX in the key KEY. The argument RESERVED is + reserved for later use and should be `NULL'. + + The function returns `0' if an attribute can't be returned as a + string, KEY is not a valid pointer, UID_IDX or IDX out of range, + or RESERVED not `NULL'. + + +File: gpgme.info, Node: Manipulating Keys, Next: Generating Keys, Prev: Key Signatures, Up: Key Management + +7.5.4 Manipulating Keys +----------------------- + + -- Function: void gpgme_key_ref (gpgme_key_t KEY) + The function `gpgme_key_ref' acquires an additional reference for + the key KEY. + + -- Function: void gpgme_key_unref (gpgme_key_t KEY) + The function `gpgme_key_unref' releases a reference for the key + KEY. If this was the last reference, the key will be destroyed + and all resources associated to it will be released. + + The following interface is deprecated and only provided for backward +compatibility. Don't use it. It will be removed in a future version +of GPGME. + + -- Function: void gpgme_key_release (gpgme_key_t KEY) + The function `gpgme_key_release' is equivalent to + `gpgme_key_unref'. + + +File: gpgme.info, Node: Generating Keys, Next: Exporting Keys, Prev: Manipulating Keys, Up: Key Management + +7.5.5 Generating Keys +--------------------- + + -- Function: gpgme_error_t gpgme_op_genkey (gpgme_ctx_t CTX, + const char *PARMS, gpgme_data_t PUBLIC, gpgme_data_t SECRET) + The function `gpgme_op_genkey' generates a new key pair in the + context CTX. The meaning of PUBLIC and SECRET depends on the + crypto backend. + + GnuPG does not support PUBLIC and SECRET, they should be `NULL'. + GnuPG will generate a key pair and add it to the standard key + ring. The fingerprint of the generated key is available with + `gpgme_op_genkey_result'. + + GpgSM requires PUBLIC to be a writable data object. GpgSM will + generate a secret key (which will be stored by `gpg-agent', and + return a certificate request in PUBLIC, which then needs to be + signed by the certification authority and imported before it can be + used. GpgSM does not make the fingerprint available. + + The argument PARMS specifies parameters for the key in an XML + string. The details about the format of PARMS are specific to the + crypto engine used by CTX. Here is an example for GnuPG as the + crypto engine (all parameters of OpenPGP key generation are + documented in the GPG manual): + + <GnupgKeyParms format="internal"> + Key-Type: default + Subkey-Type: default + Name-Real: Joe Tester + Name-Comment: with stupid passphrase + Name-Email: joe@foo.bar + Expire-Date: 0 + Passphrase: abc + </GnupgKeyParms> + + Here is an example for GpgSM as the crypto engine (all parameters + of OpenPGP key generation are documented in the GPGSM manual): + + <GnupgKeyParms format="internal"> + Key-Type: RSA + Key-Length: 1024 + Name-DN: C=de,O=g10 code,OU=Testlab,CN=Joe 2 Tester + Name-Email: joe@foo.bar + </GnupgKeyParms> + + Strings should be given in UTF-8 encoding. The only format + supported for now is "internal". The content of the + `GnupgKeyParms' container is passed verbatim to the crypto + backend. Control statements are not allowed. + + After the operation completed successfully, the result can be + retrieved with `gpgme_op_genkey_result'. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation could be started successfully, `GPG_ERR_INV_VALUE' if + PARMS is not a valid XML string, `GPG_ERR_NOT_SUPPORTED' if PUBLIC + or SECRET is not valid, and `GPG_ERR_GENERAL' if no key was + created by the backend. + + -- Function: gpgme_error_t gpgme_op_genkey_start (gpgme_ctx_t CTX, + const char *PARMS, gpgme_data_t PUBLIC, gpgme_data_t SECRET) + The function `gpgme_op_genkey_start' initiates a `gpgme_op_genkey' + operation. It can be completed by calling `gpgme_wait' on the + context. *Note Waiting For Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation could be started successfully, `GPG_ERR_INV_VALUE' if + PARMS is not a valid XML string, and `GPG_ERR_NOT_SUPPORTED' if + PUBLIC or SECRET is not `NULL'. + + -- Data type: gpgme_genkey_result_t + This is a pointer to a structure used to store the result of a + `gpgme_op_genkey' operation. After successfully generating a key, + you can retrieve the pointer to the result with + `gpgme_op_genkey_result'. The structure contains the following + members: + + `unsigned int primary : 1' + This is a flag that is set to 1 if a primary key was created + and to 0 if not. + + `unsigned int sub : 1' + This is a flag that is set to 1 if a subkey was created and + to 0 if not. + + `char *fpr' + This is the fingerprint of the key that was created. If both + a primary and a sub key were generated, the fingerprint of + the primary key will be returned. If the crypto engine does + not provide the fingerprint, `fpr' will be a null pointer. + + -- Function: gpgme_genkey_result_t gpgme_op_genkey_result + (gpgme_ctx_t CTX) + The function `gpgme_op_genkey_result' returns a + `gpgme_genkey_result_t' pointer to a structure holding the result + of a `gpgme_op_genkey' operation. The pointer is only valid if the + last operation on the context was a `gpgme_op_genkey' or + `gpgme_op_genkey_start' operation, and if this operation finished + successfully. The returned pointer is only valid until the next + operation is started on the context. + + +File: gpgme.info, Node: Exporting Keys, Next: Importing Keys, Prev: Generating Keys, Up: Key Management + +7.5.6 Exporting Keys +-------------------- + +Exporting keys means the same as running `gpg' with the command +`--export'. However, a mode flag can be used to change the way the +export works. The available mode flags are described below, they may +be or-ed together. + +`GPGME_EXPORT_MODE_EXTERN' + If this bit is set, the output is send directly to the default + keyserver. This is currently only allowed for OpenPGP keys. It is + good practise to not send more than a few dozens key to a + keyserver at one time. Using this flag requires that the KEYDATA + argument of the export function is set to `NULL'. + +`GPGME_EXPORT_MODE_MINIMAL' + If this bit is set, the smallest possible key is exported. For + OpenPGP keys it removes all signatures except for the latest + self-signatures. For X.509 keys it has no effect. + + + -- Function: gpgme_error_t gpgme_op_export (gpgme_ctx_t CTX, + const char *PATTERN, gpgme_export_mode_t MODE, + gpgme_data_t KEYDATA) + The function `gpgme_op_export' extracts public keys and returns + them in the data buffer KEYDATA. The output format of the key + data returned is determined by the ASCII armor attribute set for + the context CTX, or, if that is not set, by the encoding specified + for KEYDATA. + + If PATTERN is `NULL', all available keys are returned. Otherwise, + PATTERN contains an engine specific expression that is used to + limit the list to all keys matching the pattern. + + MODE is usually 0; other values are described above. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation completed successfully, `GPG_ERR_INV_VALUE' if KEYDATA + is not a valid empty data buffer, and passes through any errors + that are reported by the crypto engine support routines. + + -- Function: gpgme_error_t gpgme_op_export_start (gpgme_ctx_t CTX, + const char *PATTERN, gpgme_export_mode_t MODE, + gpgme_data_t KEYDATA) + The function `gpgme_op_export_start' initiates a `gpgme_op_export' + operation. It can be completed by calling `gpgme_wait' on the + context. *Note Waiting For Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation could be started successfully, and `GPG_ERR_INV_VALUE' + if KEYDATA is not a valid empty data buffer. + + -- Function: gpgme_error_t gpgme_op_export_ext (gpgme_ctx_t CTX, + const char *PATTERN[], gpgme_export_mode_t MODE, + gpgme_data_t KEYDATA) + The function `gpgme_op_export' extracts public keys and returns + them in the data buffer KEYDATA. The output format of the key + data returned is determined by the ASCII armor attribute set for + the context CTX, or, if that is not set, by the encoding specified + for KEYDATA. + + If PATTERN or *PATTERN is `NULL', all available keys are returned. + Otherwise, PATTERN is a `NULL' terminated array of strings that + are used to limit the list to all keys matching at least one of + the patterns verbatim. + + MODE is usually 0; other values are described above. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation completed successfully, `GPG_ERR_INV_VALUE' if KEYDATA + is not a valid empty data buffer, and passes through any errors + that are reported by the crypto engine support routines. + + -- Function: gpgme_error_t gpgme_op_export_ext_start (gpgme_ctx_t CTX, + const char *PATTERN[], gpgme_export_mode_t MODE, + gpgme_data_t KEYDATA) + The function `gpgme_op_export_ext_start' initiates a + `gpgme_op_export_ext' operation. It can be completed by calling + `gpgme_wait' on the context. *Note Waiting For Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation could be started successfully, and `GPG_ERR_INV_VALUE' + if KEYDATA is not a valid empty data buffer. + + -- Function: gpgme_error_t gpgme_op_export_keys (gpgme_ctx_t CTX, + gpgme_key_t keys[], gpgme_export_mode_t MODE, + gpgme_data_t KEYDATA) + The function `gpgme_op_export_keys' extracts public keys and + returns them in the data buffer KEYDATA. The output format of the + key data returned is determined by the ASCII armor attribute set + for the context CTX, or, if that is not set, by the encoding + specified for KEYDATA. + + The keys to export are taken form the `NULL' terminated array + KEYS. Only keys of the the currently selected protocol of CTX + which do have a fingerprint set are considered for export. Other + keys specified by the KEYS are ignored. In particular OpenPGP + keys retrieved via an external key listing are not included. + + MODE is usually 0; other values are described above. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation completed successfully, `GPG_ERR_INV_VALUE' if KEYDATA + is not a valid empty data buffer, `GPG_ERR_NO_DATA' if no useful + keys are in KEYS and passes through any errors that are reported + by the crypto engine support routines. + + -- Function: gpgme_error_t gpgme_op_export_keys_start + (gpgme_ctx_t CTX, gpgme_key_t KEYS[], + gpgme_export_mode_t MODE, gpgme_data_t KEYDATA) + The function `gpgme_op_export_keys_start' initiates a + `gpgme_op_export_ext' operation. It can be completed by calling + `gpgme_wait' on the context. *Note Waiting For Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation could be started successfully, and `GPG_ERR_INV_VALUE' + if KEYDATA is not a valid empty data buffer, `GPG_ERR_NO_DATA' if + no useful keys are in KEYS and passes through any errors that are + reported by the crypto engine support routines. + + +File: gpgme.info, Node: Importing Keys, Next: Deleting Keys, Prev: Exporting Keys, Up: Key Management + +7.5.7 Importing Keys +-------------------- + +Importing keys means the same as running `gpg' with the command +`--import'. + + -- Function: gpgme_error_t gpgme_op_import (gpgme_ctx_t CTX, + gpgme_data_t KEYDATA) + The function `gpgme_op_import' adds the keys in the data buffer + KEYDATA to the key ring of the crypto engine used by CTX. The + format of KEYDATA can be ASCII armored, for example, but the + details are specific to the crypto engine. + + After the operation completed successfully, the result can be + retrieved with `gpgme_op_import_result'. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + import was completed successfully, `GPG_ERR_INV_VALUE' if KEYDATA + if CTX or KEYDATA is not a valid pointer, and `GPG_ERR_NO_DATA' if + KEYDATA is an empty data buffer. + + -- Function: gpgme_error_t gpgme_op_import_start (gpgme_ctx_t CTX, + gpgme_data_t KEYDATA) + The function `gpgme_op_import_start' initiates a `gpgme_op_import' + operation. It can be completed by calling `gpgme_wait' on the + context. *Note Waiting For Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + import could be started successfully, `GPG_ERR_INV_VALUE' if + KEYDATA if CTX or KEYDATA is not a valid pointer, and + `GPG_ERR_NO_DATA' if KEYDATA is an empty data buffer. + + -- Function: gpgme_error_t gpgme_op_import_keys (gpgme_ctx_t CTX, + gpgme_key_t *KEYS) + The function `gpgme_op_import_keys' adds the keys described by the + `NULL' terminated array KEYS to the key ring of the crypto engine + used by CTX. This function is the general interface to move a key + from one crypto engine to another as long as they are compatible. + In particular it is used to actually import and make keys + permanent which have been retrieved from an external source (i.e. + using `GPGME_KEYLIST_MODE_EXTERN'). (1) + + Only keys of the the currently selected protocol of CTX are + considered for import. Other keys specified by the KEYS are + ignored. As of now all considered keys must have been retrieved + using the same method, that is the used key listing mode must be + identical. + + After the operation completed successfully, the result can be + retrieved with `gpgme_op_import_result'. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + import was completed successfully, `GPG_ERR_INV_VALUE' if KEYDATA + if CTX or KEYDATA is not a valid pointer, `GPG_ERR_CONFLICT' if + the key listing mode does not match, and `GPG_ERR_NO_DATA' if no + keys are considered for export. + + -- Function: gpgme_error_t gpgme_op_import_keys_start + (gpgme_ctx_t CTX, gpgme_key_t *KEYS) + The function `gpgme_op_import_keys_start' initiates a + `gpgme_op_import_keys' operation. It can be completed by calling + `gpgme_wait' on the context. *Note Waiting For Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + import was completed successfully, `GPG_ERR_INV_VALUE' if KEYDATA + if CTX or KEYDATA is not a valid pointer, `GPG_ERR_CONFLICT' if + the key listing mode does not match, and `GPG_ERR_NO_DATA' if no + keys are considered for export. + + -- Data type: gpgme_import_status_t + This is a pointer to a structure used to store a part of the + result of a `gpgme_op_import' operation. For each considered key + one status is added that contains information about the result of + the import. The structure contains the following members: + + `gpgme_import_status_t next' + This is a pointer to the next status structure in the linked + list, or `NULL' if this is the last element. + + `char *fpr' + This is the fingerprint of the key that was considered. + + `gpgme_error_t result' + If the import was not successful, this is the error value + that caused the import to fail. Otherwise the error code is + `GPG_ERR_NO_ERROR'. + + `unsigned int status' + This is a bit-wise OR of the following flags that give more + information about what part of the key was imported. If the + key was already known, this might be 0. + + `GPGME_IMPORT_NEW' + The key was new. + + `GPGME_IMPORT_UID' + The key contained new user IDs. + + `GPGME_IMPORT_SIG' + The key contained new signatures. + + `GPGME_IMPORT_SUBKEY' + The key contained new sub keys. + + `GPGME_IMPORT_SECRET' + The key contained a secret key. + + -- Data type: gpgme_import_result_t + This is a pointer to a structure used to store the result of a + `gpgme_op_import' operation. After a successful import operation, + you can retrieve the pointer to the result with + `gpgme_op_import_result'. The structure contains the following + members: + + `int considered' + The total number of considered keys. + + `int no_user_id' + The number of keys without user ID. + + `int imported' + The total number of imported keys. + + `imported_rsa' + The number of imported RSA keys. + + `unchanged' + The number of unchanged keys. + + `new_user_ids' + The number of new user IDs. + + `new_sub_keys' + The number of new sub keys. + + `new_signatures' + The number of new signatures. + + `new_revocations' + The number of new revocations. + + `secret_read' + The total number of secret keys read. + + `secret_imported' + The number of imported secret keys. + + `secret_unchanged' + The number of unchanged secret keys. + + `not_imported' + The number of keys not imported. + + `gpgme_import_status_t imports' + A list of gpgme_import_status_t objects which contain more + information about the keys for which an import was attempted. + + -- Function: gpgme_import_result_t gpgme_op_import_result + (gpgme_ctx_t CTX) + The function `gpgme_op_import_result' returns a + `gpgme_import_result_t' pointer to a structure holding the result + of a `gpgme_op_import' operation. The pointer is only valid if + the last operation on the context was a `gpgme_op_import' or + `gpgme_op_import_start' operation, and if this operation finished + successfully. The returned pointer is only valid until the next + operation is started on the context. + + The following interface is deprecated and only provided for backward +compatibility. Don't use it. It will be removed in a future version +of GPGME. + + -- Function: gpgme_error_t gpgme_op_import_ext (gpgme_ctx_t CTX, + gpgme_data_t KEYDATA, int *NR) + The function `gpgme_op_import_ext' is equivalent to: + + gpgme_error_t err = gpgme_op_import (ctx, keydata); + if (!err) + { + gpgme_import_result_t result = gpgme_op_import_result (ctx); + *nr = result->considered; + } + + ---------- Footnotes ---------- + + (1) Thus it is a replacement for the usual workaround of exporting +and then importing a key to make an X.509 key permanent. + + +File: gpgme.info, Node: Deleting Keys, Next: Changing Passphrases, Prev: Importing Keys, Up: Key Management + +7.5.8 Deleting Keys +------------------- + + -- Function: gpgme_error_t gpgme_op_delete (gpgme_ctx_t CTX, + const gpgme_key_t KEY, int ALLOW_SECRET) + The function `gpgme_op_delete' deletes the key KEY from the key + ring of the crypto engine used by CTX. If ALLOW_SECRET is `0', + only public keys are deleted, otherwise secret keys are deleted as + well, if that is supported. + + The function returns the error code `GPG_ERR_NO_ERROR' if the key + was deleted successfully, `GPG_ERR_INV_VALUE' if CTX or KEY is not + a valid pointer, `GPG_ERR_NO_PUBKEY' if KEY could not be found in + the keyring, `GPG_ERR_AMBIGUOUS_NAME' if the key was not specified + unambiguously, and `GPG_ERR_CONFLICT' if the secret key for KEY is + available, but ALLOW_SECRET is zero. + + -- Function: gpgme_error_t gpgme_op_delete_start (gpgme_ctx_t CTX, + const gpgme_key_t KEY, int ALLOW_SECRET) + The function `gpgme_op_delete_start' initiates a `gpgme_op_delete' + operation. It can be completed by calling `gpgme_wait' on the + context. *Note Waiting For Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation was started successfully, and `GPG_ERR_INV_VALUE' if CTX + or KEY is not a valid pointer. + + +File: gpgme.info, Node: Changing Passphrases, Next: Advanced Key Editing, Prev: Deleting Keys, Up: Key Management + +7.5.9 Changing Passphrases +-------------------------- + + -- Function: gpgme_error_t gpgme_op_passwd (gpgme_ctx_t CTX, + const gpgme_key_t KEY, unsigned int FLAGS) + The function `gpgme_op_passwd' changes the passphrase of the + private key associated with KEY. The only allowed value for FLAGS + is `0'. The backend engine will usually popup a window to ask for + the old and the new passphrase. Thus this function is not useful + in a server application (where passphrases are not required + anyway). + + Note that old `gpg' engines (before version 2.0.15) do not support + this command and will silently ignore it. + + -- Function: gpgme_error_t gpgme_op_passwd_start (gpgme_ctx_t CTX, + const gpgme_key_t KEY, unsigned int FLAGS) + The function `gpgme_op_passwd_start' initiates a `gpgme_op_passwd' + operation. It can be completed by calling `gpgme_wait' on the + context. *Note Waiting For Completion::. + + The function returns `0' if the operation was started successfully, + and an error code if one of the arguments is not valid or the + oepration could not be started. + + +File: gpgme.info, Node: Advanced Key Editing, Prev: Changing Passphrases, Up: Key Management + +7.5.10 Advanced Key Editing +--------------------------- + + -- Data type: gpgme_error_t (*gpgme_edit_cb_t) (void *HANDLE, +gpgme_status_code_t STATUS, const char *ARGS, int FD) + The `gpgme_edit_cb_t' type is the type of functions which GPGME + calls if it a key edit operation is on-going. The status code + STATUS and the argument line ARGS are passed through by GPGME from + the crypto engine. The file descriptor FD is -1 for normal status + messages. If STATUS indicates a command rather than a status + message, the response to the command should be written to FD. The + HANDLE is provided by the user at start of operation. + + The function should return `GPG_ERR_NO_ERROR' or an error value. + + -- Function: gpgme_error_t gpgme_op_edit (gpgme_ctx_t CTX, + gpgme_key_t KEY, gpgme_edit_cb_t FNC, void *HANDLE, + gpgme_data_t OUT) + The function `gpgme_op_edit' processes the key KEY interactively, + using the edit callback function FNC with the handle HANDLE. The + callback is invoked for every status and command request from the + crypto engine. The output of the crypto engine is written to the + data object OUT. + + Note that the protocol between the callback function and the crypto + engine is specific to the crypto engine and no further support in + implementing this protocol correctly is provided by GPGME. + + The function returns the error code `GPG_ERR_NO_ERROR' if the edit + operation completes successfully, `GPG_ERR_INV_VALUE' if CTX or + KEY is not a valid pointer, and any error returned by the crypto + engine or the edit callback handler. + + -- Function: gpgme_error_t gpgme_op_edit_start (gpgme_ctx_t CTX, + gpgme_key_t KEY, gpgme_edit_cb_t FNC, void *HANDLE, + gpgme_data_t OUT) + The function `gpgme_op_edit_start' initiates a `gpgme_op_edit' + operation. It can be completed by calling `gpgme_wait' on the + context. *Note Waiting For Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation was started successfully, and `GPG_ERR_INV_VALUE' if CTX + or KEY is not a valid pointer. + + -- Function: gpgme_error_t gpgme_op_card_edit (gpgme_ctx_t CTX, + gpgme_key_t KEY, gpgme_edit_cb_t FNC, void *HANDLE, + gpgme_data_t OUT) + The function `gpgme_op_card_edit' is analogous to `gpgme_op_edit', + but should be used to process the smart card corresponding to the + key KEY. + + -- Function: gpgme_error_t gpgme_op_card_edit_start (gpgme_ctx_t CTX, + gpgme_key_t KEY, gpgme_edit_cb_t FNC, void *HANDLE, + gpgme_data_t OUT) + The function `gpgme_op_card_edit_start' initiates a + `gpgme_op_card_edit' operation. It can be completed by calling + `gpgme_wait' on the context. *Note Waiting For Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation was started successfully, and `GPG_ERR_INV_VALUE' if CTX + or KEY is not a valid pointer. + + +File: gpgme.info, Node: Trust Item Management, Next: Crypto Operations, Prev: Key Management, Up: Contexts + +7.6 Trust Item Management +========================= + +*Caution:* The trust items interface is experimental. + + -- Data type: gpgme_trust_item_t + The `gpgme_trust_item_t' type is a pointer to a trust item object. + It has the following members: + + `char *keyid' + This is a string describing the key to which this trust items + belongs. + + `int type' + This is the type of the trust item. A value of 1 refers to a + key, a value of 2 refers to a user ID. + + `int level' + This is the trust level. + + `char *owner_trust' + The owner trust if `type' is 1. + + `char *validity' + The calculated validity. + + `char *name' + The user name if `type' is 2. + +* Menu: + +* Listing Trust Items:: Browsing the list of available trust items. +* Information About Trust Items:: Requesting information about trust items. +* Manipulating Trust Items:: Operations on trust items. + + +File: gpgme.info, Node: Listing Trust Items, Next: Information About Trust Items, Up: Trust Item Management + +7.6.1 Listing Trust Items +------------------------- + + -- Function: gpgme_error_t gpgme_op_trustlist_start (gpgme_ctx_t CTX, + const char *PATTERN, int MAX_LEVEL) + The function `gpgme_op_trustlist_start' initiates a trust item + listing operation inside the context CTX. It sets everything up + so that subsequent invocations of `gpgme_op_trustlist_next' return + the trust items in the list. + + The string PATTERN contains an engine specific expression that is + used to limit the list to all trust items matching the pattern. It + can not be the empty string. + + The argument MAX_LEVEL is currently ignored. + + The context will be busy until either all trust items are received + (and `gpgme_op_trustlist_next' returns `GPG_ERR_EOF'), or + `gpgme_op_trustlist_end' is called to finish the operation. + + The function returns the error code `GPG_ERR_INV_VALUE' if CTX is + not a valid pointer, and passes through any errors that are + reported by the crypto engine support routines. + + -- Function: gpgme_error_t gpgme_op_trustlist_next (gpgme_ctx_t CTX, + gpgme_trust_item_t *R_ITEM) + The function `gpgme_op_trustlist_next' returns the next trust item + in the list created by a previous `gpgme_op_trustlist_start' + operation in the context CTX. The trust item can be destroyed + with `gpgme_trust_item_release'. *Note Manipulating Trust Items::. + + This is the only way to get at `gpgme_trust_item_t' objects in + GPGME. + + If the last trust item in the list has already been returned, + `gpgme_op_trustlist_next' returns `GPG_ERR_EOF'. + + The function returns the error code `GPG_ERR_INV_VALUE' if CTX or + R_ITEM is not a valid pointer, and `GPG_ERR_ENOMEM' if there is + not enough memory for the operation. + + -- Function: gpgme_error_t gpgme_op_trustlist_end (gpgme_ctx_t CTX) + The function `gpgme_op_trustlist_end' ends a pending trust list + operation in the context CTX. + + The function returns the error code `GPG_ERR_INV_VALUE' if CTX is + not a valid pointer, and `GPG_ERR_ENOMEM' if at some time during + the operation there was not enough memory available. + + +File: gpgme.info, Node: Information About Trust Items, Next: Manipulating Trust Items, Prev: Listing Trust Items, Up: Trust Item Management + +7.6.2 Information About Trust Items +----------------------------------- + +The following interfaces are deprecated and only provided for backward +compatibility. Don't use them. They will be removed in a future +version of GPGME. + + Trust items have attributes which can be queried using the interfaces +below. The attribute identifiers are shared with those for key +attributes. *Note Information About Keys::. + + -- Function: const char * gpgme_trust_item_get_string_attr + (gpgme_trust_item_t ITEM, gpgme_attr_t WHAT, + const void *RESERVED, int IDX) + The function `gpgme_trust_item_get_string_attr' returns the value + of the string-representable attribute WHAT of trust item ITEM. + The arguments IDX and RESERVED are reserved for later use and + should be `0' and `NULL' respectively. + + The string returned is only valid as long as the key is valid. + + The function returns `0' if an attribute can't be returned as a + string, KEY is not a valid pointer, IDX out of range, or RESERVED + not `NULL'. + + -- Function: int gpgme_trust_item_get_int_attr + (gpgme_trust_item_t ITEM, gpgme_attr_t WHAT, + const void *RESERVED, int IDX) + The function `gpgme_trust_item_get_int_attr' returns the value of + the number-representable attribute WHAT of trust item ITEM. If + the attribute occurs more than once in the trust item, the index + is specified by IDX. However, currently no such attribute exists, + so IDX should be `0'. The argument RESERVED is reserved for later + use and should be `NULL'. + + The function returns `0' if the attribute can't be returned as a + number, KEY is not a valid pointer, IDX out of range, or RESERVED + not `NULL'. + + +File: gpgme.info, Node: Manipulating Trust Items, Prev: Information About Trust Items, Up: Trust Item Management + +7.6.3 Manipulating Trust Items +------------------------------ + + -- Function: void gpgme_trust_item_ref (gpgme_trust_item_t ITEM) + The function `gpgme_trust_item_ref' acquires an additional + reference for the trust item ITEM. + + -- Function: void gpgme_trust_item_unref (gpgme_trust_item_t ITEM) + The function `gpgme_trust_item_unref' releases a reference for the + trust item ITEM. If this was the last reference, the trust item + will be destroyed and all resources associated to it will be + released. + + The following interface is deprecated and only provided for backward +compatibility. Don't use it. It will be removed in a future version +of GPGME. + + -- Function: void gpgme_trust_item_release (gpgme_trust_item_t ITEM) + The function `gpgme_trust_item_release' is an alias for + `gpgme_trust_item_unref'. + + +File: gpgme.info, Node: Crypto Operations, Next: Run Control, Prev: Trust Item Management, Up: Contexts + +7.7 Crypto Operations +===================== + +Sometimes, the result of a crypto operation returns a list of invalid +keys encountered in processing the request. The following structure is +used to hold information about such a key. + + -- Data type: gpgme_invalid_key_t + This is a pointer to a structure used to store a part of the + result of a crypto operation which takes user IDs as one input + parameter. The structure contains the following members: + + `gpgme_invalid_key_t next' + This is a pointer to the next invalid key structure in the + linked list, or `NULL' if this is the last element. + + `char *fpr' + The fingerprint or key ID of the invalid key encountered. + + `gpgme_error_t reason' + An error code describing the reason why the key was found + invalid. + +* Menu: + +* Decrypt:: Decrypting a ciphertext. +* Verify:: Verifying a signature. +* Decrypt and Verify:: Decrypting a signed ciphertext. +* Sign:: Creating a signature. +* Encrypt:: Encrypting a plaintext. + + +File: gpgme.info, Node: Decrypt, Next: Verify, Up: Crypto Operations + +7.7.1 Decrypt +------------- + + -- Function: gpgme_error_t gpgme_op_decrypt (gpgme_ctx_t CTX, + gpgme_data_t CIPHER, gpgme_data_t PLAIN) + The function `gpgme_op_decrypt' decrypts the ciphertext in the + data object CIPHER and stores it into the data object PLAIN. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + ciphertext could be decrypted successfully, `GPG_ERR_INV_VALUE' if + CTX, CIPHER or PLAIN is not a valid pointer, `GPG_ERR_NO_DATA' if + CIPHER does not contain any data to decrypt, + `GPG_ERR_DECRYPT_FAILED' if CIPHER is not a valid cipher text, + `GPG_ERR_BAD_PASSPHRASE' if the passphrase for the secret key + could not be retrieved, and passes through any errors that are + reported by the crypto engine support routines. + + -- Function: gpgme_error_t gpgme_op_decrypt_start (gpgme_ctx_t CTX, + gpgme_data_t CIPHER, gpgme_data_t PLAIN) + The function `gpgme_op_decrypt_start' initiates a + `gpgme_op_decrypt' operation. It can be completed by calling + `gpgme_wait' on the context. *Note Waiting For Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation could be started successfully, and `GPG_ERR_INV_VALUE' + if CIPHER or PLAIN is not a valid pointer. + + -- Data type: gpgme_recipient_t + This is a pointer to a structure used to store information about + the recipient of an encrypted text which is decrypted in a + `gpgme_op_decrypt' operation. This information (except for the + status field) is even available before the operation finished + successfully, for example in a passphrase callback. The structure + contains the following members: + + `gpgme_recipient_t next' + This is a pointer to the next recipient structure in the + linked list, or `NULL' if this is the last element. + + `gpgme_pubkey_algo_t' + The public key algorithm used in the encryption. + + `unsigned int wrong_key_usage : 1' + This is true if the key was not used according to its policy. + + `char *keyid' + This is the key ID of the key (in hexadecimal digits) used as + recipient. + + `gpgme_error_t status' + This is an error number with the error code GPG_ERR_NO_SECKEY + if the secret key for this recipient is not available, and 0 + otherwise. + + -- Data type: gpgme_decrypt_result_t + This is a pointer to a structure used to store the result of a + `gpgme_op_decrypt' operation. After successfully decrypting data, + you can retrieve the pointer to the result with + `gpgme_op_decrypt_result'. The structure contains the following + members: + + `char *unsupported_algorithm' + If an unsupported algorithm was encountered, this string + describes the algorithm that is not supported. + + `unsigned int wrong_key_usage : 1' + This is true if the key was not used according to its policy. + + `gpgme_recipient_t recipients' + This is a linked list of recipients to which this message was + encrypted. + + `char *file_name' + This is the filename of the original plaintext message file + if it is known, otherwise this is a null pointer. + + -- Function: gpgme_decrypt_result_t gpgme_op_decrypt_result + (gpgme_ctx_t CTX) + The function `gpgme_op_decrypt_result' returns a + `gpgme_decrypt_result_t' pointer to a structure holding the result + of a `gpgme_op_decrypt' operation. The pointer is only valid if + the last operation on the context was a `gpgme_op_decrypt' or + `gpgme_op_decrypt_start' operation. If the operation failed this + might be a `NULL' pointer. The returned pointer is only valid + until the next operation is started on the context. + + +File: gpgme.info, Node: Verify, Next: Decrypt and Verify, Prev: Decrypt, Up: Crypto Operations + +7.7.2 Verify +------------ + + -- Function: gpgme_error_t gpgme_op_verify (gpgme_ctx_t CTX, + gpgme_data_t SIG, gpgme_data_t SIGNED_TEXT, + gpgme_data_t PLAIN) + The function `gpgme_op_verify' verifies that the signature in the + data object SIG is a valid signature. If SIG is a detached + signature, then the signed text should be provided in SIGNED_TEXT + and PLAIN should be a null pointer. Otherwise, if SIG is a normal + (or cleartext) signature, SIGNED_TEXT should be a null pointer and + PLAIN should be a writable data object that will contain the + plaintext after successful verification. + + The results of the individual signature verifications can be + retrieved with `gpgme_op_verify_result'. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation could be completed successfully, `GPG_ERR_INV_VALUE' if + CTX, SIG or PLAIN is not a valid pointer, `GPG_ERR_NO_DATA' if SIG + does not contain any data to verify, and passes through any errors + that are reported by the crypto engine support routines. + + -- Function: gpgme_error_t gpgme_op_verify_start (gpgme_ctx_t CTX, + gpgme_data_t SIG, gpgme_data_t SIGNED_TEXT, + gpgme_data_t PLAIN) + The function `gpgme_op_verify_start' initiates a `gpgme_op_verify' + operation. It can be completed by calling `gpgme_wait' on the + context. *Note Waiting For Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation could be started successfully, `GPG_ERR_INV_VALUE' if + CTX, SIG or PLAIN is not a valid pointer, and `GPG_ERR_NO_DATA' if + SIG or PLAIN does not contain any data to verify. + + -- Data type: gpgme_sig_notation_t + This is a pointer to a structure used to store a part of the + result of a `gpgme_op_verify' operation. The structure contains + the following members: + + `gpgme_sig_notation_t next' + This is a pointer to the next new signature notation + structure in the linked list, or `NULL' if this is the last + element. + + `char *name' + The name of the notation field. If this is `NULL', then the + member `value' will contain a policy URL. + + `int name_len' + The length of the `name' field. For strings the length is + counted without the trailing binary zero. + + `char *value' + The value of the notation field. If `name' is `NULL', then + this is a policy URL. + + `int value_len' + The length of the `value' field. For strings the length is + counted without the trailing binary zero. + + `gpgme_sig_notation_flags_t flags' + The accumulated flags field. This field contains the flags + associated with the notation data in an accumulated form + which can be used as an argument to the function + `gpgme_sig_notation_add'. The value `flags' is a bitwise-or + combination of one or multiple of the following bit values: + + `GPGME_SIG_NOTATION_HUMAN_READABLE' + The `GPGME_SIG_NOTATION_HUMAN_READABLE' symbol specifies + that the notation data is in human readable form + + `GPGME_SIG_NOTATION_CRITICAL' + The `GPGME_SIG_NOTATION_CRITICAL' symbol specifies that + the notation data is critical. + + + `unsigned int human_readable : 1' + This is true if the `GPGME_SIG_NOTATION_HUMAN_READABLE' flag + is set and false otherwise. This flag is only valid for + notation data, not for policy URLs. + + `unsigned int critical : 1' + This is true if the `GPGME_SIG_NOTATION_CRITICAL' flag is set + and false otherwise. This flag is valid for notation data + and policy URLs. + + + -- Data type: gpgme_signature_t + This is a pointer to a structure used to store a part of the + result of a `gpgme_op_verify' operation. The structure contains + the following members: + + `gpgme_signature_t next' + This is a pointer to the next new signature structure in the + linked list, or `NULL' if this is the last element. + + `gpgme_sigsum_t summary' + This is a bit vector giving a summary of the signature + status. It provides an easy interface to a defined semantic + of the signature status. Checking just one bit is sufficient + to see whether a signature is valid without any restrictions. + + The defined bits are: + `GPGME_SIGSUM_VALID' + The signature is fully valid. + + `GPGME_SIGSUM_GREEN' + The signature is good but one might want to display some + extra information. Check the other bits. + + `GPGME_SIGSUM_RED' + The signature is bad. It might be useful to check other + bits and display more information, i.e. a revoked + certificate might not render a signature invalid when + the message was received prior to the cause for the + revocation. + + `GPGME_SIGSUM_KEY_REVOKED' + The key or at least one certificate has been revoked. + + `GPGME_SIGSUM_KEY_EXPIRED' + The key or one of the certificates has expired. It is + probably a good idea to display the date of the + expiration. + + `GPGME_SIGSUM_SIG_EXPIRED' + The signature has expired. + + `GPGME_SIGSUM_KEY_MISSING' + Can't verify due to a missing key or certificate. + + `GPGME_SIGSUM_CRL_MISSING' + The CRL (or an equivalent mechanism) is not available. + + `GPGME_SIGSUM_CRL_TOO_OLD' + Available CRL is too old. + + `GPGME_SIGSUM_BAD_POLICY' + A policy requirement was not met. + + `GPGME_SIGSUM_SYS_ERROR' + A system error occured. + + `char *fpr' + This is the fingerprint or key ID of the signature. + + `gpgme_error_t status' + This is the status of the signature. In particular, the + following status codes are of interest: + + `GPG_ERR_NO_ERROR' + This status indicates that the signature is valid. For + the combined result this status means that all + signatures are valid. + + `GPG_ERR_SIG_EXPIRED' + This status indicates that the signature is valid but + expired. For the combined result this status means + that all signatures are valid and expired. + + `GPG_ERR_KEY_EXPIRED' + This status indicates that the signature is valid but + the key used to verify the signature has expired. For + the combined result this status means that all + signatures are valid and all keys are expired. + + `GPG_ERR_CERT_REVOKED' + This status indicates that the signature is valid but + the key used to verify the signature has been revoked. + For the combined result this status means that all + signatures are valid and all keys are revoked. + + `GPG_ERR_BAD_SIGNATURE' + This status indicates that the signature is invalid. + For the combined result this status means that all + signatures are invalid. + + `GPG_ERR_NO_PUBKEY' + This status indicates that the signature could not be + verified due to a missing key. For the combined + result this status means that all signatures could not + be checked due to missing keys. + + `GPG_ERR_GENERAL' + This status indicates that there was some other error + which prevented the signature verification. + + `gpgme_sig_notation_t notations' + This is a linked list with the notation data and policy URLs. + + `unsigned long timestamp' + The creation timestamp of this signature. + + `unsigned long exp_timestamp' + The expiration timestamp of this signature, or 0 if the + signature does not expire. + + `unsigned int wrong_key_usage : 1' + This is true if the key was not used according to its policy. + + `unsigned int pka_trust : 2' + This is set to the trust information gained by means of the + PKA system. Values are: + `0' + No PKA information available or verification not + possible. + + `1' + PKA verification failed. + + `2' + PKA verification succeeded. + + `3' + Reserved for future use. + Depending on the configuration of the engine, this metric may + also be reflected by the validity of the signature. + + `unsigned int chain_model : 1' + This is true if the validity of the signature has been + checked using the chain model. In the chain model the time + the signature has been created must be within the validity + period of the certificate and the time the certificate itself + has been created must be within the validity period of the + issuing certificate. In contrast the default validation model + checks the validity of signature as well at the entire + certificate chain at the current time. + + `gpgme_validity_t validity' + The validity of the signature. + + `gpgme_error_t validity_reason' + If a signature is not valid, this provides a reason why. + + `gpgme_pubkey_algo_t' + The public key algorithm used to create this signature. + + `gpgme_hash_algo_t' + The hash algorithm used to create this signature. + + -- Data type: gpgme_verify_result_t + This is a pointer to a structure used to store the result of a + `gpgme_op_verify' operation. After verifying a signature, you can + retrieve the pointer to the result with `gpgme_op_verify_result'. + If the operation failed this might be a `NULL' pointer. The + structure contains the following member: + + `gpgme_signature_t signatures' + A linked list with information about all signatures for which + a verification was attempted. + + `char *file_name' + This is the filename of the original plaintext message file + if it is known, otherwise this is a null pointer. + + -- Function: gpgme_verify_result_t gpgme_op_verify_result + (gpgme_ctx_t CTX) + The function `gpgme_op_verify_result' returns a + `gpgme_verify_result_t' pointer to a structure holding the result + of a `gpgme_op_verify' operation. The pointer is only valid if + the last operation on the context was a `gpgme_op_verify', + `gpgme_op_verify_start', `gpgme_op_decrypt_verify' or + `gpgme_op_decrypt_verify_start' operation, and if this operation + finished successfully (for `gpgme_op_decrypt_verify' and + `gpgme_op_decrypt_verify_start', the error code `GPG_ERR_NO_DATA' + counts as successful in this context). The returned pointer is + only valid until the next operation is started on the context. + + The following interfaces are deprecated and only provided for +backward compatibility. Don't use them. They will be removed in a +future version of GPGME. + + -- Data type: enum gpgme_sig_stat_t + The `gpgme_sig_stat_t' type holds the result of a signature check, + or the combined result of all signatures. The following results + are possible: + + `GPGME_SIG_STAT_NONE' + This status should not occur in normal operation. + + `GPGME_SIG_STAT_GOOD' + This status indicates that the signature is valid. For the + combined result this status means that all signatures are + valid. + + `GPGME_SIG_STAT_GOOD_EXP' + This status indicates that the signature is valid but + expired. For the combined result this status means that all + signatures are valid and expired. + + `GPGME_SIG_STAT_GOOD_EXPKEY' + This status indicates that the signature is valid but the key + used to verify the signature has expired. For the combined + result this status means that all signatures are valid and + all keys are expired. + + `GPGME_SIG_STAT_BAD' + This status indicates that the signature is invalid. For the + combined result this status means that all signatures are + invalid. + + `GPGME_SIG_STAT_NOKEY' + This status indicates that the signature could not be + verified due to a missing key. For the combined result this + status means that all signatures could not be checked due to + missing keys. + + `GPGME_SIG_STAT_NOSIG' + This status indicates that the signature data provided was + not a real signature. + + `GPGME_SIG_STAT_ERROR' + This status indicates that there was some other error which + prevented the signature verification. + + `GPGME_SIG_STAT_DIFF' + For the combined result this status means that at least two + signatures have a different status. You can get each key's + status with `gpgme_get_sig_status'. + + -- Function: const char * gpgme_get_sig_status (gpgme_ctx_t CTX, + int IDX, gpgme_sig_stat_t *R_STAT, time_t *R_CREATED) + The function `gpgme_get_sig_status' is equivalent to: + + gpgme_verify_result_t result; + gpgme_signature_t sig; + + result = gpgme_op_verify_result (ctx); + sig = result->signatures; + + while (sig && idx) + { + sig = sig->next; + idx--; + } + if (!sig || idx) + return NULL; + + if (r_stat) + { + switch (gpg_err_code (sig->status)) + { + case GPG_ERR_NO_ERROR: + *r_stat = GPGME_SIG_STAT_GOOD; + break; + + case GPG_ERR_BAD_SIGNATURE: + *r_stat = GPGME_SIG_STAT_BAD; + break; + + case GPG_ERR_NO_PUBKEY: + *r_stat = GPGME_SIG_STAT_NOKEY; + break; + + case GPG_ERR_NO_DATA: + *r_stat = GPGME_SIG_STAT_NOSIG; + break; + + case GPG_ERR_SIG_EXPIRED: + *r_stat = GPGME_SIG_STAT_GOOD_EXP; + break; + + case GPG_ERR_KEY_EXPIRED: + *r_stat = GPGME_SIG_STAT_GOOD_EXPKEY; + break; + + default: + *r_stat = GPGME_SIG_STAT_ERROR; + break; + } + } + if (r_created) + *r_created = sig->timestamp; + return sig->fpr; + + -- Function: const char * gpgme_get_sig_string_attr (gpgme_ctx_t CTX, + int IDX, gpgme_attr_t WHAT, int WHATIDX) + The function `gpgme_get_sig_string_attr' is equivalent to: + + gpgme_verify_result_t result; + gpgme_signature_t sig; + + result = gpgme_op_verify_result (ctx); + sig = result->signatures; + + while (sig && idx) + { + sig = sig->next; + idx--; + } + if (!sig || idx) + return NULL; + + switch (what) + { + case GPGME_ATTR_FPR: + return sig->fpr; + + case GPGME_ATTR_ERRTOK: + if (whatidx == 1) + return sig->wrong_key_usage ? "Wrong_Key_Usage" : ""; + else + return ""; + default: + break; + } + + return NULL; + + -- Function: const char * gpgme_get_sig_ulong_attr (gpgme_ctx_t CTX, + int IDX, gpgme_attr_t WAHT, int WHATIDX) + The function `gpgme_get_sig_ulong_attr' is equivalent to: + + gpgme_verify_result_t result; + gpgme_signature_t sig; + + result = gpgme_op_verify_result (ctx); + sig = result->signatures; + + while (sig && idx) + { + sig = sig->next; + idx--; + } + if (!sig || idx) + return 0; + + switch (what) + { + case GPGME_ATTR_CREATED: + return sig->timestamp; + + case GPGME_ATTR_EXPIRE: + return sig->exp_timestamp; + + case GPGME_ATTR_VALIDITY: + return (unsigned long) sig->validity; + + case GPGME_ATTR_SIG_STATUS: + switch (sig->status) + { + case GPG_ERR_NO_ERROR: + return GPGME_SIG_STAT_GOOD; + + case GPG_ERR_BAD_SIGNATURE: + return GPGME_SIG_STAT_BAD; + + case GPG_ERR_NO_PUBKEY: + return GPGME_SIG_STAT_NOKEY; + + case GPG_ERR_NO_DATA: + return GPGME_SIG_STAT_NOSIG; + + case GPG_ERR_SIG_EXPIRED: + return GPGME_SIG_STAT_GOOD_EXP; + + case GPG_ERR_KEY_EXPIRED: + return GPGME_SIG_STAT_GOOD_EXPKEY; + + default: + return GPGME_SIG_STAT_ERROR; + } + + case GPGME_ATTR_SIG_SUMMARY: + return sig->summary; + + default: + break; + } + return 0; + + -- Function: const char * gpgme_get_sig_key (gpgme_ctx_t CTX, int IDX, + gpgme_key_t *R_KEY) + The function `gpgme_get_sig_key' is equivalent to: + + gpgme_verify_result_t result; + gpgme_signature_t sig; + + result = gpgme_op_verify_result (ctx); + sig = result->signatures; + + while (sig && idx) + { + sig = sig->next; + idx--; + } + if (!sig || idx) + return gpg_error (GPG_ERR_EOF); + + return gpgme_get_key (ctx, sig->fpr, r_key, 0); + + +File: gpgme.info, Node: Decrypt and Verify, Next: Sign, Prev: Verify, Up: Crypto Operations + +7.7.3 Decrypt and Verify +------------------------ + + -- Function: gpgme_error_t gpgme_op_decrypt_verify (gpgme_ctx_t CTX, + gpgme_data_t CIPHER, gpgme_data_t PLAIN) + The function `gpgme_op_decrypt_verify' decrypts the ciphertext in + the data object CIPHER and stores it into the data object PLAIN. + If CIPHER contains signatures, they will be verified. + + After the operation completed, `gpgme_op_decrypt_result' and + `gpgme_op_verify_result' can be used to retrieve more information + about the signatures. + + If the error code `GPG_ERR_NO_DATA' is returned, CIPHER does not + contain any data to decrypt. However, it might still be signed. + The information about detected signatures is available with + `gpgme_op_verify_result' in this case. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + ciphertext could be decrypted successfully, `GPG_ERR_INV_VALUE' if + CTX, CIPHER or PLAIN is not a valid pointer, `GPG_ERR_NO_DATA' if + CIPHER does not contain any data to decrypt, + `GPG_ERR_DECRYPT_FAILED' if CIPHER is not a valid cipher text, + `GPG_ERR_BAD_PASSPHRASE' if the passphrase for the secret key + could not be retrieved, and passes through any errors that are + reported by the crypto engine support routines. + + -- Function: gpgme_error_t gpgme_op_decrypt_verify (gpgme_ctx_t CTX, + gpgme_data_t CIPHER, gpgme_data_t PLAIN) + The function `gpgme_op_decrypt_verify_start' initiates a + `gpgme_op_decrypt_verify' operation. It can be completed by + calling `gpgme_wait' on the context. *Note Waiting For + Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation could be started successfully, `GPG_ERR_INV_VALUE' if + CTX, CIPHER, PLAIN or R_STAT is not a valid pointer, and + `GPG_ERR_NO_DATA' if CIPHER does not contain any data to decrypt. + + +File: gpgme.info, Node: Sign, Next: Encrypt, Prev: Decrypt and Verify, Up: Crypto Operations + +7.7.4 Sign +---------- + +A signature can contain signatures by one or more keys. The set of +keys used to create a signatures is contained in a context, and is +applied to all following signing operations in this context (until the +set is changed). + +* Menu: + +* Selecting Signers:: How to choose the keys to sign with. +* Creating a Signature:: How to create a signature. +* Signature Notation Data:: How to add notation data to a signature. + + +File: gpgme.info, Node: Selecting Signers, Next: Creating a Signature, Up: Sign + +7.7.4.1 Selecting Signers +......................... + + -- Function: void gpgme_signers_clear (gpgme_ctx_t CTX) + The function `gpgme_signers_clear' releases a reference for each + key on the signers list and removes the list of signers from the + context CTX. + + Every context starts with an empty list. + + -- Function: gpgme_error_t gpgme_signers_add (gpgme_ctx_t CTX, + const gpgme_key_t KEY) + The function `gpgme_signers_add' adds the key KEY to the list of + signers in the context CTX. + + Calling this function acquires an additional reference for the key. + + -- Function: gpgme_key_t gpgme_signers_enum (const gpgme_ctx_t CTX, + int SEQ) + The function `gpgme_signers_enum' returns the SEQth key in the + list of signers in the context CTX. An additional reference is + acquired for the user. + + If SEQ is out of range, `NULL' is returned. + + +File: gpgme.info, Node: Creating a Signature, Next: Signature Notation Data, Prev: Selecting Signers, Up: Sign + +7.7.4.2 Creating a Signature +............................ + + -- Data type: enum gpgme_sig_mode_t + The `gpgme_sig_mode_t' type is used to specify the desired type of + a signature. The following modes are available: + + `GPGME_SIG_MODE_NORMAL' + A normal signature is made, the output includes the plaintext + and the signature. + + `GPGME_SIG_MODE_DETACH' + A detached signature is made. + + `GPGME_SIG_MODE_CLEAR' + A clear text signature is made. The ASCII armor and text + mode settings of the context are ignored. + + -- Function: gpgme_error_t gpgme_op_sign (gpgme_ctx_t CTX, + gpgme_data_t PLAIN, gpgme_data_t SIG, gpgme_sig_mode_t MODE) + The function `gpgme_op_sign' creates a signature for the text in + the data object PLAIN and returns it in the data object SIG. The + type of the signature created is determined by the ASCII armor + (or, if that is not set, by the encoding specified for SIG), the + text mode attributes set for the context CTX and the requested + signature mode MODE. + + After the operation completed successfully, the result can be + retrieved with `gpgme_op_sign_result'. + + If an S/MIME signed message is created using the CMS crypto engine, + the number of certificates to include in the message can be + specified with `gpgme_set_include_certs'. *Note Included + Certificates::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + signature could be created successfully, `GPG_ERR_INV_VALUE' if + CTX, PLAIN or SIG is not a valid pointer, `GPG_ERR_NO_DATA' if the + signature could not be created, `GPG_ERR_BAD_PASSPHRASE' if the + passphrase for the secret key could not be retrieved, + `GPG_ERR_UNUSABLE_SECKEY' if there are invalid signers, and passes + through any errors that are reported by the crypto engine support + routines. + + -- Function: gpgme_error_t gpgme_op_sign_start (gpgme_ctx_t CTX, + gpgme_data_t PLAIN, gpgme_data_t SIG, gpgme_sig_mode_t MODE) + The function `gpgme_op_sign_start' initiates a `gpgme_op_sign' + operation. It can be completed by calling `gpgme_wait' on the + context. *Note Waiting For Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation could be started successfully, and `GPG_ERR_INV_VALUE' + if CTX, PLAIN or SIG is not a valid pointer. + + -- Data type: gpgme_new_signature_t + This is a pointer to a structure used to store a part of the + result of a `gpgme_op_sign' operation. The structure contains the + following members: + + `gpgme_new_signature_t next' + This is a pointer to the next new signature structure in the + linked list, or `NULL' if this is the last element. + + `gpgme_sig_mode_t type' + The type of this signature. + + `gpgme_pubkey_algo_t' + The public key algorithm used to create this signature. + + `gpgme_hash_algo_t' + The hash algorithm used to create this signature. + + `unsigned int sig_class' + The signature class of this signature. + + `long int timestamp' + The creation timestamp of this signature. + + `char *fpr' + The fingerprint of the key which was used to create this + signature. + + -- Data type: gpgme_sign_result_t + This is a pointer to a structure used to store the result of a + `gpgme_op_sign' operation. After successfully generating a + signature, you can retrieve the pointer to the result with + `gpgme_op_sign_result'. The structure contains the following + members: + + `gpgme_invalid_key_t invalid_signers' + A linked list with information about all invalid keys for + which a signature could not be created. + + `gpgme_new_signature_t signatures' + A linked list with information about all signatures created. + + -- Function: gpgme_sign_result_t gpgme_op_sign_result (gpgme_ctx_t CTX) + The function `gpgme_op_sign_result' returns a + `gpgme_sign_result_t' pointer to a structure holding the result of + a `gpgme_op_sign' operation. The pointer is only valid if the + last operation on the context was a `gpgme_op_sign', + `gpgme_op_sign_start', `gpgme_op_encrypt_sign' or + `gpgme_op_encrypt_sign_start' operation. If that operation + failed, the function might return a `NULL' pointer. The returned + pointer is only valid until the next operation is started on the + context. + + +File: gpgme.info, Node: Signature Notation Data, Prev: Creating a Signature, Up: Sign + +7.7.4.3 Signature Notation Data +............................... + +Using the following functions, you can attach arbitrary notation data +to a signature. This information is then available to the user when +the signature is verified. + + -- Function: void gpgme_sig_notation_clear (gpgme_ctx_t CTX) + The function `gpgme_sig_notation_clear' removes the notation data + from the context CTX. Subsequent signing operations from this + context will not include any notation data. + + Every context starts with an empty notation data list. + + -- Function: gpgme_error_t gpgme_sig_notation_add (gpgme_ctx_t CTX, + const char *NAME, const char *VALUE, + gpgme_sig_notation_flags_t FLAGS) + The function `gpgme_sig_notation_add' adds the notation data with + the name NAME and the value VALUE to the context CTX. + + Subsequent signing operations will include this notation data, as + well as any other notation data that was added since the creation + of the context or the last `gpgme_sig_notation_clear' operation. + + The arguments NAME and VALUE must be `NUL'-terminated strings in + human-readable form. The flag `GPGME_SIG_NOTATION_HUMAN_READABLE' + is implied (non-human-readable notation data is currently not + supported). The strings must be in UTF-8 encoding. + + If NAME is `NULL', then VALUE should be a policy URL. + + The function `gpgme_sig_notation_add' returns the error code + `GPG_ERR_NO_ERROR' if the notation data could be added + successfully, `GPG_ERR_INV_VALUE' if CTX is not a valid pointer, + or if NAME, VALUE and FLAGS are an invalid combination. The + function also passes through any errors that are reported by the + crypto engine support routines. + + -- Function: gpgme_sig_notation_t gpgme_sig_notation_get + (const gpgme_ctx_t CTX) + The function `gpgme_sig_notation_get' returns the linked list of + notation data structures that are contained in the context CTX. + + If CTX is not a valid pointer, or there is no notation data added + for this context, `NULL' is returned. + + +File: gpgme.info, Node: Encrypt, Prev: Sign, Up: Crypto Operations + +7.7.5 Encrypt +------------- + +One plaintext can be encrypted for several recipients at the same time. +The list of recipients is created independently of any context, and +then passed to the encryption operation. + +* Menu: + +* Encrypting a Plaintext:: How to encrypt a plaintext. + + +File: gpgme.info, Node: Encrypting a Plaintext, Up: Encrypt + +7.7.5.1 Encrypting a Plaintext +.............................. + + -- Function: gpgme_error_t gpgme_op_encrypt (gpgme_ctx_t CTX, + gpgme_key_t RECP[], gpgme_encrypt_flags_t FLAGS, + gpgme_data_t PLAIN, gpgme_data_t CIPHER) + The function `gpgme_op_encrypt' encrypts the plaintext in the data + object PLAIN for the recipients RECP and stores the ciphertext in + the data object CIPHER. The type of the ciphertext created is + determined by the ASCII armor (or, if that is not set, by the + encoding specified for CIPHER) and the text mode attributes set + for the context CTX. + + KEY must be a `NULL'-terminated array of keys. The user must keep + references for all keys during the whole duration of the call (but + see `gpgme_op_encrypt_start' for the requirements with the + asynchronous variant). + + The value in FLAGS is a bitwise-or combination of one or multiple + of the following bit values: + + `GPGME_ENCRYPT_ALWAYS_TRUST' + The `GPGME_ENCRYPT_ALWAYS_TRUST' symbol specifies that all the + recipients in RECP should be trusted, even if the keys do not + have a high enough validity in the keyring. This flag should + be used with care; in general it is not a good idea to use + any untrusted keys. + + `GPGME_ENCRYPT_NO_ENCRYPT_TO' + The `GPGME_ENCRYPT_NO_ENCRYPT_TO' symbol specifies that no + default or hidden default recipients as configured in the + crypto backend should be included. This can be useful for + managing different user profiles. + + If `GPG_ERR_UNUSABLE_PUBKEY' is returned, some recipients in RECP + are invalid, but not all. In this case the plaintext might be + encrypted for all valid recipients and returned in CIPHER (if this + happens depends on the crypto engine). More information about the + invalid recipients is available with `gpgme_op_encrypt_result'. + + If RECP is `NULL', symmetric rather than public key encryption is + performed. Symmetrically encrypted cipher text can be deciphered + with `gpgme_op_decrypt'. Note that in this case the crypto + backend needs to retrieve a passphrase from the user. Symmetric + encryption is currently only supported for the OpenPGP crypto + backend. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + ciphertext could be created successfully, `GPG_ERR_INV_VALUE' if + CTX, RECP, PLAIN or CIPHER is not a valid pointer, + `GPG_ERR_UNUSABLE_PUBKEY' if RECP contains some invalid + recipients, `GPG_ERR_BAD_PASSPHRASE' if the passphrase for the + symmetric key could not be retrieved, and passes through any + errors that are reported by the crypto engine support routines. + + -- Function: gpgme_error_t gpgme_op_encrypt_start (gpgme_ctx_t CTX, + gpgme_key_t RECP[], gpgme_encrypt_flags_t FLAGS, + gpgme_data_t PLAIN, gpgme_data_t CIPHER) + The function `gpgme_op_encrypt_start' initiates a + `gpgme_op_encrypt' operation. It can be completed by calling + `gpgme_wait' on the context. *Note Waiting For Completion::. + + References to the keys only need to be held for the duration of + this call. The user can release its references to the keys after + this function returns, even if the operation is not yet finished. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation could be started successfully, `GPG_ERR_INV_VALUE' if + CTX, RSET, PLAIN or CIPHER is not a valid pointer, and + `GPG_ERR_UNUSABLE_PUBKEY' if RSET does not contain any valid + recipients. + + -- Data type: gpgme_encrypt_result_t + This is a pointer to a structure used to store the result of a + `gpgme_op_encrypt' operation. After successfully encrypting data, + you can retrieve the pointer to the result with + `gpgme_op_encrypt_result'. The structure contains the following + members: + + `gpgme_invalid_key_t invalid_recipients' + A linked list with information about all invalid keys for + which the data could not be encrypted. + + -- Function: gpgme_encrypt_result_t gpgme_op_encrypt_result + (gpgme_ctx_t CTX) + The function `gpgme_op_encrypt_result' returns a + `gpgme_encrypt_result_t' pointer to a structure holding the result + of a `gpgme_op_encrypt' operation. The pointer is only valid if + the last operation on the context was a `gpgme_op_encrypt', + `gpgme_op_encrypt_start', `gpgme_op_sign' or `gpgme_op_sign_start' + operation. If this operation failed, this might be a `NULL' + pointer. The returned pointer is only valid until the next + operation is started on the context. + + -- Function: gpgme_error_t gpgme_op_encrypt_sign (gpgme_ctx_t CTX, + gpgme_key_t RECP[], gpgme_encrypt_flags_t FLAGS, + gpgme_data_t PLAIN, gpgme_data_t CIPHER) + The function `gpgme_op_encrypt_sign' does a combined encrypt and + sign operation. It is used like `gpgme_op_encrypt', but the + ciphertext also contains signatures for the signers listed in CTX. + + The combined encrypt and sign operation is currently only available + for the OpenPGP crypto engine. + + -- Function: gpgme_error_t gpgme_op_encrypt_sign_start + (gpgme_ctx_t CTX, gpgme_key_t RECP, + gpgme_encrypt_flags_t FLAGS, gpgme_data_t PLAIN, + gpgme_data_t CIPHER) + The function `gpgme_op_encrypt_sign_start' initiates a + `gpgme_op_encrypt_sign' operation. It can be completed by calling + `gpgme_wait' on the context. *Note Waiting For Completion::. + + The function returns the error code `GPG_ERR_NO_ERROR' if the + operation could be started successfully, and `GPG_ERR_INV_VALUE' + if CTX, RSET, PLAIN or CIPHER is not a valid pointer. + + +File: gpgme.info, Node: Run Control, Prev: Crypto Operations, Up: Contexts + +7.8 Run Control +=============== + +GPGME supports running operations synchronously and asynchronously. +You can use asynchronous operation to set up a context up to initiating +the desired operation, but delay performing it to a later point. + + Furthermore, you can use an external event loop to control exactly +when GPGME runs. This ensures that GPGME only runs when necessary and +also prevents it from blocking for a long time. + +* Menu: + +* Waiting For Completion:: Waiting until an operation is completed. +* Using External Event Loops:: Advanced control over what happens when. +* Cancellation:: How to end pending operations prematurely. + + +File: gpgme.info, Node: Waiting For Completion, Next: Using External Event Loops, Up: Run Control + +7.8.1 Waiting For Completion +---------------------------- + + -- Function: gpgme_ctx_t gpgme_wait (gpgme_ctx_t CTX, + gpgme_error_t *STATUS, int HANG) + The function `gpgme_wait' continues the pending operation within + the context CTX. In particular, it ensures the data exchange + between GPGME and the crypto backend and watches over the run time + status of the backend process. + + If HANG is true, the function does not return until the operation + is completed or cancelled. Otherwise the function will not block + for a long time. + + The error status of the finished operation is returned in STATUS + if `gpgme_wait' does not return `NULL'. + + The CTX argument can be `NULL'. In that case, `gpgme_wait' waits + for any context to complete its operation. + + `gpgme_wait' can be used only in conjunction with any context that + has a pending operation initiated with one of the + `gpgme_op_*_start' functions except `gpgme_op_keylist_start' and + `gpgme_op_trustlist_start' (for which you should use the + corresponding `gpgme_op_*_next' functions). If CTX is `NULL', all + of such contexts are waited upon and possibly returned. + Synchronous operations running in parallel, as well as key and + trust item list operations, do not affect `gpgme_wait'. + + In a multi-threaded environment, only one thread should ever call + `gpgme_wait' at any time, irregardless if CTX is specified or not. + This means that all calls to this function should be fully + synchronized by locking primitives. It is safe to start + asynchronous operations while a thread is running in `gpgme_wait'. + + The function returns the CTX of the context which has finished the + operation. If HANG is false, and the timeout expires, `NULL' is + returned and `*status' will be set to 0. If an error occurs, + `NULL' is returned and the error is returned in `*status'. + + +File: gpgme.info, Node: Using External Event Loops, Next: Cancellation, Prev: Waiting For Completion, Up: Run Control + +7.8.2 Using External Event Loops +-------------------------------- + +GPGME hides the complexity of the communication between the library and +the crypto engine. The price of this convenience is that the calling +thread can block arbitrary long waiting for the data returned by the +crypto engine. In single-threaded programs, in particular if they are +interactive, this is an unwanted side-effect. OTOH, if `gpgme_wait' is +used without the HANG option being enabled, it might be called +unnecessarily often, wasting CPU time that could be used otherwise. + + The I/O callback interface described in this section lets the user +take control over what happens when. GPGME will provide the user with +the file descriptors that should be monitored, and the callback +functions that should be invoked when a file descriptor is ready for +reading or writing. It is then the user's responsibility to decide +when to check the file descriptors and when to invoke the callback +functions. Usually this is done in an event loop, that also checks for +events in other parts of the program. If the callback functions are +only called when the file descriptors are ready, GPGME will never +block. This gives the user more control over the program flow, and +allows to perform other tasks when GPGME would block otherwise. + + By using this advanced mechanism, GPGME can be integrated smoothly +into GUI toolkits like GTK+ even for single-threaded programs. + +* Menu: + +* I/O Callback Interface:: How I/O callbacks are registered. +* Registering I/O Callbacks:: How to use I/O callbacks for a context. +* I/O Callback Example:: An example how to use I/O callbacks. +* I/O Callback Example GTK+:: How to use GPGME with GTK+. +* I/O Callback Example GDK:: How to use GPGME with GDK. +* I/O Callback Example Qt:: How to use GPGME with Qt. + + +File: gpgme.info, Node: I/O Callback Interface, Next: Registering I/O Callbacks, Up: Using External Event Loops + +7.8.2.1 I/O Callback Interface +.............................. + + -- Data type: gpgme_error_t (*gpgme_io_cb_t) (void *DATA, int FD) + The `gpgme_io_cb_t' type is the type of functions which GPGME + wants to register as I/O callback handlers using the + `gpgme_register_io_cb_t' functions provided by the user. + + DATA and FD are provided by GPGME when the I/O callback handler is + registered, and should be passed through to the handler when it is + invoked by the user because it noticed activity on the file + descriptor FD. + + The callback handler always returns `0', but you should consider + the return value to be reserved for later use. + + -- Data type: gpgme_error_t (*gpgme_register_io_cb_t) (void *DATA, +int FD, int DIR, gpgme_io_cb_t FNC, void *FNC_DATA, void **TAG) + The `gpgme_register_io_cb_t' type is the type of functions which + can be called by GPGME to register an I/O callback function FNC + for the file descriptor FD with the user. FNC_DATA should be + passed as the first argument to FNC when the handler is invoked + (the second argument should be FD). If DIR is 0, FNC should be + called by the user when FD is ready for writing. If DIR is 1, FNC + should be called when FD is ready for reading. + + DATA was provided by the user when registering the + `gpgme_register_io_cb_t' function with GPGME and will always be + passed as the first argument when registering a callback function. + For example, the user can use this to determine the event loop to + which the file descriptor should be added. + + GPGME will call this function when a crypto operation is initiated + in a context for which the user has registered I/O callback + handler functions with `gpgme_set_io_cbs'. It can also call this + function when it is in an I/O callback handler for a file + descriptor associated to this context. + + The user should return a unique handle in TAG identifying this I/O + callback registration, which will be passed to the + `gpgme_register_io_cb_t' function without interpretation when the + file descriptor should not be monitored anymore. + + -- Data type: void (*gpgme_remove_io_cb_t) (void *TAG) + The `gpgme_remove_io_cb_t' type is the type of functions which can + be called by GPGME to remove an I/O callback handler that was + registered before. TAG is the handle that was returned by the + `gpgme_register_io_cb_t' for this I/O callback. + + GPGME can call this function when a crypto operation is in an I/O + callback. It will also call this function when the context is + destroyed while an operation is pending. + + -- Data type: enum gpgme_event_io_t + The `gpgme_event_io_t' type specifies the type of an event that is + reported to the user by GPGME as a consequence of an I/O + operation. The following events are defined: + + `GPGME_EVENT_START' + The operation is fully initialized now, and you can start to + run the registered I/O callback handlers now. Note that + registered I/O callback handlers must not be run before this + event is signalled. TYPE_DATA is `NULL' and reserved for + later use. + + `GPGME_EVENT_DONE' + The operation is finished, the last I/O callback for this + operation was removed. The accompanying TYPE_DATA points to a + `gpgme_error_t' variable that contains the status of the + operation that finished. This event is signalled after the + last I/O callback has been removed. + + `GPGME_EVENT_NEXT_KEY' + In a `gpgme_op_keylist_start' operation, the next key was + received from the crypto engine. The accompanying TYPE_DATA + is a `gpgme_key_t' variable that contains the key with one + reference for the user. + + `GPGME_EVENT_NEXT_TRUSTITEM' + In a `gpgme_op_trustlist_start' operation, the next trust item + was received from the crypto engine. The accompanying + TYPE_DATA is a `gpgme_trust_item_t' variable that contains + the trust item with one reference for the user. + + -- Data type: void (*gpgme_event_io_cb_t) (void *DATA, +gpgme_event_io_t TYPE, void *TYPE_DATA) + The `gpgme_event_io_cb_t' type is the type of functions which can + be called by GPGME to signal an event for an operation running in + a context which has I/O callback functions registered by the user. + + DATA was provided by the user when registering the + `gpgme_event_io_cb_t' function with GPGME and will always be + passed as the first argument when registering a callback function. + For example, the user can use this to determine the context in + which this event has occured. + + TYPE will specify the type of event that has occured. TYPE_DATA + specifies the event further, as described in the above list of + possible `gpgme_event_io_t' types. + + GPGME can call this function in an I/O callback handler. + + +File: gpgme.info, Node: Registering I/O Callbacks, Next: I/O Callback Example, Prev: I/O Callback Interface, Up: Using External Event Loops + +7.8.2.2 Registering I/O Callbacks +................................. + + -- Data type: struct gpgme_io_cb_ts + This structure is used to store the I/O callback interface + functions described in the previous section. It has the following + members: + + `gpgme_register_io_cb_t add' + This is the function called by GPGME to register an I/O + callback handler. It must be specified. + + `void *add_data' + This is passed as the first argument to the `add' function + when it is called by GPGME. For example, it can be used to + determine the event loop to which the file descriptor should + be added. + + `gpgme_remove_io_cb_t remove' + This is the function called by GPGME to remove an I/O + callback handler. It must be specified. + + `gpgme_event_io_cb_t event' + This is the function called by GPGME to signal an event for + an operation. It must be specified, because at least the + start event must be processed. + + `void *event_data' + This is passed as the first argument to the `event' function + when it is called by GPGME. For example, it can be used to + determine the context in which the event has occured. + + -- Function: void gpgme_set_io_cbs (gpgme_ctx_t CTX, + struct gpgme_io_cb_ts *IO_CBS) + The function `gpgme_set_io_cbs' enables the I/O callback interface + for the context CTX. The I/O callback functions are specified by + IO_CBS. + + If IO_CBS->`add' is `NULL', the I/O callback interface is disabled + for the context, and normal operation is restored. + + -- Function: void gpgme_get_io_cbs (gpgme_ctx_t CTX, + struct gpgme_io_cb_ts *IO_CBS) + The function `gpgme_get_io_cbs' returns the I/O callback functions + set with `gpgme_set_io_cbs' in IO_CBS. + + +File: gpgme.info, Node: I/O Callback Example, Next: I/O Callback Example GTK+, Prev: Registering I/O Callbacks, Up: Using External Event Loops + +7.8.2.3 I/O Callback Example +............................ + +To actually use an external event loop, you have to implement the I/O +callback functions that are used by GPGME to register and unregister +file descriptors. Furthermore, you have to actually monitor these file +descriptors for activity and call the appropriate I/O callbacks. + + The following example illustrates how to do that. The example uses +locking to show in which way the callbacks and the event loop can run +concurrently. For the event loop, we use a fixed array. For a +real-world implementation, you should use a dynamically sized structure +because the number of file descriptors needed for a crypto operation in +GPGME is not predictable. + + #include <assert.h> + #include <errno.h> + #include <stdlib.h> + #include <pthread.h> + #include <sys/types.h> + #include <gpgme.h> + + /* The following structure holds the result of a crypto operation. */ + struct op_result + { + int done; + gpgme_error_t err; + }; + + /* The following structure holds the data associated with one I/O + callback. */ + struct one_fd + { + int fd; + int dir; + gpgme_io_cb_t fnc; + void *fnc_data; + void *loop; + }; + + struct event_loop + { + pthread_mutex_t lock; + #define MAX_FDS 32 + /* Unused slots are marked with FD being -1. */ + struct one_fd fds[MAX_FDS]; + }; + + The following functions implement the I/O callback interface. + + gpgme_error_t + add_io_cb (void *data, int fd, int dir, gpgme_io_cb_t fnc, void *fnc_data, + void **r_tag) + { + struct event_loop *loop = data; + struct one_fd *fds = loop->fds; + int i; + + pthread_mutex_lock (&loop->lock); + for (i = 0; i < MAX_FDS; i++) + { + if (fds[i].fd == -1) + { + fds[i].fd = fd; + fds[i].dir = dir; + fds[i].fnc = fnc; + fds[i].fnc_data = fnc_data; + fds[i].loop = loop; + break; + } + } + pthread_mutex_unlock (&loop->lock); + if (i == MAX_FDS) + return gpg_error (GPG_ERR_GENERAL); + *r_tag = &fds[i]; + return 0; + } + + void + remove_io_cb (void *tag) + { + struct one_fd *fd = tag; + struct event_loop *loop = fd->loop; + + pthread_mutex_lock (&loop->lock); + fd->fd = -1; + pthread_mutex_unlock (&loop->lock); + } + + void + event_io_cb (void *data, gpgme_event_io_t type, void *type_data) + { + struct op_result *result = data; + + /* We don't support list operations here. */ + if (type == GPGME_EVENT_DONE) + { + result->done = 1; + result->err = *type_data; + } + } + + The final missing piece is the event loop, which will be presented +next. We only support waiting for the success of a single operation. + + int + do_select (struct event_loop *loop) + { + fd_set rfds; + fd_set wfds; + int i, n; + int any = 0; + struct one_fd *fdlist = loop->fds; + + pthread_mutex_lock (&loop->lock); + FD_ZERO (&rfds); + FD_ZERO (&wfds); + for (i = 0; i < MAX_FDS; i++) + if (fdlist[i].fd != -1) + FD_SET (fdlist[i].fd, fdlist[i].dir ? &rfds : &wfds); + pthread_mutex_unlock (&loop->unlock); + + do + { + n = select (FD_SETSIZE, &rfds, &wfds, NULL, 0); + } + while (n < 0 && errno == EINTR); + + if (n < 0) + return n; /* Error or timeout. */ + + pthread_mutex_lock (&loop->lock); + for (i = 0; i < MAX_FDS && n; i++) + { + if (fdlist[i].fd != -1) + { + if (FD_ISSET (fdlist[i].fd, fdlist[i].dir ? &rfds : &wfds)) + { + assert (n); + n--; + any = 1; + /* The I/O callback handler can register/remove callbacks, + so we have to unlock the file descriptor list. */ + pthread_mutex_unlock (&loop->lock); + (*fdlist[i].fnc) (fdlist[i].fnc_data, fdlist[i].fd); + pthread_mutex_lock (&loop->lock); + } + } + } + pthread_mutex_unlock (&loop->lock); + return any; + } + + void + wait_for_op (struct event_loop *loop, struct op_result *result) + { + int ret; + + do + { + ret = do_select (loop); + } + while (ret >= 0 && !result->done); + } + + The main function shows how to put it all together. + + int + main (int argc, char *argv[]) + { + struct event_loop loop; + struct op_result result; + gpgme_ctx_t ctx; + gpgme_error_t err; + gpgme_data_t sig, text; + int i; + struct gpgme_io_cb_ts io_cbs = + { + add_io_cb, + &loop, + remove_io_cb, + event_io_cb, + &result + }; + + init_gpgme (void); + + /* Initialize the loop structure. */ + pthread_mutex_init (&loop.lock, NULL); + for (i = 0; i < MAX_FDS; i++) + loop->fds[i].fd = -1; + + /* Initialize the result structure. */ + result.done = 0; + + err = gpgme_data_new_from_file (&sig, "signature", 1); + if (!err) + err = gpgme_data_new_from_file (&text, "text", 1); + if (!err) + err = gpgme_new (&ctx); + if (!err) + { + gpgme_set_io_cbs (ctx, &io_cbs); + err = gpgme_op_verify_start (ctx, sig, text, NULL); + } + if (err) + { + fprintf (stderr, "gpgme error: %s: %s\n", + gpgme_strsource (err), gpgme_strerror (err)); + exit (1); + } + + wait_for_op (&loop, &result); + if (!result.done) + { + fprintf (stderr, "select error\n"); + exit (1); + } + if (!result.err) + { + fprintf (stderr, "verification failed: %s: %s\n", + gpgme_strsource (result.err), gpgme_strerror (result.err)); + exit (1); + } + /* Evaluate verify result. */ + ... + return 0; + } + + +File: gpgme.info, Node: I/O Callback Example GTK+, Next: I/O Callback Example GDK, Prev: I/O Callback Example, Up: Using External Event Loops + +7.8.2.4 I/O Callback Example GTK+ +................................. + +The I/O callback interface can be used to integrate GPGME with the GTK+ +event loop. The following code snippets shows how this can be done +using the appropriate register and remove I/O callback functions. In +this example, the private data of the register I/O callback function is +unused. The event notifications is missing because it does not require +any GTK+ specific setup. + + #include <gtk/gtk.h> + + struct my_gpgme_io_cb + { + gpgme_io_cb_t fnc; + void *fnc_data; + guint input_handler_id + }; + + void + my_gpgme_io_cb (gpointer data, gint source, GdkInputCondition condition) + { + struct my_gpgme_io_cb *iocb = data; + (*(iocb->fnc)) (iocb->data, source); + } + + void + my_gpgme_remove_io_cb (void *data) + { + struct my_gpgme_io_cb *iocb = data; + gtk_input_remove (data->input_handler_id); + } + + void + my_gpgme_register_io_callback (void *data, int fd, int dir, gpgme_io_cb_t fnc, + void *fnc_data, void **tag) + { + struct my_gpgme_io_cb *iocb = g_malloc (sizeof (struct my_gpgme_io_cb)); + iocb->fnc = fnc; + iocb->data = fnc_data; + iocb->input_handler_id = gtk_input_add_full (fd, dir + ? GDK_INPUT_READ + : GDK_INPUT_WRITE, + my_gpgme_io_callback, + 0, iocb, NULL); + *tag = iocb; + return 0; + } + + +File: gpgme.info, Node: I/O Callback Example GDK, Next: I/O Callback Example Qt, Prev: I/O Callback Example GTK+, Up: Using External Event Loops + +7.8.2.5 I/O Callback Example GDK +................................ + +The I/O callback interface can also be used to integrate GPGME with the +GDK event loop. The following code snippets shows how this can be done +using the appropriate register and remove I/O callback functions. In +this example, the private data of the register I/O callback function is +unused. The event notifications is missing because it does not require +any GDK specific setup. + + It is very similar to the GTK+ example in the previous section. + + #include <gdk/gdk.h> + + struct my_gpgme_io_cb + { + gpgme_io_cb_t fnc; + void *fnc_data; + gint tag; + }; + + void + my_gpgme_io_cb (gpointer data, gint source, GdkInputCondition condition) + { + struct my_gpgme_io_cb *iocb = data; + (*(iocb->fnc)) (iocb->data, source); + } + + void + my_gpgme_remove_io_cb (void *data) + { + struct my_gpgme_io_cb *iocb = data; + gdk_input_remove (data->tag); + } + + void + my_gpgme_register_io_callback (void *data, int fd, int dir, gpgme_io_cb_t fnc, + void *fnc_data, void **tag) + { + struct my_gpgme_io_cb *iocb = g_malloc (sizeof (struct my_gpgme_io_cb)); + iocb->fnc = fnc; + iocb->data = fnc_data; + iocb->tag = gtk_input_add_full (fd, dir ? GDK_INPUT_READ : GDK_INPUT_WRITE, + my_gpgme_io_callback, iocb, NULL); + *tag = iocb; + return 0; + } + + +File: gpgme.info, Node: I/O Callback Example Qt, Prev: I/O Callback Example GDK, Up: Using External Event Loops + +7.8.2.6 I/O Callback Example Qt +............................... + +The I/O callback interface can also be used to integrate GPGME with the +Qt event loop. The following code snippets show how this can be done +using the appropriate register and remove I/O callback functions. In +this example, the private data of the register I/O callback function is +unused. The event notifications is missing because it does not require +any Qt specific setup. + + #include <qsocketnotifier.h> + #include <qapplication.h> + + struct IOCB { + IOCB( GpgmeIOCb f, void * d, QSocketNotifier * n ) + : func( f ), data( d ), notifier( n ) {} + GpgmeIOCb func; + void * data; + QSocketNotifier * notifier; + } + + class MyApp : public QApplication { + + // ... + + static void registerGpgmeIOCallback( void * data, int fd, int dir, + GpgmeIOCb func, void * func_data, + void ** tag ) { + QSocketNotifier * n = + new QSocketNotifier( fd, dir ? QSocketNotifier::Read + : QSocketNotifier::Write ); + connect( n, SIGNAL(activated(int)), + qApp, SLOT(slotGpgmeIOCallback(int)) ); + qApp->mIOCBs.push_back( IOCB( func, func_data, n ) ); + *tag = (void*)n; + } + + static void removeGpgmeIOCallback( void * tag ) { + if ( !tag ) return; + QSocketNotifier * n = static_cast<QSocketNotifier*>( tag ); + for ( QValueList<IOCB>::iterator it = qApp->mIOCBs.begin() ; + it != qApp->mIOCBs.end() ; ++it ) + if ( it->notifier == n ) { + delete it->notifier; + qApp->mIOCBs.erase( it ); + return; + } + } + + public slots: + void slotGpgmeIOCallback( int fd ) { + for ( QValueList<IOCB>::const_iterator it = mIOCBs.begin() ; + it != mIOCBs.end() ; ++it ) + if ( it->notifier && it->notifier->socket() == fd ) + (*(it->func)) ( it->func_data, fd ); + } + + // ... + + private: + QValueList<IOCB> mIOCBs; + // ... + }; + + +File: gpgme.info, Node: Cancellation, Prev: Using External Event Loops, Up: Run Control + +7.8.3 Cancellation +------------------ + +Sometimes you do not want to wait for an operation to finish. GPGME +provides two different functions to achieve that. The function +`gpgme_cancel' takes effect immediately. When it returns, the +operation is effectively canceled. However, it has some limitations +and can not be used with synchronous operations. In contrast, the +function `gpgme_cancel_async' can be used with any context and from any +thread, but it is not guaranteed to take effect immediately. Instead, +cancellation occurs at the next possible time (typically the next time +I/O occurs in the target context). + + -- Function: gpgme_ctx_t gpgme_cancel (gpgme_ctx_t CTX) + The function `gpgme_cancel' attempts to cancel a pending operation + in the context CTX. This only works if you use the global event + loop or your own event loop. + + If you use the global event loop, you must not call `gpgme_wait' + or `gpgme_wait' during cancellation. After successful + cancellation, you can call `gpgme_wait' (optionally waiting on + CTX), and the context CTX will appear as if it had finished with + the error code `GPG_ERR_CANCEL'. + + If you use your an external event loop, you must ensure that no I/O + callbacks are invoked for this context (for example by halting the + event loop). On successful cancellation, all registered I/O + callbacks for this context will be unregistered, and a + `GPGME_EVENT_DONE' event with the error code `GPG_ERR_CANCEL' will + be signaled. + + The function returns an error code if the cancellation failed (in + this case the state of CTX is not modified). + + -- Function: gpgme_ctx_t gpgme_cancel_async (gpgme_ctx_t CTX) + The function `gpgme_cancel' attempts to cancel a pending operation + in the context CTX. This can be called by any thread at any time + after starting an operation on the context, but will not take + effect immediately. The actual cancellation happens at the next + time GPGME processes I/O in that context. + + The function returns an error code if the cancellation failed (in + this case the state of CTX is not modified). + + +File: gpgme.info, Node: UI Server Protocol, Next: Library Copying, Prev: Contexts, Up: Top + +Appendix A The GnuPG UI Server Protocol +*************************************** + +This section specifies the protocol used between clients and a User +Interface Server (UI server). This protocol helps to build a system +where all cryptographic operations are done by a server and the server +is responsible for all dialogs. Although GPGME has no direct support +for this protocol it is believed that servers will utilize the GPGME +library; thus having the specification included in this manual is an +appropriate choice. This protocol should be referenced as `The GnuPG +UI Server Protocol'. + +A server needs to implement these commands:(1) + +* Menu: + +* UI Server Encrypt:: Encrypt a message. +* UI Server Sign:: Sign a message. +* UI Server Decrypt:: Decrypt a message. +* UI Server Verify:: Verify a message. +* UI Server Set Input Files:: Specifying the input files to operate on. +* UI Server Sign/Encrypt Files:: Encrypting and signing files. +* UI Server Verify/Decrypt Files:: Decrypting and verifying files. +* UI Server Import/Export Keys:: Managing certificates. +* UI Server Checksum Files:: Create and verify checksums for files. +* Miscellaneous UI Server Commands:: Commands not related to a specific operation. + + ---------- Footnotes ---------- + + (1) In all examples we assume that the connection has already been +established; see the Assuan manual for details. + + +File: gpgme.info, Node: UI Server Encrypt, Next: UI Server Sign, Up: UI Server Protocol + +A.1 UI Server: Encrypt a Message +================================ + +Before encryption can be done the recipients must be set using the +command: + + -- Command: RECIPIENT STRING + Set the recipient for the encryption. STRING is an RFC-2822 + recipient name ("mailbox" as per section 3.4). This command may + or may not check the recipient for validity right away; if it does + not all recipients are expected to be checked at the time of the + `ENCRYPT' command. All `RECIPIENT' commands are cumulative until a + successful `ENCRYPT' command or until a `RESET' command. + Linefeeds are obviously not allowed in STRING and should be folded + into spaces (which are equivalent). + +To tell the server the source and destination of the data, the next two +commands are to be used: + + -- Command: INPUT FD=N + Set the file descriptor for the message to be encrypted to N. The + message send to the server is binary encoded. + + GpgOL is a Windows only program, thus N is not a libc file + descriptor but a regular system handle. Given that the Assuan + connection works over a socket, it is not possible to use regular + inheritance to make the file descriptor available to the server. + Thus `DuplicateHandle' needs to be used to duplicate a handle to + the server process. This is the reason that the server needs to + implement the `GETINFO pid' command. Sending this command a second + time replaces the file descriptor set by the last one. + + -- Command: OUTPUT FD=N + Set the file descriptor to be used for the output (i.e. the + encrypted message) to N. For OpenPGP, the output needs to be + ASCII armored; for CMS, the output needs to be Base-64 encoded. + For details on the file descriptor, see the `INPUT' command. + +The setting of the recipients, the data source and destination may +happen in any order, even intermixed. If this has been done the actual +encryption operation is called using: + + -- Command: ENCRYPT --protocol=NAME + This command reads the plaintext from the file descriptor set by + the `INPUT' command, encrypts it and writes the ciphertext to the + file descriptor set by the `OUTPUT' command. The server may (and + should) overlap reading and writing. The recipients used for the + encryption are all the recipients set so far. If any recipient is + not usable the server should take appropriate measures to notify + the user about the problem and may cancel the operation by + returning an error code. The used file descriptors are void after + this command; the recipient list is only cleared if the server + returns success. + + Because GpgOL uses a streaming mode of operation the server is not + allowed to auto select the protocol and must obey to the mandatory + PROTOCOL parameter: + + `OpenPGP' + Use the OpenPGP protocol (RFC-2440). + + `CMS' + Use the CMS (PKCS#7) protocol (RFC-3852). + + + To support automagically selection of the protocol depending on the +selected keys, the server MAY implement the command: + + -- Command: PREP_ENCRYPT [--protocol=NAME] [--expect-sign] + This commands considers all recipients set so far and decides + whether it is able to take input and start the actual encryption. + This is kind of a dry-run `ENCRYPT' without requiring or using the + input and output file descriptors. The server shall cache the + result of any user selection to avoid asking this again when the + actual `ENCRYPT' command is send. The `--protocol' option is + optional; if it is not given, the server should allow the user to + select the protocol to be used based on the recipients given or by + any other means. + + If `--expect-sign' is given the server should expect that the + message will also be signed and use this hint to present a unified + recipient and signer selection dialog if possible and desired. A + selected signer should then be cached for the expected SIGN command + (which is expected in the same session but possible on another + connection). + + If this command is given again before a successful `ENCRYPT' + command, the second one takes effect. + + Before sending the OK response the server shall tell the client the + protocol to be used (either the one given by the argument or the + one selected by the user) by means of a status line: + + -- Status line: PROTOCOL NAME + Advise the client to use the protocol NAME for the `ENCRYPT' + command. The valid protocol names are listed under the + description of the `ENCRYPT' command. The server shall emit + exactly one PROTOCOL status line. + +Here is an example of a complete encryption sequence; client lines are +indicated by a C:, server responses by C:: + + C: RESET + S: OK + C: RECIPIENT foo@example.net + S: OK + C: RECIPIENT bar@example.com + S: OK + C: PREP_ENCRYPT + S: S PROTOCOL OpenPGP + S: OK + C: INPUT FD=17 + S: OK + C: OUTPUT FD=18 + S: OK + C: ENCRYPT + S: OK + + +File: gpgme.info, Node: UI Server Sign, Next: UI Server Decrypt, Prev: UI Server Encrypt, Up: UI Server Protocol + +A.2 UI Server: Sign a Message +============================= + +The server needs to implement opaque signing as well as detached +signing. Due to the nature of OpenPGP messages it is always required to +send the entire message to the server; sending just the hash is not +possible. The following two commands are required to set the input and +output file descriptors: + + -- Command: INPUT FD=N + Set the file descriptor for the message to be signed to N. The + message send to the server is binary encoded. For details on the + file descriptor, see the description of `INPUT' in the `ENCRYPT' + section. + + -- Command: OUTPUT FD=N + Set the file descriptor to be used for the output. The output is + either the complete signed message or in case of a detached + signature just that detached signature. For OpenPGP, the output + needs to be ASCII armored; for CMS, the output needs to be Base-64 + encoded. For details on the file descriptor, see the `INPUT' + command. + +To allow the server the selection of a non-default signing key the +client may optionally use the `SENDER' command, see *note command +SENDER::. + +The signing operation is then initiated by: + + -- Command: SIGN --protocol=NAME [--detached] + Sign the data set with the `INPUT' command and write it to the sink + set by OUTPUT. NAME is the signing protocol used for the message. + For a description of the allowed protocols see the `ENCRYPT' + command. With option `--detached' given, a detached signature is + created; this is actually the usual way the command is used. + +The client expects the server to send at least this status information +before the final OK response: + + -- Status line: MICALG STRING + The STRING represents the hash algorithm used to create the + signature. It is used with MOSS style signature messages and + defined by PGP/MIME (RFC-3156) and S/MIME (RFC-3851). The GPGME + library has a supporting function `gpgme_hash_algo_name' to return + the algorithm name as a string. This string needs to be + lowercased and for OpenPGP prefixed with "`pgp-'". + + +File: gpgme.info, Node: UI Server Decrypt, Next: UI Server Verify, Prev: UI Server Sign, Up: UI Server Protocol + +A.3 UI Server: Decrypt a Message +================================ + +Decryption may include the verification of OpenPGP messages. This is +due to the often used combined signing/encryption modus of OpenPGP. The +client may pass an option to the server to inhibit the signature +verification. The following two commands are required to set the input +and output file descriptors: + + -- Command: INPUT FD=N + Set the file descriptor for the message to be decrypted to N. The + message send to the server is either binary encoded or -- in the + case of OpenPGP -- ASCII armored. For details on the file + descriptor, see the description of `INPUT' in the `ENCRYPT' + section. + + -- Command: OUTPUT FD=N + Set the file descriptor to be used for the output. The output is + binary encoded. For details on the file descriptor, see the + description of `INPUT' in the `ENCRYPT' section. + +The decryption is started with the command: + + -- Command: DECRYPT --protocol=NAME [--no-verify] + NAME is the encryption protocol used for the message. For a + description of the allowed protocols see the `ENCRYPT' command. + This argument is mandatory. If the option `--no-verify' is given, + the server should not try to verify a signature, in case the input + data is an OpenPGP combined message. + + +File: gpgme.info, Node: UI Server Verify, Next: UI Server Set Input Files, Prev: UI Server Decrypt, Up: UI Server Protocol + +A.4 UI Server: Verify a Message +=============================== + +The server needs to support the verification of opaque signatures as +well as detached signatures. The kind of input sources controls what +kind message is to be verified. + + -- Command: MESSAGE FD=N + This command is used with detached signatures to set the file + descriptor for the signed data to N. The data is binary encoded + (used verbatim). For details on the file descriptor, see the + description of `INPUT' in the `ENCRYPT' section. + + -- Command: INPUT FD=N + Set the file descriptor for the opaque message or the signature + part of a detached signature to N. The message send to the server + is either binary encoded or - in the case of OpenPGP - ASCII + armored. For details on the file descriptor, see the description + of `INPUT' in the `ENCRYPT' section. + + -- Command: OUTPUT FD=N + Set the file descriptor to be used for the output. The output is + binary encoded and only used for opaque signatures. For details + on the file descriptor, see the description of `INPUT' in the + `ENCRYPT' section. + +The verification is then started using: + + -- Command: VERIFY --protocol=NAME [--silent] + NAME is the signing protocol used for the message. For a + description of the allowed protocols see the `ENCRYPT' command. + This argument is mandatory. Depending on the combination of + `MESSAGE' `INPUT' and `OUTPUT' commands, the server needs to + select the appropriate verification mode: + + MESSAGE and INPUT + This indicates a detached signature. Output data is not + applicable. + + INPUT + This indicates an opaque signature. As no output command has + been given, the server is only required to check the + signature. + + INPUT and OUTPUT + This indicates an opaque signature. The server shall write + the signed data to the file descriptor set by the output + command. This data shall even be written if the signatures + can't be verified. + + With `--silent' the server shall not display any dialog; this is for +example used by the client to get the content of opaque signed +messages. The client expects the server to send at least this status +information before the final OK response: + + -- Status line: SIGSTATUS FLAG DISPLAYSTRING + Returns the status for the signature and a short string explaining + the status. Valid values for FLAG are: + + `none' + The message has a signature but it could not not be verified + due to a missing key. + + `green' + The signature is fully valid. + + `yellow' + The signature is valid but additional information was shown + regarding the validity of the key. + + `red' + The signature is not valid. + + DISPLAYSTRING is a percent-and-plus-encoded string with a short + human readable description of the status. For example + + S SIGSTATUS green Good+signature+from+Keith+Moon+<keith@example.net> + + Note that this string needs to fit into an Assuan line and should + be short enough to be displayed as short one-liner on the clients + window. As usual the encoding of this string is UTF-8 and it + should be send in its translated form. + + The server shall send one status line for every signature found on + the message. + + + +File: gpgme.info, Node: UI Server Set Input Files, Next: UI Server Sign/Encrypt Files, Prev: UI Server Verify, Up: UI Server Protocol + +A.5 UI Server: Specifying the input files to operate on. +======================================================== + +All file related UI server commands operate on a number of input files +or directories, specified by one or more `FILE' commands: + + -- Command: FILE NAME [-continued] + Add the file or directory NAME to the list of pathnames to be + processed by the server. The parameter NAME must be an absolute + path name (including the drive letter) and is percent espaced (in + particular, the characters %, = and white space characters are + always escaped). The option `--continued' is present for all but + the last `FILE' command. + + +File: gpgme.info, Node: UI Server Sign/Encrypt Files, Next: UI Server Verify/Decrypt Files, Prev: UI Server Set Input Files, Up: UI Server Protocol + +A.6 UI Server: Encrypting and signing files. +============================================ + +First, the input files need to be specified by one or more `FILE' +commands. Afterwards, the actual operation is requested: + + -- Command: ENCRYPT_FILES -nohup + -- Command: SIGN_FILES -nohup + -- Command: ENCRYPT_SIGN_FILES -nohup + Request that the files specified by `FILE' are encrypted and/or + signed. The command selects the default action. The UI server may + allow the user to change this default afterwards interactively, and + even abort the operation or complete it only on some of the + selected files and directories. + + What it means to encrypt or sign a file or directory is specific to + the preferences of the user, the functionality the UI server + provides, and the selected protocol. Typically, for each input + file a new file is created under the original filename plus a + protocol specific extension (like `.gpg' or `.sig'), which contain + the encrypted/signed file or a detached signature. For + directories, the server may offer multiple options to the user + (for example ignore or process recursively). + + The `ENCRYPT_SIGN_FILES' command requests a combined sign and + encrypt operation. It may not be available for all protocols (for + example, it is available for OpenPGP but not for CMS). + + The option `--nohup' is mandatory. It is currently unspecified + what should happen if `--nohup' is not present. Because `--nohup' + is present, the server always returns `OK' promptly, and completes + the operation asynchronously. + + +File: gpgme.info, Node: UI Server Verify/Decrypt Files, Next: UI Server Import/Export Keys, Prev: UI Server Sign/Encrypt Files, Up: UI Server Protocol + +A.7 UI Server: Decrypting and verifying files. +============================================== + +First, the input files need to be specified by one or more `FILE' +commands. Afterwards, the actual operation is requested: + + -- Command: DECRYPT_FILES -nohup + -- Command: VERIFY_FILES -nohup + -- Command: DECRYPT_VERIFY_FILES -nohup + Request that the files specified by `FILE' are decrypted and/or + verified. The command selects the default action. The UI server + may allow the user to change this default afterwards + interactively, and even abort the operation or complete it only on + some of the selected files and directories. + + What it means to decrypt or verify a file or directory is specific + to the preferences of the user, the functionality the UI server + provides, and the selected protocol. Typically, for decryption, a + new file is created for each input file under the original + filename minus a protocol specific extension (like `.gpg') which + contains the original plaintext. For verification a status is + displayed for each signed input file, indicating if it is signed, + and if yes, if the signature is valid. For files that are signed + and encrypted, the `VERIFY' command transiently decrypts the file + to verify the enclosed signature. For directories, the server may + offer multiple options to the user (for example ignore or process + recursively). + + The option `--nohup' is mandatory. It is currently unspecified + what should happen if `--nohup' is not present. Because `--nohup' + is present, the server always returns `OK' promptly, and completes + the operation asynchronously. + + +File: gpgme.info, Node: UI Server Import/Export Keys, Next: UI Server Checksum Files, Prev: UI Server Verify/Decrypt Files, Up: UI Server Protocol + +A.8 UI Server: Managing certificates. +===================================== + +First, the input files need to be specified by one or more `FILE' +commands. Afterwards, the actual operation is requested: + + -- Command: IMPORT_FILES -nohup + Request that the certificates contained in the files specified by + `FILE' are imported into the local certificate databases. + + For directories, the server may offer multiple options to the user + (for example ignore or process recursively). + + The option `--nohup' is mandatory. It is currently unspecified + what should happen if `--nohup' is not present. Because `--nohup' + is present, the server always returns `OK' promptly, and completes + the operation asynchronously. + + FIXME: It may be nice to support an `EXPORT' command as well, which +is enabled by the context menu of the background of a directory. + + +File: gpgme.info, Node: UI Server Checksum Files, Next: Miscellaneous UI Server Commands, Prev: UI Server Import/Export Keys, Up: UI Server Protocol + +A.9 UI Server: Create and verify checksums for files. +===================================================== + +First, the input files need to be specified by one or more `FILE' +commands. Afterwards, the actual operation is requested: + + -- Command: CHECKSUM_CREATE_FILES -nohup + Request that checksums are created for the files specifed by + `FILE'. The choice of checksum algorithm and the destination + storage and format for the created checksums depend on the + preferences of the user and the functionality provided by the UI + server. For directories, the server may offer multiple options to + the user (for example ignore or process recursively). + + The option `--nohup' is mandatory. It is currently unspecified + what should happen if `--nohup' is not present. Because `--nohup' + is present, the server always returns `OK' promptly, and completes + the operation asynchronously. + + -- Command: CHECKSUM_VERIFY_FILES -nohup + Request that checksums are created for the files specifed by + `FILE' and verified against previously created and stored + checksums. The choice of checksum algorithm and the source storage + and format for previously created checksums depend on the + preferences of the user and the functionality provided by the UI + server. For directories, the server may offer multiple options to + the user (for example ignore or process recursively). + + If the source storage of previously created checksums is available + to the user through the Windows shell, this command may also + accept such checksum files as `FILE' arguments. In this case, the + UI server should instead verify the checksum of the referenced + files as if they were given as INPUT files. + + The option `--nohup' is mandatory. It is currently unspecified + what should happen if `--nohup' is not present. Because `--nohup' + is present, the server always returns `OK' promptly, and completes + the operation asynchronously. + + +File: gpgme.info, Node: Miscellaneous UI Server Commands, Prev: UI Server Checksum Files, Up: UI Server Protocol + +A.10 Miscellaneous UI Server Commands +===================================== + +The server needs to implement the following commands which are not +related to a specific command: + + -- Command: GETINFO WHAT + This is a multi purpose command, commonly used to return a variety + of information. The required subcommands as described by the WHAT + parameter are: + + `pid' + Return the process id of the server in decimal notation using + an Assuan data line. + +To allow the server to pop up the windows in the correct relation to the +client, the client is advised to tell the server by sending the option: + + -- Command option: window-id NUMBER + The NUMBER represents the native window ID of the clients current + window. On Windows systems this is a windows handle (`HWND') and + on X11 systems it is the `X Window ID'. The number needs to be + given as a hexadecimal value so that it is easier to convey pointer + values (e.g. `HWND'). + +A client may want to fire up the certificate manager of the server. To +do this it uses the Assuan command: + + -- Command: START_KEYMANAGER + The server shall pop up the main window of the key manager (aka + certificate manager). The client expects that the key manager is + brought into the foregound and that this command immediatley + returns (does not wait until the key manager has been fully + brought up). + +A client may want to fire up the configuration dialog of the server. To +do this it uses the Assuan command: + + -- Command: START_CONFDIALOG + The server shall pop up its configuration dialog. The client + expects that this dialog is brought into the foregound and that + this command immediatley returns (i.e. it does not wait until the + dialog has been fully brought up). + +When doing an operation on a mail, it is useful to let the server know +the address of the sender: + + -- Command: SENDER [--info] [--protocol=NAME] EMAIL + EMAIL is the plain ASCII encoded address ("addr-spec" as per + RFC-2822) enclosed in angle brackets. The address set with this + command is valid until a successful completion of the operation or + until a `RESET' command. A second command overrides the effect of + the first one; if EMAIL is not given and `--info' is not used, the + server shall use the default signing key. + + If option `--info' is not given, the server shall also suggest a + protocol to use for signing. The client may use this suggested + protocol on its own discretion. The same status line as with + PREP_ENCRYPT is used for this. + + The option `--protocol' may be used to give the server a hint on + which signing protocol should be preferred. + +To allow the UI-server to visually identify a running operation or to +associate operations the server MAY support the command: + + -- Command: SESSION NUMBER [STRING] + The NUMBER is an arbitrary value, a server may use to associate + simultaneous running sessions. It is a 32 bit unsigned integer + with `0' as a special value indicating that no session association + shall be done. + + If STRING is given, the server may use this as the title of a + window or, in the case of an email operation, to extract the + sender's address. The string may contain spaces; thus no + plus-escaping is used. + + This command may be used at any time and overrides the effect of + the last command. A `RESET' undoes the effect of this command. + + + +File: gpgme.info, Node: Library Copying, Next: Copying, Prev: UI Server Protocol, Up: Top + +GNU Lesser General Public License +********************************* + + Version 2.1, February 1999 + + Copyright (C) 1991, 1999 Free Software Foundation, Inc. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + [This is the first released version of the Lesser GPL. It also counts + as the successor of the GNU Library Public License, version 2, hence the + version number 2.1.] + +Preamble +======== + +The licenses for most software are designed to take away your freedom +to share and change it. By contrast, the GNU General Public Licenses +are intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. + + This license, the Lesser General Public License, applies to some +specially designated software--typically libraries--of the Free +Software Foundation and other authors who decide to use it. You can use +it too, but we suggest you first think carefully about whether this +license or the ordinary General Public License is the better strategy to +use in any particular case, based on the explanations below. + + When we speak of free software, we are referring to freedom of use, +not price. Our General Public Licenses are designed to make sure that +you have the freedom to distribute copies of free software (and charge +for this service if you wish); that you receive source code or can get +it if you want it; that you can change the software and use pieces of it +in new free programs; and that you are informed that you can do these +things. + + To protect your rights, we need to make restrictions that forbid +distributors to deny you these rights or to ask you to surrender these +rights. These restrictions translate to certain responsibilities for +you if you distribute copies of the library or if you modify it. + + For example, if you distribute copies of the library, whether gratis +or for a fee, you must give the recipients all the rights that we gave +you. You must make sure that they, too, receive or can get the source +code. If you link other code with the library, you must provide +complete object files to the recipients, so that they can relink them +with the library after making changes to the library and recompiling +it. And you must show them these terms so they know their rights. + + We protect your rights with a two-step method: (1) we copyright the +library, and (2) we offer you this license, which gives you legal +permission to copy, distribute and/or modify the library. + + To protect each distributor, we want to make it very clear that +there is no warranty for the free library. Also, if the library is +modified by someone else and passed on, the recipients should know that +what they have is not the original version, so that the original +author's reputation will not be affected by problems that might be +introduced by others. + + Finally, software patents pose a constant threat to the existence of +any free program. We wish to make sure that a company cannot +effectively restrict the users of a free program by obtaining a +restrictive license from a patent holder. Therefore, we insist that +any patent license obtained for a version of the library must be +consistent with the full freedom of use specified in this license. + + Most GNU software, including some libraries, is covered by the +ordinary GNU General Public License. This license, the GNU Lesser +General Public License, applies to certain designated libraries, and is +quite different from the ordinary General Public License. We use this +license for certain libraries in order to permit linking those +libraries into non-free programs. + + When a program is linked with a library, whether statically or using +a shared library, the combination of the two is legally speaking a +combined work, a derivative of the original library. The ordinary +General Public License therefore permits such linking only if the +entire combination fits its criteria of freedom. The Lesser General +Public License permits more lax criteria for linking other code with +the library. + + We call this license the "Lesser" General Public License because it +does _Less_ to protect the user's freedom than the ordinary General +Public License. It also provides other free software developers Less +of an advantage over competing non-free programs. These disadvantages +are the reason we use the ordinary General Public License for many +libraries. However, the Lesser license provides advantages in certain +special circumstances. + + For example, on rare occasions, there may be a special need to +encourage the widest possible use of a certain library, so that it +becomes a de-facto standard. To achieve this, non-free programs must be +allowed to use the library. A more frequent case is that a free +library does the same job as widely used non-free libraries. In this +case, there is little to gain by limiting the free library to free +software only, so we use the Lesser General Public License. + + In other cases, permission to use a particular library in non-free +programs enables a greater number of people to use a large body of free +software. For example, permission to use the GNU C Library in non-free +programs enables many more people to use the whole GNU operating +system, as well as its variant, the GNU/Linux operating system. + + Although the Lesser General Public License is Less protective of the +users' freedom, it does ensure that the user of a program that is +linked with the Library has the freedom and the wherewithal to run that +program using a modified version of the Library. + + The precise terms and conditions for copying, distribution and +modification follow. Pay close attention to the difference between a +"work based on the library" and a "work that uses the library". The +former contains code derived from the library, whereas the latter must +be combined with the library in order to run. + + GNU LESSER GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + 0. This License Agreement applies to any software library or other + program which contains a notice placed by the copyright holder or + other authorized party saying it may be distributed under the + terms of this Lesser General Public License (also called "this + License"). Each licensee is addressed as "you". + + A "library" means a collection of software functions and/or data + prepared so as to be conveniently linked with application programs + (which use some of those functions and data) to form executables. + + The "Library", below, refers to any such software library or work + which has been distributed under these terms. A "work based on the + Library" means either the Library or any derivative work under + copyright law: that is to say, a work containing the Library or a + portion of it, either verbatim or with modifications and/or + translated straightforwardly into another language. (Hereinafter, + translation is included without limitation in the term + "modification".) + + "Source code" for a work means the preferred form of the work for + making modifications to it. For a library, complete source code + means all the source code for all modules it contains, plus any + associated interface definition files, plus the scripts used to + control compilation and installation of the library. + + Activities other than copying, distribution and modification are + not covered by this License; they are outside its scope. The act + of running a program using the Library is not restricted, and + output from such a program is covered only if its contents + constitute a work based on the Library (independent of the use of + the Library in a tool for writing it). Whether that is true + depends on what the Library does and what the program that uses + the Library does. + + 1. You may copy and distribute verbatim copies of the Library's + complete source code as you receive it, in any medium, provided + that you conspicuously and appropriately publish on each copy an + appropriate copyright notice and disclaimer of warranty; keep + intact all the notices that refer to this License and to the + absence of any warranty; and distribute a copy of this License + along with the Library. + + You may charge a fee for the physical act of transferring a copy, + and you may at your option offer warranty protection in exchange + for a fee. + + 2. You may modify your copy or copies of the Library or any portion + of it, thus forming a work based on the Library, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a. The modified work must itself be a software library. + + b. You must cause the files modified to carry prominent notices + stating that you changed the files and the date of any change. + + c. You must cause the whole of the work to be licensed at no + charge to all third parties under the terms of this License. + + d. If a facility in the modified Library refers to a function or + a table of data to be supplied by an application program that + uses the facility, other than as an argument passed when the + facility is invoked, then you must make a good faith effort + to ensure that, in the event an application does not supply + such function or table, the facility still operates, and + performs whatever part of its purpose remains meaningful. + + (For example, a function in a library to compute square roots + has a purpose that is entirely well-defined independent of the + application. Therefore, Subsection 2d requires that any + application-supplied function or table used by this function + must be optional: if the application does not supply it, the + square root function must still compute square roots.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the + Library, and can be reasonably considered independent and separate + works in themselves, then this License, and its terms, do not + apply to those sections when you distribute them as separate + works. But when you distribute the same sections as part of a + whole which is a work based on the Library, the distribution of + the whole must be on the terms of this License, whose permissions + for other licensees extend to the entire whole, and thus to each + and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or + contest your rights to work written entirely by you; rather, the + intent is to exercise the right to control the distribution of + derivative or collective works based on the Library. + + In addition, mere aggregation of another work not based on the + Library with the Library (or with a work based on the Library) on + a volume of a storage or distribution medium does not bring the + other work under the scope of this License. + + 3. You may opt to apply the terms of the ordinary GNU General Public + License instead of this License to a given copy of the Library. + To do this, you must alter all the notices that refer to this + License, so that they refer to the ordinary GNU General Public + License, version 2, instead of to this License. (If a newer + version than version 2 of the ordinary GNU General Public License + has appeared, then you can specify that version instead if you + wish.) Do not make any other change in these notices. + + Once this change is made in a given copy, it is irreversible for + that copy, so the ordinary GNU General Public License applies to + all subsequent copies and derivative works made from that copy. + + This option is useful when you wish to copy part of the code of + the Library into a program that is not a library. + + 4. You may copy and distribute the Library (or a portion or + derivative of it, under Section 2) in object code or executable + form under the terms of Sections 1 and 2 above provided that you + accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software + interchange. + + If distribution of object code is made by offering access to copy + from a designated place, then offering equivalent access to copy + the source code from the same place satisfies the requirement to + distribute the source code, even though third parties are not + compelled to copy the source along with the object code. + + 5. A program that contains no derivative of any portion of the + Library, but is designed to work with the Library by being + compiled or linked with it, is called a "work that uses the + Library". Such a work, in isolation, is not a derivative work of + the Library, and therefore falls outside the scope of this License. + + However, linking a "work that uses the Library" with the Library + creates an executable that is a derivative of the Library (because + it contains portions of the Library), rather than a "work that + uses the library". The executable is therefore covered by this + License. Section 6 states terms for distribution of such + executables. + + When a "work that uses the Library" uses material from a header + file that is part of the Library, the object code for the work may + be a derivative work of the Library even though the source code is + not. Whether this is true is especially significant if the work + can be linked without the Library, or if the work is itself a + library. The threshold for this to be true is not precisely + defined by law. + + If such an object file uses only numerical parameters, data + structure layouts and accessors, and small macros and small inline + functions (ten lines or less in length), then the use of the object + file is unrestricted, regardless of whether it is legally a + derivative work. (Executables containing this object code plus + portions of the Library will still fall under Section 6.) + + Otherwise, if the work is a derivative of the Library, you may + distribute the object code for the work under the terms of Section + 6. Any executables containing that work also fall under Section 6, + whether or not they are linked directly with the Library itself. + + 6. As an exception to the Sections above, you may also combine or + link a "work that uses the Library" with the Library to produce a + work containing portions of the Library, and distribute that work + under terms of your choice, provided that the terms permit + modification of the work for the customer's own use and reverse + engineering for debugging such modifications. + + You must give prominent notice with each copy of the work that the + Library is used in it and that the Library and its use are covered + by this License. You must supply a copy of this License. If the + work during execution displays copyright notices, you must include + the copyright notice for the Library among them, as well as a + reference directing the user to the copy of this License. Also, + you must do one of these things: + + a. Accompany the work with the complete corresponding + machine-readable source code for the Library including + whatever changes were used in the work (which must be + distributed under Sections 1 and 2 above); and, if the work + is an executable linked with the Library, with the complete + machine-readable "work that uses the Library", as object code + and/or source code, so that the user can modify the Library + and then relink to produce a modified executable containing + the modified Library. (It is understood that the user who + changes the contents of definitions files in the Library will + not necessarily be able to recompile the application to use + the modified definitions.) + + b. Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (1) uses at run + time a copy of the library already present on the user's + computer system, rather than copying library functions into + the executable, and (2) will operate properly with a modified + version of the library, if the user installs one, as long as + the modified version is interface-compatible with the version + that the work was made with. + + c. Accompany the work with a written offer, valid for at least + three years, to give the same user the materials specified in + Subsection 6a, above, for a charge no more than the cost of + performing this distribution. + + d. If distribution of the work is made by offering access to copy + from a designated place, offer equivalent access to copy the + above specified materials from the same place. + + e. Verify that the user has already received a copy of these + materials or that you have already sent this user a copy. + + For an executable, the required form of the "work that uses the + Library" must include any data and utility programs needed for + reproducing the executable from it. However, as a special + exception, the materials to be distributed need not include + anything that is normally distributed (in either source or binary + form) with the major components (compiler, kernel, and so on) of + the operating system on which the executable runs, unless that + component itself accompanies the executable. + + It may happen that this requirement contradicts the license + restrictions of other proprietary libraries that do not normally + accompany the operating system. Such a contradiction means you + cannot use both them and the Library together in an executable + that you distribute. + + 7. You may place library facilities that are a work based on the + Library side-by-side in a single library together with other + library facilities not covered by this License, and distribute + such a combined library, provided that the separate distribution + of the work based on the Library and of the other library + facilities is otherwise permitted, and provided that you do these + two things: + + a. Accompany the combined library with a copy of the same work + based on the Library, uncombined with any other library + facilities. This must be distributed under the terms of the + Sections above. + + b. Give prominent notice with the combined library of the fact + that part of it is a work based on the Library, and explaining + where to find the accompanying uncombined form of the same + work. + + 8. You may not copy, modify, sublicense, link with, or distribute the + Library except as expressly provided under this License. Any + attempt otherwise to copy, modify, sublicense, link with, or + distribute the Library is void, and will automatically terminate + your rights under this License. However, parties who have + received copies, or rights, from you under this License will not + have their licenses terminated so long as such parties remain in + full compliance. + + 9. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify + or distribute the Library or its derivative works. These actions + are prohibited by law if you do not accept this License. + Therefore, by modifying or distributing the Library (or any work + based on the Library), you indicate your acceptance of this + License to do so, and all its terms and conditions for copying, + distributing or modifying the Library or works based on it. + + 10. Each time you redistribute the Library (or any work based on the + Library), the recipient automatically receives a license from the + original licensor to copy, distribute, link with or modify the + Library subject to these terms and conditions. You may not impose + any further restrictions on the recipients' exercise of the rights + granted herein. You are not responsible for enforcing compliance + by third parties with this License. + + 11. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent + issues), conditions are imposed on you (whether by court order, + agreement or otherwise) that contradict the conditions of this + License, they do not excuse you from the conditions of this + License. If you cannot distribute so as to satisfy simultaneously + your obligations under this License and any other pertinent + obligations, then as a consequence you may not distribute the + Library at all. For example, if a patent license would not permit + royalty-free redistribution of the Library by all those who + receive copies directly or indirectly through you, then the only + way you could satisfy both it and this License would be to refrain + entirely from distribution of the Library. + + If any portion of this section is held invalid or unenforceable + under any particular circumstance, the balance of the section is + intended to apply, and the section as a whole is intended to apply + in other circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of + any such claims; this section has the sole purpose of protecting + the integrity of the free software distribution system which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system; it is up to the author/donor to decide if he or she is + willing to distribute software through any other system and a + licensee cannot impose that choice. + + This section is intended to make thoroughly clear what is believed + to be a consequence of the rest of this License. + + 12. If the distribution and/or use of the Library is restricted in + certain countries either by patents or by copyrighted interfaces, + the original copyright holder who places the Library under this + License may add an explicit geographical distribution limitation + excluding those countries, so that distribution is permitted only + in or among countries not thus excluded. In such case, this + License incorporates the limitation as if written in the body of + this License. + + 13. The Free Software Foundation may publish revised and/or new + versions of the Lesser General Public License from time to time. + Such new versions will be similar in spirit to the present version, + but may differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the + Library specifies a version number of this License which applies + to it and "any later version", you have the option of following + the terms and conditions either of that version or of any later + version published by the Free Software Foundation. If the Library + does not specify a license version number, you may choose any + version ever published by the Free Software Foundation. + + 14. If you wish to incorporate parts of the Library into other free + programs whose distribution conditions are incompatible with these, + write to the author to ask for permission. For software which is + copyrighted by the Free Software Foundation, write to the Free + Software Foundation; we sometimes make exceptions for this. Our + decision will be guided by the two goals of preserving the free + status of all derivatives of our free software and of promoting + the sharing and reuse of software generally. + + NO WARRANTY + 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO + WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE + LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT + WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT + NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE + QUALITY AND PERFORMANCE OF THE LIBRARY IS WITH YOU. SHOULD THE + LIBRARY PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY + SERVICING, REPAIR OR CORRECTION. + + 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY + MODIFY AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE + LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, + INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR + INABILITY TO USE THE LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU + OR THIRD PARTIES OR A FAILURE OF THE LIBRARY TO OPERATE WITH ANY + OTHER SOFTWARE), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS +How to Apply These Terms to Your New Libraries +============================================== + +If you develop a new library, and you want it to be of the greatest +possible use to the public, we recommend making it free software that +everyone can redistribute and change. You can do so by permitting +redistribution under these terms (or, alternatively, under the terms of +the ordinary General Public License). + + To apply these terms, attach the following notices to the library. +It is safest to attach them to the start of each source file to most +effectively convey the exclusion of warranty; and each file should have +at least the "copyright" line and a pointer to where the full notice is +found. + + ONE LINE TO GIVE THE LIBRARY'S NAME AND AN IDEA OF WHAT IT DOES. + Copyright (C) YEAR NAME OF AUTHOR + + This library is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or (at + your option) any later version. + + This library 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, + USA. + + Also add information on how to contact you by electronic and paper +mail. + + You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the library, +if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the library + `Frob' (a library for tweaking knobs) written by James Random Hacker. + + SIGNATURE OF TY COON, 1 April 1990 + Ty Coon, President of Vice + + That's all there is to it! + |