This is gcrypt.info, produced by makeinfo version 4.13 from gcrypt.texi.

This manual is for Libgcrypt (version 1.4.6, 9 July 2009), which is
GNU's library of cryptographic building blocks.

   Copyright (C) 2000, 2002, 2003, 2004, 2006, 2007, 2008, 2009 Free
Software Foundation, Inc.

     Permission is granted to copy, distribute and/or modify this
     document under the terms of the GNU General Public License as
     published by the Free Software Foundation; either version 2 of the
     License, or (at your option) any later version. The text of the
     license can be found in the section entitled "GNU General Public
     License".

INFO-DIR-SECTION GNU Libraries
START-INFO-DIR-ENTRY
* libgcrypt: (gcrypt).  Cryptographic function library.
END-INFO-DIR-ENTRY


File: gcrypt.info,  Node: Top,  Next: Introduction,  Up: (dir)

The Libgcrypt Library
*********************

This manual is for Libgcrypt (version 1.4.6, 9 July 2009), which is
GNU's library of cryptographic building blocks.

   Copyright (C) 2000, 2002, 2003, 2004, 2006, 2007, 2008, 2009 Free
Software Foundation, Inc.

     Permission is granted to copy, distribute and/or modify this
     document under the terms of the GNU General Public License as
     published by the Free Software Foundation; either version 2 of the
     License, or (at your option) any later version. The text of the
     license can be found in the section entitled "GNU General Public
     License".

* Menu:

* Introduction::                 What is Libgcrypt.
* Preparation::                  What you should do before using the library.
* Generalities::                 General library functions and data types.
* Handler Functions::            Working with handler functions.
* Symmetric cryptography::       How to use symmetric cryptography.
* Public Key cryptography::      How to use public key cryptography.
* Hashing::                      How to use hash and MAC algorithms.
* Random Numbers::               How to work with random numbers.
* S-expressions::                How to manage S-expressions.
* MPI library::                  How to work with multi-precision-integers.
* Prime numbers::                How to use the Prime number related functions.
* Utilities::                    Utility functions.
* Architecture::                 How Libgcrypt works internally.

Appendices

* Self-Tests::                  Description of the self-tests.
* FIPS Mode::                   Description of the FIPS mode.
* Library Copying::             The GNU Lesser General Public License
                                says how you can copy and share Libgcrypt.
* Copying::                     The GNU General Public License says how you
                                can copy and share some parts of Libgcrypt.

Indices

* Figures and Tables::          Index of figures and tables.
* Concept Index::               Index of concepts and programs.
* Function and Data Index::     Index of functions, variables and data types.


File: gcrypt.info,  Node: Introduction,  Next: Preparation,  Prev: Top,  Up: Top

1 Introduction
**************

Libgcrypt is a library providing cryptographic building blocks.

* Menu:

* Getting Started::             How to use this manual.
* Features::                    A glance at Libgcrypt's features.
* Overview::                    Overview about the library.


File: gcrypt.info,  Node: Getting Started,  Next: Features,  Up: Introduction

1.1 Getting Started
===================

This manual documents the Libgcrypt library application programming
interface (API).  All functions and data types provided by the library
are explained.

The reader is assumed to possess basic knowledge about applied
cryptography.

   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: gcrypt.info,  Node: Features,  Next: Overview,  Prev: Getting Started,  Up: Introduction

1.2 Features
============

Libgcrypt might have a couple of advantages over other libraries doing
a similar job.

It's Free Software
     Anybody can use, modify, and redistribute it under the terms of
     the GNU Lesser General Public License (*note Library Copying::).
     Note, that some parts (which are in general not needed by
     applications) are subject to the terms of the GNU General Public
     License (*note Copying::); please see the README file of the
     distribution for of list of these parts.

It encapsulates the low level cryptography
     Libgcrypt provides a high level interface to cryptographic
     building blocks using an extensible and flexible API.



File: gcrypt.info,  Node: Overview,  Prev: Features,  Up: Introduction

1.3 Overview
============

The Libgcrypt library is fully thread-safe, where it makes sense to be
thread-safe.  Not thread-safe are some cryptographic functions that
modify a certain context stored in handles.  If the user really intents
to use such functions from different threads on the same handle, he has
to take care of the serialization of such functions himself.  If not
described otherwise, every function is thread-safe.

   Libgcrypt depends on the library `libgpg-error', which contains
common error handling related code for GnuPG components.


File: gcrypt.info,  Node: Preparation,  Next: Generalities,  Prev: Introduction,  Up: Top

2 Preparation
*************

To use Libgcrypt, 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 sources::            How to build sources using the library.
* Building sources using Automake::  How to build sources with the help of Automake.
* Initializing the library::    How to initialize the library.
* Multi-Threading::             How Libgcrypt can be used in a MT environment.
* Enabling FIPS mode::          How to enable the FIPS mode.


File: gcrypt.info,  Node: Header,  Next: Building sources,  Up: Preparation

2.1 Header
==========

All interfaces (data types and functions) of the library are defined in
the header file `gcrypt.h'.  You must include this in all source files
using the library, either directly or through some other header file,
like this:

     #include <gcrypt.h>

   The name space of Libgcrypt is `gcry_*' for function and type names
and `GCRY*' for other symbols.  In addition the same name prefixes with
one prepended underscore are reserved for internal use and should never
be used by an application.  Note that Libgcrypt uses libgpg-error,
which uses `gpg_*' as name space for function and type names and
`GPG_*' for other symbols, including all the error codes.

Certain parts of gcrypt.h may be excluded by defining these macros:

`GCRYPT_NO_MPI_MACROS'
     Do not define the shorthand macros `mpi_*' for `gcry_mpi_*'.

`GCRYPT_NO_DEPRECATED'
     Do not include defintions for deprecated features.  This is useful
     to make sure that no deprecated features are used.


File: gcrypt.info,  Node: Building sources,  Next: Building sources using Automake,  Prev: Header,  Up: Preparation

2.2 Building sources
====================

If you want to compile a source file including the `gcrypt.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, Libgcrypt ships with a
small helper program `libgcrypt-config' that knows 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 `libgcrypt-config'.  The following example shows
how it can be used at the command line:

     gcc -c foo.c `libgcrypt-config --cflags`

   Adding the output of `libgcrypt-config --cflags' to the compilers
command line will ensure that the compiler can find the Libgcrypt 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
`libgcrypt-config' can be used.  For convenience, this option also
outputs all other options that are required to link the program with
the Libgcrypt libraries (in particular, the `-lgcrypt' option).  The
example shows how to link `foo.o' with the Libgcrypt library to a
program `foo'.

     gcc -o foo foo.o `libgcrypt-config --libs`

   Of course you can also combine both examples to a single command by
specifying both options to `libgcrypt-config':

     gcc -o foo foo.c `libgcrypt-config --cflags --libs`


File: gcrypt.info,  Node: Building sources using Automake,  Next: Initializing the library,  Prev: Building sources,  Up: Preparation

2.3 Building sources 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 `libgcrypt-config' script at all.  Libgcrypt provides an
extension to Automake that does all the work for you.

 -- Macro: AM_PATH_LIBGCRYPT ([MINIMUM-VERSION], [ACTION-IF-FOUND],
          [ACTION-IF-NOT-FOUND])
     Check whether Libgcrypt (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 `LIBGCRYPT_CFLAGS' to the flags
     needed for compilation of the program to find the `gcrypt.h'
     header file, and `LIBGCRYPT_LIBS' to the linker flags needed to
     link the program to the Libgcrypt library.

   You can use the defined Autoconf variables like this in your
`Makefile.am':

     AM_CPPFLAGS = $(LIBGCRYPT_CFLAGS)
     LDADD = $(LIBGCRYPT_LIBS)


File: gcrypt.info,  Node: Initializing the library,  Next: Multi-Threading,  Prev: Building sources using Automake,  Up: Preparation

2.4 Initializing the library
============================

Before the library can be used, it must initialize itself.  This is
achieved by invoking the function `gcry_check_version' described below.

   Also, it is often desirable to check that the version of Libgcrypt
used is indeed one which fits all requirements.  Even with binary
compatibility, new features may have been introduced, but due to
problem with the dynamic linker an old version may actually be used.
So you may want to check that the version is okay right after program
startup.

 -- Function: const char * gcry_check_version (const char *REQ_VERSION)
     The function `gcry_check_version' initializes some subsystems used
     by Libgcrypt and must be invoked before any other function in the
     library, with the exception of the `GCRYCTL_SET_THREAD_CBS' command
     (called via the `gcry_control' function).  *Note Multi-Threading::.

     Furthermore, this function returns the version number of the
     library.  It can also verify that the version number is higher
     than a certain required version number REQ_VERSION, if this value
     is not a null pointer.

   Libgcrypt uses a concept known as secure memory, which is a region of
memory set aside for storing sensitive data.  Because such memory is a
scarce resource, it needs to be setup in advanced to a fixed size.
Further, most operating systems have special requirements on how that
secure memory can be used.  For example, it might be required to install
an application as "setuid(root)" to allow allocating such memory.
Libgcrypt requires a sequence of initialization steps to make sure that
this works correctly.  The following examples show the necessary steps.

   If you don't have a need for secure memory, for example if your
application does not use secret keys or other confidential data or it
runs in a controlled environment where key material floating around in
memory is not a problem, you should initialize Libgcrypt this way:

       /* Version check should be the very first call because it
          makes sure that important subsystems are intialized. */
       if (!gcry_check_version (GCRYPT_VERSION))
         {
           fputs ("libgcrypt version mismatch\n", stderr);
           exit (2);
         }

       /* Disable secure memory.  */
       gcry_control (GCRYCTL_DISABLE_SECMEM, 0);

       /* ... If required, other initialization goes here.  */

       /* Tell Libgcrypt that initialization has completed. */
       gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);

   If you have to protect your keys or other information in memory
against being swapped out to disk and to enable an automatic overwrite
of used and freed memory, you need to initialize Libgcrypt this way:

       /* Version check should be the very first call because it
          makes sure that important subsystems are intialized. */
       if (!gcry_check_version (GCRYPT_VERSION))
         {
           fputs ("libgcrypt version mismatch\n", stderr);
           exit (2);
         }

     /* We don't want to see any warnings, e.g. because we have not yet
          parsed program options which might be used to suppress such
          warnings. */
       gcry_control (GCRYCTL_SUSPEND_SECMEM_WARN);

       /* ... If required, other initialization goes here.  Note that the
          process might still be running with increased privileges and that
          the secure memory has not been intialized.  */

       /* Allocate a pool of 16k secure memory.  This make the secure memory
          available and also drops privileges where needed.  */
       gcry_control (GCRYCTL_INIT_SECMEM, 16384, 0);

     /* It is now okay to let Libgcrypt complain when there was/is
          a problem with the secure memory. */
       gcry_control (GCRYCTL_RESUME_SECMEM_WARN);

       /* ... If required, other initialization goes here.  */

       /* Tell Libgcrypt that initialization has completed. */
       gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);

   It is important that these initialization steps are not done by a
library but by the actual application.  A library using Libgcrypt might
want to check for finished initialization using:

       if (!gcry_control (GCRYCTL_INITIALIZATION_FINISHED_P))
         {
           fputs ("libgcrypt has not been initialized\n", stderr);
           abort ();
         }

   Instead of terminating the process, the library may instead print a
warning and try to initialize Libgcrypt itself.  See also the section on
multi-threading below for more pitfalls.


File: gcrypt.info,  Node: Multi-Threading,  Next: Enabling FIPS mode,  Prev: Initializing the library,  Up: Preparation

2.5 Multi-Threading
===================

As mentioned earlier, the Libgcrypt library is thread-safe if you
adhere to the following requirements:

   * If your application is multi-threaded, you must set the thread
     support callbacks with the `GCRYCTL_SET_THREAD_CBS' command
     *before* any other function in the library.

     This is easy enough if you are indeed writing an application using
     Libgcrypt.  It is rather problematic if you are writing a library
     instead.  Here are some tips what to do if you are writing a
     library:

     If your library requires a certain thread package, just initialize
     Libgcrypt to use this thread package.  If your library supports
     multiple thread packages, but needs to be configured, you will
     have to implement a way to determine which thread package the
     application wants to use with your library anyway.  Then configure
     Libgcrypt to use this thread package.

     If your library is fully reentrant without any special support by a
     thread package, then you are lucky indeed.  Unfortunately, this
     does not relieve you from doing either of the two above, or use a
     third option.  The third option is to let the application
     initialize Libgcrypt for you.  Then you are not using Libgcrypt
     transparently, though.

     As if this was not difficult enough, a conflict may arise if two
     libraries try to initialize Libgcrypt independently of each
     others, and both such libraries are then linked into the same
     application.  To make it a bit simpler for you, this will probably
     work, but only if both libraries have the same requirement for the
     thread package.  This is currently only supported for the
     non-threaded case, GNU Pth and pthread.  Support for more thread
     packages is easy to add, so contact us if you require it.

   * The function `gcry_check_version' must be called before any other
     function in the library, except the `GCRYCTL_SET_THREAD_CBS'
     command (called via the `gcry_control' function), because it
     initializes the thread support subsystem in Libgcrypt.  To achieve
     this in multi-threaded programs, you must synchronize the memory
     with respect to other threads that also want to use Libgcrypt.
     For this, it is sufficient to call `gcry_check_version' before
     creating the other threads using Libgcrypt(1).

   * Just like the function `gpg_strerror', the function
     `gcry_strerror' is not thread safe.  You have to use
     `gpg_strerror_r' instead.


   Libgcrypt contains convenient macros, which define the necessary
thread callbacks for PThread and for GNU Pth:

`GCRY_THREAD_OPTION_PTH_IMPL'
     This macro defines the following (static) symbols:
     `gcry_pth_init', `gcry_pth_mutex_init', `gcry_pth_mutex_destroy',
     `gcry_pth_mutex_lock', `gcry_pth_mutex_unlock', `gcry_pth_read',
     `gcry_pth_write', `gcry_pth_select', `gcry_pth_waitpid',
     `gcry_pth_accept', `gcry_pth_connect', `gcry_threads_pth'.

     After including this macro, `gcry_control()' shall be used with a
     command of `GCRYCTL_SET_THREAD_CBS' in order to register the
     thread callback structure named "gcry_threads_pth".

`GCRY_THREAD_OPTION_PTHREAD_IMPL'
     This macro defines the following (static) symbols:
     `gcry_pthread_mutex_init', `gcry_pthread_mutex_destroy',
     `gcry_pthread_mutex_lock', `gcry_pthread_mutex_unlock',
     `gcry_threads_pthread'.

     After including this macro, `gcry_control()' shall be used with a
     command of `GCRYCTL_SET_THREAD_CBS' in order to register the
     thread callback structure named "gcry_threads_pthread".

   Note that these macros need to be terminated with a semicolon.  Keep
in mind that these are convenient macros for C programmers; C++
programmers might have to wrap these macros in an "extern C" body.

   ---------- 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, more relaxed or more strict rules may apply.


File: gcrypt.info,  Node: Enabling FIPS mode,  Prev: Multi-Threading,  Up: Preparation

2.6 How to enable the FIPS mode
===============================

Libgcrypt may be used in a FIPS 140-2 mode.  Note, that this does not
necessary mean that Libcgrypt is an appoved FIPS 140-2 module.  Check
the NIST database at `http://csrc.nist.gov/groups/STM/cmvp/' to see what
versions of Libgcrypt are approved.

   Because FIPS 140 has certain restrictions on the use of cryptography
which are not always wanted, Libgcrypt needs to be put into FIPS mode
explicitly.  Three alternative mechanisms are provided to switch
Libgcrypt into this mode:

   * If the file `/proc/sys/crypto/fips_enabled' exists and contains a
     numeric value other than `0', Libgcrypt is put into FIPS mode at
     initialization time.  Obviously this works only on systems with a
     `proc' file system (i.e. GNU/Linux).

   * If the file `/etc/gcrypt/fips_enabled' exists, Libgcrypt is put
     into FIPS mode at initialization time.  Note that this filename is
     hardwired and does not depend on any configuration options.

   * If the application requests FIPS mode using the control command
     `GCRYCTL_FORCE_FIPS_MODE'.  This must be done prior to any
     initialization (i.e. before `gcry_check_version').


   In addition to the standard FIPS mode, Libgcrypt may also be put into
an Enforced FIPS mode by writing a non-zero value into the file
`/etc/gcrypt/fips_enabled'.  The Enforced FIPS mode helps to detect
applications which don't fulfill all requirements for using Libgcrypt
in FIPS mode (*note FIPS Mode::).

   Once Libgcrypt has been put into FIPS mode, it is not possible to
switch back to standard mode without terminating the process first.  If
the logging verbosity level of Libgcrypt has been set to at least 2,
the state transitions and the self-tests are logged.


File: gcrypt.info,  Node: Generalities,  Next: Handler Functions,  Prev: Preparation,  Up: Top

3 Generalities
**************

* Menu:

* Controlling the library::     Controlling Libgcrypt's behavior.
* Modules::                     Description of extension modules.
* Error Handling::              Error codes and such.


File: gcrypt.info,  Node: Controlling the library,  Next: Modules,  Up: Generalities

3.1 Controlling the library
===========================

 -- Function: gcry_error_t gcry_control (enum gcry_ctl_cmds CMD, ...)
     This function can be used to influence the general behavior of
     Libgcrypt in several ways.  Depending on CMD, more arguments can
     or have to be provided.

    `GCRYCTL_ENABLE_M_GUARD; Arguments: none'
          This command enables the built-in memory guard.  It must not
          be used to activate the memory guard after the memory
          management has already been used; therefore it can ONLY be
          used at initialization time.  Note that the memory guard is
          NOT used when the user of the library has set his own memory
          management callbacks.

    `GCRYCTL_ENABLE_QUICK_RANDOM; Arguments: none'
          This command inhibits the use the very secure random quality
          level (`GCRY_VERY_STRONG_RANDOM') and degrades all request
          down to `GCRY_STRONG_RANDOM'.  In general this is not
          recommened.  However, for some applications the extra quality
          random Libgcrypt tries to create is not justified and this
          option may help to get better performace.  Please check with
          a crypto expert whether this option can be used for your
          application.

          This option can only be used at initialization time.

    `GCRYCTL_DUMP_RANDOM_STATS; Arguments: none'
          This command dumps randum number generator related statistics
          to the library's logging stream.

    `GCRYCTL_DUMP_MEMORY_STATS; Arguments: none'
          This command dumps memory managment related statistics to the
          library's logging stream.

    `GCRYCTL_DUMP_SECMEM_STATS; Arguments: none'
          This command dumps secure memory manamgent related statistics
          to the library's logging stream.

    `GCRYCTL_DROP_PRIVS; Arguments: none'
          This command disables the use of secure memory and drops the
          priviliges of the current process.  This command has not much
          use; the suggested way to disable secure memory is to use
          `GCRYCTL_DISABLE_SECMEM' right after initialization.

    `GCRYCTL_DISABLE_SECMEM; Arguments: none'
          This command disables the use of secure memory.  If this
          command is used in FIPS mode, FIPS mode will be disabled and
          the function `gcry_fips_mode_active' returns false.  However,
          in Enforced FIPS mode this command has no effect at all.

          Many applications do not require secure memory, so they
          should disable it right away.  This command should be
          executed right after `gcry_check_version'.

    `GCRYCTL_INIT_SECMEM; Arguments: int nbytes'
          This command is used to allocate a pool of secure memory and
          thus enabling the use of secure memory.  It also drops all
          extra privileges the process has (i.e. if it is run as setuid
          (root)).  If the argument NBYTES is 0, secure memory will be
          disabled.  The minimum amount of secure memory allocated is
          currently 16384 bytes; you may thus use a value of 1 to
          request that default size.

    `GCRYCTL_TERM_SECMEM; Arguments: none'
          This command zeroises the secure memory and destroys the
          handler.  The secure memory pool may not be used anymore
          after running this command.  If the secure memory pool as
          already been destroyed, this command has no effect.
          Applications might want to run this command from their exit
          handler to make sure that the secure memory gets properly
          destroyed.  This command is not necessarily thread-safe but
          that should not be needed in cleanup code.  It may be called
          from a signal handler.

    `GCRYCTL_DISABLE_SECMEM_WARN; Arguments: none'
          Disable warning messages about problems with the secure memory
          subsystem. This command should be run right after
          `gcry_check_version'.

    `GCRYCTL_SUSPEND_SECMEM_WARN; Arguments: none'
          Postpone warning messages from the secure memory subsystem.
          *Note the initialization example: sample-use-suspend-secmem,
          on how to use it.

    `GCRYCTL_RESUME_SECMEM_WARN; Arguments: none'
          Resume warning messages from the secure memory subsystem.
          *Note the initialization example: sample-use-resume-secmem,
          on how to use it.

    `GCRYCTL_USE_SECURE_RNDPOOL; Arguments: none'
          This command tells the PRNG to store random numbers in secure
          memory.  This command should be run right after
          `gcry_check_version' and not later than the command
          GCRYCTL_INIT_SECMEM.  Note that in FIPS mode the secure
          memory is always used.

    `GCRYCTL_SET_RANDOM_SEED_FILE; Arguments: const char *filename'
          This command specifies the file, which is to be used as seed
          file for the PRNG.  If the seed file is registered prior to
          initialization of the PRNG, the seed file's content (if it
          exists and seems to be valid) is fed into the PRNG pool.
          After the seed file has been registered, the PRNG can be
          signalled to write out the PRNG pool's content into the seed
          file with the following command.

    `GCRYCTL_UPDATE_RANDOM_SEED_FILE; Arguments: none'
          Write out the PRNG pool's content into the registered seed
          file.

          Multiple instances of the applications sharing the same
          random seed file can be started in parallel, in which case
          they will read out the same pool and then race for updating
          it (the last update overwrites earlier updates).  They will
          differentiate only by the weak entropy that is added in
          read_seed_file based on the PID and clock, and up to 16 bytes
          of weak random non-blockingly.  The consequence is that the
          output of these different instances is correlated to some
          extent.  In a perfect attack scenario, the attacker can
          control (or at least guess) the PID and clock of the
          application, and drain the system's entropy pool to reduce
          the "up to 16 bytes" above to 0.  Then the dependencies of the
          inital states of the pools are completely known.  Note that
          this is not an issue if random of `GCRY_VERY_STRONG_RANDOM'
          quality is requested as in this case enough extra entropy
          gets mixed.  It is also not an issue when using Linux
          (rndlinux driver), because this one guarantees to read full
          16 bytes from /dev/urandom and thus there is no way for an
          attacker without kernel access to control these 16 bytes.

    `GCRYCTL_SET_VERBOSITY; Arguments: int level'
          This command sets the verbosity of the logging.  A level of 0
          disables all extra logging whereas positive numbers enable
          more verbose logging.  The level may be changed at any time
          but be aware that no memory synchronization is done so the
          effect of this command might not immediately show up in other
          threads.  This command may even be used prior to
          `gcry_check_version'.

    `GCRYCTL_SET_DEBUG_FLAGS; Arguments: unsigned int flags'
          Set the debug flag bits as given by the argument.  Be aware
          that that no memory synchronization is done so the effect of
          this command might not immediately show up in other threads.
          The debug flags are not considered part of the API and thus
          may change without notice.  As of now bit 0 enables debugging
          of cipher functions and bit 1 debugging of
          multi-precision-integers.  This command may even be used
          prior to `gcry_check_version'.

    `GCRYCTL_CLEAR_DEBUG_FLAGS; Arguments: unsigned int flags'
          Set the debug flag bits as given by the argument.  Be aware
          that that no memory synchronization is done so the effect of
          this command might not immediately show up in other threads.
          This command may even be used prior to `gcry_check_version'.

    `GCRYCTL_DISABLE_INTERNAL_LOCKING; Arguments: none'
          This command does nothing.  It exists only for backward
          compatibility.

    `GCRYCTL_ANY_INITIALIZATION_P; Arguments: none'
          This command returns true if the library has been basically
          initialized.  Such a basic initialization happens implicitly
          with many commands to get certain internal subsystems
          running.  The common and suggested way to do this basic
          intialization is by calling gcry_check_version.

    `GCRYCTL_INITIALIZATION_FINISHED; Arguments: none'
          This command tells the libray that the application has
          finished the intialization.

    `GCRYCTL_INITIALIZATION_FINISHED_P; Arguments: none'
          This command returns true if the command
          GCRYCTL_INITIALIZATION_FINISHED has already been run.

    `GCRYCTL_SET_THREAD_CBS; Arguments: struct ath_ops *ath_ops'
          This command registers a thread-callback structure.  *Note
          Multi-Threading::.

    `GCRYCTL_FAST_POLL; Arguments: none'
          Run a fast random poll.

    `GCRYCTL_SET_RNDEGD_SOCKET; Arguments: const char *filename'
          This command may be used to override the default name of the
          EGD socket to connect to.  It may be used only during
          initialization as it is not thread safe.  Changing the socket
          name again is not supported.  The function may return an
          error if the given filename is too long for a local socket
          name.

          EGD is an alternative random gatherer, used only on systems
          lacking a proper random device.

    `GCRYCTL_PRINT_CONFIG; Arguments: FILE *stream'
          This command dumps information pertaining to the
          configuration of the library to the given stream.  If NULL is
          given for STREAM, the log system is used.  This command may
          be used before the intialization has been finished but not
          before a gcry_version_check.

    `GCRYCTL_OPERATIONAL_P; Arguments: none'
          This command returns true if the library is in an operational
          state.  This information makes only sense in FIPS mode.  In
          contrast to other functions, this is a pure test function and
          won't put the library into FIPS mode or change the internal
          state.  This command may be used before the intialization has
          been finished but not before a gcry_version_check.

    `GCRYCTL_FIPS_MODE_P; Arguments: none'
          This command returns true if the library is in FIPS mode.
          Note, that this is no indication about the current state of
          the library.  This command may be used before the
          intialization has been finished but not before a
          gcry_version_check.  An application may use this command or
          the convenience macro below to check whether FIPS mode is
          actually active.

           -- Function: int gcry_fips_mode_active (void)
               Returns true if the FIPS mode is active.  Note that this
               is implemented as a macro.

    `GCRYCTL_FORCE_FIPS_MODE; Arguments: none'
          Running this command puts the library into FIPS mode.  If the
          library is already in FIPS mode, a self-test is triggered and
          thus the library will be put into operational state.  This
          command may be used before a call to gcry_check_version and
          that is actually the recommended way to let an application
          switch the library into FIPS mode.  Note that Libgcrypt will
          reject an attempt to switch to fips mode during or after the
          intialization.

    `GCRYCTL_SELFTEST; Arguments: none'
          This may be used at anytime to have the library run all
          implemented self-tests.  It works in standard and in FIPS
          mode.  Returns 0 on success or an error code on failure.




File: gcrypt.info,  Node: Modules,  Next: Error Handling,  Prev: Controlling the library,  Up: Generalities

3.2 Modules
===========

Libgcrypt supports the use of `extension modules', which implement
algorithms in addition to those already built into the library directly.

 -- Data type: gcry_module_t
     This data type represents a `module'.

   Functions registering modules provided by the user take a `module
specification structure' as input and return a value of `gcry_module_t'
and an ID that is unique in the modules' category.  This ID can be used
to reference the newly registered module.  After registering a module
successfully, the new functionality should be able to be used through
the normal functions provided by Libgcrypt until it is unregistered
again.


File: gcrypt.info,  Node: Error Handling,  Prev: Modules,  Up: Generalities

3.3 Error Handling
==================

Many functions in Libgcrypt 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.

   Libgcrypt uses the `libgpg-error' library.  This allows to share the
error codes with other components of the GnuPG system, and to 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, Libgcrypt does not use its own identifiers
for error codes, but uses those provided by `libgpg-error'.  They
usually start with `GPG_ERR_'.

   However, Libgcrypt does provide aliases for the functions defined in
libgpg-error, which might be preferred for name space consistency.

   Most functions in Libgcrypt return an error code in the case of
failure.  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 canceling 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.

   GnuPG components, including Libgcrypt, use an extra library named
libgpg-error to provide a common error handling scheme.  For more
information on libgpg-error, see the according manual.

* 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: gcrypt.info,  Node: Error Values,  Next: Error Sources,  Up: Error Handling

3.3.1 Error Values
------------------

 -- Data type: gcry_err_code_t
     The `gcry_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: gcry_err_source_t
     The `gcry_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: gcry_error_t
     The `gcry_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 Libgcrypt, the error source is used purely for
     diagnostic 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: gcry_err_code_t gcry_err_code (gcry_error_t ERR)
     The static inline function `gcry_err_code' returns the
     `gcry_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: gcry_err_source_t gcry_err_source (gcry_error_t ERR)
     The static inline function `gcry_err_source' returns the
     `gcry_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: gcry_error_t gcry_err_make (gcry_err_source_t SOURCE,
          gcry_err_code_t CODE)
     The static inline function `gcry_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: gcry_error_t gcry_error (gcry_err_code_t CODE)
     The static inline function `gcry_error' returns the error value
     consisting of the default error source and the error code CODE.

     For GCRY applications, the default error source is
     `GPG_ERR_SOURCE_USER_1'.  You can define `GCRY_ERR_SOURCE_DEFAULT'
     before including `gcrypt.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 errno numbers.

 -- Function: gcry_error_t gcry_err_make_from_errno
          (gcry_err_source_t SOURCE, int ERR)
     The function `gcry_err_make_from_errno' is like `gcry_err_make',
     but it takes a system error like `errno' instead of a
     `gcry_err_code_t' error code.

 -- Function: gcry_error_t gcry_error_from_errno (int ERR)
     The function `gcry_error_from_errno' is like `gcry_error', but it
     takes a system error like `errno' instead of a `gcry_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: gcry_err_code_t gcry_err_code_from_errno (int ERR)
     The function `gcry_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 gcry_err_code_to_errno (gcry_err_code_t ERR)
     The function `gcry_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: gcrypt.info,  Node: Error Sources,  Next: Error Codes,  Prev: Error Values,  Up: Error Handling

3.3.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
Libgcrypt 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.

`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
     OpenPGP 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 Libgcrypt
     can use them to mark error values coming from callback handlers.
     Thus `GPG_ERR_SOURCE_USER_1' is the default for errors created
     with `gcry_error' and `gcry_error_from_errno', unless you define
     `GCRY_ERR_SOURCE_DEFAULT' before including `gcrypt.h'.


File: gcrypt.info,  Node: Error Codes,  Next: Error Strings,  Prev: Error Sources,  Up: Error Handling

3.3.3 Error Codes
-----------------

The library `libgpg-error' defines many error values.  The following
list includes the most important error codes.

`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 occurred, 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_EFOO 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.

`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 data was expected where no data was found.

`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_WRONG_KEY_USAGE'
     This value indicates that a key is not used appropriately.

`GPG_ERR_NO_SECKEY'
     This value indicates that no secret key for the user ID is
     available.

`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_NOT_OPERATIONAL'
     This value means that the library is not yet in state which allows
     to use this function.  This error code is in particular returned if
     Libgcrypt is operated in FIPS mode and the internal state of the
     library does not yet or not anymore allow the use of a service.

     This error code is only available with newer libgpg-error
     versions, thus you might see "invalid error code" when passing
     this to `gpg_strerror'.  The numeric value of this error code is
     176.

`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 Libgcrypt 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: gcrypt.info,  Node: Error Strings,  Prev: Error Codes,  Up: Error Handling

3.3.4 Error Strings
-------------------

 -- Function: const char * gcry_strerror (gcry_error_t ERR)
     The function `gcry_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.

 -- Function: const char * gcry_strsource (gcry_error_t ERR)
     The function `gcry_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 the functions described
above:

     {
       gcry_cipher_hd_t handle;
       gcry_error_t err = 0;

       err = gcry_cipher_open (&handle, GCRY_CIPHER_AES,
                               GCRY_CIPHER_MODE_CBC, 0);
       if (err)
         {
           fprintf (stderr, "Failure: %s/%s\n",
                    gcry_strsource (err),
                    gcry_strerror (err));
         }
     }


File: gcrypt.info,  Node: Handler Functions,  Next: Symmetric cryptography,  Prev: Generalities,  Up: Top

4 Handler Functions
*******************

Libgcrypt makes it possible to install so called `handler functions',
which get called by Libgcrypt in case of certain events.

* Menu:

* Progress handler::            Using a progress handler function.
* Allocation handler::          Using special memory allocation functions.
* Error handler::               Using error handler functions.
* Logging handler::             Using a special logging function.


File: gcrypt.info,  Node: Progress handler,  Next: Allocation handler,  Up: Handler Functions

4.1 Progress handler
====================

It is often useful to retrieve some feedback while long running
operations are performed.

 -- Data type: gcry_handler_progress_t
     Progress handler functions have to be of the type
     `gcry_handler_progress_t', which is defined as:

     `void (*gcry_handler_progress_t) (void *, const char *, int, int,
     int)'

   The following function may be used to register a handler function for
this purpose.

 -- Function: void gcry_set_progress_handler (gcry_handler_progress_t
          CB, void *CB_DATA)
     This function installs CB as the `Progress handler' function.  It
     may be used only during initialization.  CB must be defined as
     follows:

          void
          my_progress_handler (void *CB_DATA, const char *WHAT,
                               int PRINTCHAR, int CURRENT, int TOTAL)
          {
            /* Do something.  */
          }

     A description of the arguments of the progress handler function
     follows.

    CB_DATA
          The argument provided in the call to
          `gcry_set_progress_handler'.

    WHAT
          A string identifying the type of the progress output.  The
          following values for WHAT are defined:

         `need_entropy'
               Not enough entropy is available.  TOTAL holds the number
               of required bytes.

         `primegen'
               Values for PRINTCHAR:
              `\n'
                    Prime generated.

              `!'
                    Need to refresh the pool of prime numbers.

              `<, >'
                    Number of bits adjusted.

              `^'
                    Searching for a generator.

              `.'
                    Fermat test on 10 candidates failed.

              `:'
                    Restart with a new random value.

              `+'
                    Rabin Miller test passed.




File: gcrypt.info,  Node: Allocation handler,  Next: Error handler,  Prev: Progress handler,  Up: Handler Functions

4.2 Allocation handler
======================

It is possible to make Libgcrypt use special memory allocation
functions instead of the built-in ones.

   Memory allocation functions are of the following types:

 -- Data type: gcry_handler_alloc_t
     This type is defined as: `void *(*gcry_handler_alloc_t) (size_t
     n)'.

 -- Data type: gcry_handler_secure_check_t
     This type is defined as: `int *(*gcry_handler_secure_check_t)
     (const void *)'.

 -- Data type: gcry_handler_realloc_t
     This type is defined as: `void *(*gcry_handler_realloc_t) (void
     *p, size_t n)'.

 -- Data type: gcry_handler_free_t
     This type is defined as: `void *(*gcry_handler_free_t) (void *)'.

   Special memory allocation functions can be installed with the
following function:

 -- Function: void gcry_set_allocation_handler (gcry_handler_alloc_t
          FUNC_ALLOC, gcry_handler_alloc_t FUNC_ALLOC_SECURE,
          gcry_handler_secure_check_t FUNC_SECURE_CHECK,
          gcry_handler_realloc_t FUNC_REALLOC, gcry_handler_free_t
          FUNC_FREE)
     Install the provided functions and use them instead of the built-in
     functions for doing memory allocation.  Using this function is in
     general not recommended because the standard Libgcrypt allocation
     functions are guaranteed to zeroize memory if needed.

     This function may be used only during initialization and may not be
     used in fips mode.



File: gcrypt.info,  Node: Error handler,  Next: Logging handler,  Prev: Allocation handler,  Up: Handler Functions

4.3 Error handler
=================

The following functions may be used to register handler functions that
are called by Libgcrypt in case certain error conditions occur.  They
may and should be registered prior to calling `gcry_check_version'.

 -- Data type: gcry_handler_no_mem_t
     This type is defined as: `int (*gcry_handler_no_mem_t) (void *,
     size_t, unsigned int)'

 -- Function: void gcry_set_outofcore_handler (gcry_handler_no_mem_t
          FUNC_NO_MEM, void *CB_DATA)
     This function registers FUNC_NO_MEM as `out-of-core handler',
     which means that it will be called in the case of not having enough
     memory available.  The handler is called with 3 arguments: The
     first one is the pointer CB_DATA as set with this function, the
     second is the requested memory size and the last being a flag.  If
     bit 0 of the flag is set, secure memory has been requested.  The
     handler should either return true to indicate that Libgcrypt
     should try again allocating memory or return false to let
     Libgcrypt use its default fatal error handler.

 -- Data type: gcry_handler_error_t
     This type is defined as: `void (*gcry_handler_error_t) (void *,
     int, const char *)'

 -- Function: void gcry_set_fatalerror_handler (gcry_handler_error_t
          FUNC_ERROR, void *CB_DATA)
     This function registers FUNC_ERROR as `error handler', which means
     that it will be called in error conditions.


File: gcrypt.info,  Node: Logging handler,  Prev: Error handler,  Up: Handler Functions

4.4 Logging handler
===================

 -- Data type: gcry_handler_log_t
     This type is defined as: `void (*gcry_handler_log_t) (void *, int,
     const char *, va_list)'

 -- Function: void gcry_set_log_handler (gcry_handler_log_t FUNC_LOG,
          void *CB_DATA)
     This function registers FUNC_LOG as `logging handler', which means
     that it will be called in case Libgcrypt wants to log a message.
     This function may and should be used prior to calling
     `gcry_check_version'.


File: gcrypt.info,  Node: Symmetric cryptography,  Next: Public Key cryptography,  Prev: Handler Functions,  Up: Top

5 Symmetric cryptography
************************

The cipher functions are used for symmetrical cryptography, i.e.
cryptography using a shared key.  The programming model follows an
open/process/close paradigm and is in that similar to other building
blocks provided by Libgcrypt.

* Menu:

* Available ciphers::           List of ciphers supported by the library.
* Cipher modules::              How to work with cipher modules.
* Available cipher modes::      List of cipher modes supported by the library.
* Working with cipher handles::  How to perform operations related to cipher handles.
* General cipher functions::    General cipher functions independent of cipher handles.


File: gcrypt.info,  Node: Available ciphers,  Next: Cipher modules,  Up: Symmetric cryptography

5.1 Available ciphers
=====================

`GCRY_CIPHER_NONE'
     This is not a real algorithm but used by some functions as error
     return.  The value always evaluates to false.

`GCRY_CIPHER_IDEA'
     This is the IDEA algorithm.  The constant is provided but there is
     currently no implementation for it because the algorithm is
     patented.

`GCRY_CIPHER_3DES'
     Triple-DES with 3 Keys as EDE.  The key size of this algorithm is
     168 but you have to pass 192 bits because the most significant
     bits of each byte are ignored.

`GCRY_CIPHER_CAST5'
     CAST128-5 block cipher algorithm.  The key size is 128 bits.

`GCRY_CIPHER_BLOWFISH'
     The blowfish algorithm. The current implementation allows only for
     a key size of 128 bits.

`GCRY_CIPHER_SAFER_SK128'
     Reserved and not currently implemented.

`GCRY_CIPHER_DES_SK'
     Reserved and not currently implemented.

`GCRY_CIPHER_AES'
`GCRY_CIPHER_AES128'
`GCRY_CIPHER_RIJNDAEL'
`GCRY_CIPHER_RIJNDAEL128'
     AES (Rijndael) with a 128 bit key.

`GCRY_CIPHER_AES192'
`GCRY_CIPHER_RIJNDAEL192'
     AES (Rijndael) with a 192 bit key.

`GCRY_CIPHER_AES256'
`GCRY_CIPHER_RIJNDAEL256'
     AES (Rijndael) with a 256 bit key.

`GCRY_CIPHER_TWOFISH'
     The Twofish algorithm with a 256 bit key.

`GCRY_CIPHER_TWOFISH128'
     The Twofish algorithm with a 128 bit key.

`GCRY_CIPHER_ARCFOUR'
     An algorithm which is 100% compatible with RSA Inc.'s RC4
     algorithm.  Note that this is a stream cipher and must be used
     very carefully to avoid a couple of weaknesses.

`GCRY_CIPHER_DES'
     Standard DES with a 56 bit key. You need to pass 64 bit but the
     high bits of each byte are ignored.  Note, that this is a weak
     algorithm which can be broken in reasonable time using a brute
     force approach.

`GCRY_CIPHER_SERPENT128'
`GCRY_CIPHER_SERPENT192'
`GCRY_CIPHER_SERPENT256'
     The Serpent cipher from the AES contest.

`GCRY_CIPHER_RFC2268_40'
`GCRY_CIPHER_RFC2268_128'
     Ron's Cipher 2 in the 40 and 128 bit variants.  Note, that we
     currently only support the 40 bit variant.  The identifier for 128
     is reserved for future use.

`GCRY_CIPHER_SEED'
     A 128 bit cipher as described by RFC4269.

`GCRY_CIPHER_CAMELLIA128'
`GCRY_CIPHER_CAMELLIA192'
`GCRY_CIPHER_CAMELLIA256'
     The Camellia cipher by NTT.  See
     `http://info.isl.ntt.co.jp/crypt/eng/camellia/specifications.html'.



File: gcrypt.info,  Node: Cipher modules,  Next: Available cipher modes,  Prev: Available ciphers,  Up: Symmetric cryptography

5.2 Cipher modules
==================

Libgcrypt makes it possible to load additional `cipher modules'; these
ciphers can be used just like the cipher algorithms that are built into
the library directly.  For an introduction into extension modules, see
*Note Modules::.

 -- Data type: gcry_cipher_spec_t
     This is the `module specification structure' needed for registering
     cipher modules, which has to be filled in by the user before it
     can be used to register a module.  It contains the following
     members:

    `const char *name'
          The primary name of the algorithm.

    `const char **aliases'
          A list of strings that are `aliases' for the algorithm.  The
          list must be terminated with a NULL element.

    `gcry_cipher_oid_spec_t *oids'
          A list of OIDs that are to be associated with the algorithm.
          The list's last element must have it's `oid' member set to
          NULL.  See below for an explanation of this type.

    `size_t blocksize'
          The block size of the algorithm, in bytes.

    `size_t keylen'
          The length of the key, in bits.

    `size_t contextsize'
          The size of the algorithm-specific `context', that should be
          allocated for each handle.

    `gcry_cipher_setkey_t setkey'
          The function responsible for initializing a handle with a
          provided key.  See below for a description of this type.

    `gcry_cipher_encrypt_t encrypt'
          The function responsible for encrypting a single block.  See
          below for a description of this type.

    `gcry_cipher_decrypt_t decrypt'
          The function responsible for decrypting a single block.  See
          below for a description of this type.

    `gcry_cipher_stencrypt_t stencrypt'
          Like `encrypt', for stream ciphers.  See below for a
          description of this type.

    `gcry_cipher_stdecrypt_t stdecrypt'
          Like `decrypt', for stream ciphers.  See below for a
          description of this type.

 -- Data type: gcry_cipher_oid_spec_t
     This type is used for associating a user-provided algorithm
     implementation with certain OIDs.  It contains the following
     members:
    `const char *oid'
          Textual representation of the OID.

    `int mode'
          Cipher mode for which this OID is valid.

 -- Data type: gcry_cipher_setkey_t
     Type for the `setkey' function, defined as: gcry_err_code_t
     (*gcry_cipher_setkey_t) (void *c, const unsigned char *key,
     unsigned keylen)

 -- Data type: gcry_cipher_encrypt_t
     Type for the `encrypt' function, defined as: gcry_err_code_t
     (*gcry_cipher_encrypt_t) (void *c, const unsigned char *outbuf,
     const unsigned char *inbuf)

 -- Data type: gcry_cipher_decrypt_t
     Type for the `decrypt' function, defined as: gcry_err_code_t
     (*gcry_cipher_decrypt_t) (void *c, const unsigned char *outbuf,
     const unsigned char *inbuf)

 -- Data type: gcry_cipher_stencrypt_t
     Type for the `stencrypt' function, defined as: gcry_err_code_t
     (*gcry_cipher_stencrypt_t) (void *c, const unsigned char *outbuf,
     const unsigned char *, unsigned int n)

 -- Data type: gcry_cipher_stdecrypt_t
     Type for the `stdecrypt' function, defined as: gcry_err_code_t
     (*gcry_cipher_stdecrypt_t) (void *c, const unsigned char *outbuf,
     const unsigned char *, unsigned int n)

 -- Function: gcry_error_t gcry_cipher_register (gcry_cipher_spec_t
          *CIPHER, unsigned int *algorithm_id, gcry_module_t *MODULE)
     Register a new cipher module whose specification can be found in
     CIPHER.  On success, a new algorithm ID is stored in ALGORITHM_ID
     and a pointer representing this module is stored in MODULE.

 -- Function: void gcry_cipher_unregister (gcry_module_t MODULE)
     Unregister the cipher identified by MODULE, which must have been
     registered with gcry_cipher_register.

 -- Function: gcry_error_t gcry_cipher_list (int *LIST, int
          *LIST_LENGTH)
     Get a list consisting of the IDs of the loaded cipher modules.  If
     LIST is zero, write the number of loaded cipher modules to
     LIST_LENGTH and return.  If LIST is non-zero, the first
     *LIST_LENGTH algorithm IDs are stored in LIST, which must be of
     according size.  In case there are less cipher modules than
     *LIST_LENGTH, *LIST_LENGTH is updated to the correct number.


File: gcrypt.info,  Node: Available cipher modes,  Next: Working with cipher handles,  Prev: Cipher modules,  Up: Symmetric cryptography

5.3 Available cipher modes
==========================

`GCRY_CIPHER_MODE_NONE'
     No mode specified.  This should not be used.  The only exception
     is that if Libgcrypt is not used in FIPS mode and if any debug
     flag has been set, this mode may be used to bypass the actual
     encryption.

`GCRY_CIPHER_MODE_ECB'
     Electronic Codebook mode.

`GCRY_CIPHER_MODE_CFB'
     Cipher Feedback mode.  The shift size equals the block size of the
     cipher (e.g. for AES it is CFB-128).

`GCRY_CIPHER_MODE_CBC'
     Cipher Block Chaining mode.

`GCRY_CIPHER_MODE_STREAM'
     Stream mode, only to be used with stream cipher algorithms.

`GCRY_CIPHER_MODE_OFB'
     Output Feedback mode.

`GCRY_CIPHER_MODE_CTR'
     Counter mode.



File: gcrypt.info,  Node: Working with cipher handles,  Next: General cipher functions,  Prev: Available cipher modes,  Up: Symmetric cryptography

5.4 Working with cipher handles
===============================

To use a cipher algorithm, you must first allocate an according handle.
This is to be done using the open function:

 -- Function: gcry_error_t gcry_cipher_open (gcry_cipher_hd_t *HD, int
          ALGO, int MODE, unsigned int FLAGS)
     This function creates the context handle required for most of the
     other cipher functions and returns a handle to it in `hd'.  In
     case of an error, an according error code is returned.

     The ID of algorithm to use must be specified via ALGO.  See *Note
     Available ciphers::, for a list of supported ciphers and the
     according constants.

     Besides using the constants directly, the function
     `gcry_cipher_map_name' may be used to convert the textual name of
     an algorithm into the according numeric ID.

     The cipher mode to use must be specified via MODE.  See *Note
     Available cipher modes::, for a list of supported cipher modes and
     the according constants.  Note that some modes are incompatible
     with some algorithms - in particular, stream mode
     (`GCRY_CIPHER_MODE_STREAM') only works with stream ciphers. Any
     block cipher mode (`GCRY_CIPHER_MODE_ECB', `GCRY_CIPHER_MODE_CBC',
     `GCRY_CIPHER_MODE_CFB', `GCRY_CIPHER_MODE_OFB' or
     `GCRY_CIPHER_MODE_CTR') will work with any block cipher algorithm.

     The third argument FLAGS can either be passed as `0' or as the
     bit-wise OR of the following constants.

    `GCRY_CIPHER_SECURE'
          Make sure that all operations are allocated in secure memory.
          This is useful when the key material is highly confidential.

    `GCRY_CIPHER_ENABLE_SYNC'
          This flag enables the CFB sync mode, which is a special
          feature of Libgcrypt's CFB mode implementation to allow for
          OpenPGP's CFB variant.  See `gcry_cipher_sync'.

    `GCRY_CIPHER_CBC_CTS'
          Enable cipher text stealing (CTS) for the CBC mode.  Cannot
          be used simultaneous as GCRY_CIPHER_CBC_MAC.  CTS mode makes
          it possible to transform data of almost arbitrary size (only
          limitation is that it must be greater than the algorithm's
          block size).

    `GCRY_CIPHER_CBC_MAC'
          Compute CBC-MAC keyed checksums.  This is the same as CBC
          mode, but only output the last block.  Cannot be used
          simultaneous as GCRY_CIPHER_CBC_CTS.

   Use the following function to release an existing handle:

 -- Function: void gcry_cipher_close (gcry_cipher_hd_t H)
     This function releases the context created by `gcry_cipher_open'.
     It also zeroises all sensitive information associated with this
     cipher handle.

   In order to use a handle for performing cryptographic operations, a
`key' has to be set first:

 -- Function: gcry_error_t gcry_cipher_setkey (gcry_cipher_hd_t H,
          const void *K, size_t L)
     Set the key K used for encryption or decryption in the context
     denoted by the handle H.  The length L (in bytes) of the key K
     must match the required length of the algorithm set for this
     context or be in the allowed range for algorithms with variable
     key size.  The function checks this and returns an error if there
     is a problem.  A caller should always check for an error.


   Most crypto modes requires an initialization vector (IV), which
usually is a non-secret random string acting as a kind of salt value.
The CTR mode requires a counter, which is also similar to a salt value.
To set the IV or CTR, use these functions:

 -- Function: gcry_error_t gcry_cipher_setiv (gcry_cipher_hd_t H, const
          void *K, size_t L)
     Set the initialization vector used for encryption or decryption.
     The vector is passed as the buffer K of length L bytes and copied
     to internal data structures.  The function checks that the IV
     matches the requirement of the selected algorithm and mode.

 -- Function: gcry_error_t gcry_cipher_setctr (gcry_cipher_hd_t H,
          const void *C, size_t L)
     Set the counter vector used for encryption or decryption. The
     counter is passed as the buffer C of length L bytes and copied to
     internal data structures.  The function checks that the counter
     matches the requirement of the selected algorithm (i.e., it must be
     the same size as the block size).

 -- Function: gcry_error_t gcry_cipher_reset (gcry_cipher_hd_t H)
     Set the given handle's context back to the state it had after the
     last call to gcry_cipher_setkey and clear the initialization
     vector.

     Note that gcry_cipher_reset is implemented as a macro.

   The actual encryption and decryption is done by using one of the
following functions.  They may be used as often as required to process
all the data.

 -- Function: gcry_error_t gcry_cipher_encrypt (gcry_cipher_hd_t H,
          unsigned char *out, size_t OUTSIZE, const unsigned char *IN,
          size_t INLEN)
     `gcry_cipher_encrypt' is used to encrypt the data.  This function
     can either work in place or with two buffers.  It uses the cipher
     context already setup and described by the handle H.  There are 2
     ways to use the function: If IN is passed as `NULL' and INLEN is
     `0', in-place encryption of the data in OUT or length OUTSIZE
     takes place.  With IN being not `NULL', INLEN bytes are encrypted
     to the buffer OUT which must have at least a size of INLEN.
     OUTSIZE must be set to the allocated size of OUT, so that the
     function can check that there is sufficient space. Note that
     overlapping buffers are not allowed.

     Depending on the selected algorithms and encryption mode, the
     length of the buffers must be a multiple of the block size.

     The function returns `0' on success or an error code.

 -- Function: gcry_error_t gcry_cipher_decrypt (gcry_cipher_hd_t H,
          unsigned char *out, size_t OUTSIZE, const unsigned char *IN,
          size_t INLEN)
     `gcry_cipher_decrypt' is used to decrypt the data.  This function
     can either work in place or with two buffers.  It uses the cipher
     context already setup and described by the handle H.  There are 2
     ways to use the function: If IN is passed as `NULL' and INLEN is
     `0', in-place decryption of the data in OUT or length OUTSIZE
     takes place.  With IN being not `NULL', INLEN bytes are decrypted
     to the buffer OUT which must have at least a size of INLEN.
     OUTSIZE must be set to the allocated size of OUT, so that the
     function can check that there is sufficient space.  Note that
     overlapping buffers are not allowed.

     Depending on the selected algorithms and encryption mode, the
     length of the buffers must be a multiple of the block size.

     The function returns `0' on success or an error code.

   OpenPGP (as defined in RFC-2440) requires a special sync operation in
some places.  The following function is used for this:

 -- Function: gcry_error_t gcry_cipher_sync (gcry_cipher_hd_t H)
     Perform the OpenPGP sync operation on context H.  Note that this
     is a no-op unless the context was created with the flag
     `GCRY_CIPHER_ENABLE_SYNC'

   Some of the described functions are implemented as macros utilizing a
catch-all control function.  This control function is rarely used
directly but there is nothing which would inhibit it:

 -- Function: gcry_error_t gcry_cipher_ctl (gcry_cipher_hd_t H, int
          CMD, void *BUFFER, size_t BUFLEN)
     `gcry_cipher_ctl' controls various aspects of the cipher module and
     specific cipher contexts.  Usually some more specialized functions
     or macros are used for this purpose.  The semantics of the
     function and its parameters depends on the the command CMD and the
     passed context handle H.  Please see the comments in the source
     code (`src/global.c') for details.

 -- Function: gcry_error_t gcry_cipher_info (gcry_cipher_hd_t H, int
          WHAT, void *BUFFER, size_t *NBYTES)
     `gcry_cipher_info' is used to retrieve various information about a
     cipher context or the cipher module in general.

     Currently no information is available.


File: gcrypt.info,  Node: General cipher functions,  Prev: Working with cipher handles,  Up: Symmetric cryptography

5.5 General cipher functions
============================

To work with the algorithms, several functions are available to map
algorithm names to the internal identifiers, as well as ways to
retrieve information about an algorithm or the current cipher context.

 -- Function: gcry_error_t gcry_cipher_algo_info (int ALGO, int WHAT,
          void *BUFFER, size_t *NBYTES)
     This function is used to retrieve information on a specific
     algorithm.  You pass the cipher algorithm ID as ALGO and the type
     of information requested as WHAT. The result is either returned as
     the return code of the function or copied to the provided BUFFER
     whose allocated length must be available in an integer variable
     with the address passed in NBYTES.  This variable will also
     receive the actual used length of the buffer.

     Here is a list of supported codes for WHAT:

    `GCRYCTL_GET_KEYLEN:'
          Return the length of the key. If the algorithm supports
          multiple key lengths, the maximum supported value is
          returned.  The length is returned as number of octets (bytes)
          and not as number of bits in NBYTES; BUFFER must be zero.

    `GCRYCTL_GET_BLKLEN:'
          Return the block length of the algorithm.  The length is
          returned as a number of octets in NBYTES; BUFFER must be zero.

    `GCRYCTL_TEST_ALGO:'
          Returns `0' when the specified algorithm is available for use.
          BUFFER and NBYTES must be zero.



 -- Function: const char * gcry_cipher_algo_name (int ALGO)
     `gcry_cipher_algo_name' returns a string with the name of the
     cipher algorithm ALGO.  If the algorithm is not known or another
     error occurred, the string `"?"' is returned.  This function should
     not be used to test for the availability of an algorithm.

 -- Function: int gcry_cipher_map_name (const char *NAME)
     `gcry_cipher_map_name' returns the algorithm identifier for the
     cipher algorithm described by the string NAME.  If this algorithm
     is not available `0' is returned.

 -- Function: int gcry_cipher_mode_from_oid (const char *STRING)
     Return the cipher mode associated with an ASN.1 object identifier.
     The object identifier is expected to be in the IETF-style dotted
     decimal notation.  The function returns `0' for an unknown object
     identifier or when no mode is associated with it.


File: gcrypt.info,  Node: Public Key cryptography,  Next: Hashing,  Prev: Symmetric cryptography,  Up: Top

6 Public Key cryptography
*************************

Public key cryptography, also known as asymmetric cryptography, is an
easy way for key management and to provide digital signatures.
Libgcrypt provides two completely different interfaces to public key
cryptography, this chapter explains the one based on S-expressions.

* Menu:

* Available algorithms::        Algorithms supported by the library.
* Used S-expressions::          Introduction into the used S-expression.
* Public key modules::          How to work with public key modules.
* Cryptographic Functions::     Functions for performing the cryptographic actions.
* General public-key related Functions::  General functions, not implementing any cryptography.

* AC Interface::                Alternative interface to public key functions.


File: gcrypt.info,  Node: Available algorithms,  Next: Used S-expressions,  Up: Public Key cryptography

6.1 Available algorithms
========================

Libgcrypt supports the RSA (Rivest-Shamir-Adleman) algorithms as well
as DSA (Digital Signature Algorithm) and Elgamal.  The versatile
interface allows to add more algorithms in the future.


File: gcrypt.info,  Node: Used S-expressions,  Next: Public key modules,  Prev: Available algorithms,  Up: Public Key cryptography

6.2 Used S-expressions
======================

Libgcrypt's API for asymmetric cryptography is based on data structures
called S-expressions (see
`http://people.csail.mit.edu/rivest/sexp.html') and does not work with
contexts as most of the other building blocks of Libgcrypt do.

The following information are stored in S-expressions:

     keys

     plain text data

     encrypted data

     signatures


To describe how Libgcrypt expect keys, we use examples. Note that words
in uppercase indicate parameters whereas lowercase words are literals.

   Note that all MPI (multi-precision-integers) values are expected to
be in `GCRYMPI_FMT_USG' format.  An easy way to create S-expressions is
by using `gcry_sexp_build' which allows to pass a string with
printf-like escapes to insert MPI values.

* Menu:

* RSA key parameters::  Parameters used with an RSA key.
* DSA key parameters::  Parameters used with a DSA key.
* ECC key parameters::  Parameters used with ECC keys.


File: gcrypt.info,  Node: RSA key parameters,  Next: DSA key parameters,  Up: Used S-expressions

6.2.1 RSA key parameters
------------------------

An RSA private key is described by this S-expression:

     (private-key
       (rsa
         (n N-MPI)
         (e E-MPI)
         (d D-MPI)
         (p P-MPI)
         (q Q-MPI)
         (u U-MPI)))

An RSA public key is described by this S-expression:

     (public-key
       (rsa
         (n N-MPI)
         (e E-MPI)))

N-MPI
     RSA public modulus n.

E-MPI
     RSA public exponent e.

D-MPI
     RSA secret exponent d = e^-1 \bmod (p-1)(q-1).

P-MPI
     RSA secret prime p.

Q-MPI
     RSA secret prime q with p < q.

U-MPI
     Multiplicative inverse u = p^-1 \bmod q.

   For signing and decryption the parameters (p, q, u) are optional but
greatly improve the performance.  Either all of these optional
parameters must be given or none of them.  They are mandatory for
gcry_pk_testkey.

   Note that OpenSSL uses slighly different parameters: q < p and  u =
q^-1 \bmod p.  To use these parameters you will need to swap the values
and recompute u.  Here is example code to do this:

       if (gcry_mpi_cmp (p, q) > 0)
         {
           gcry_mpi_swap (p, q);
           gcry_mpi_invm (u, p, q);
         }


File: gcrypt.info,  Node: DSA key parameters,  Next: ECC key parameters,  Prev: RSA key parameters,  Up: Used S-expressions

6.2.2 DSA key parameters
------------------------

A DSA private key is described by this S-expression:

     (private-key
       (dsa
         (p P-MPI)
         (q Q-MPI)
         (g G-MPI)
         (y Y-MPI)
         (x X-MPI)))

P-MPI
     DSA prime p.

Q-MPI
     DSA group order q (which is a prime divisor of p-1).

G-MPI
     DSA group generator g.

Y-MPI
     DSA public key value y = g^x \bmod p.

X-MPI
     DSA secret exponent x.

   The public key is similar with "private-key" replaced by "public-key"
and no X-MPI.


File: gcrypt.info,  Node: ECC key parameters,  Prev: DSA key parameters,  Up: Used S-expressions

6.2.3 ECC key parameters
------------------------

An ECC private key is described by this S-expression:

     (private-key
       (ecc
         (p P-MPI)
         (a A-MPI)
         (b B-MPI)
         (g G-POINT)
         (n N-MPI)
         (q Q-POINT)
         (d D-MPI)))

P-MPI
     Prime specifying the field GF(p).

A-MPI
B-MPI
     The two coefficients of the Weierstrass equation y^2 = x^3 + ax + b

G-POINT
     Base point g.

N-MPI
     Order of g

Q-POINT
     The point representing the public key Q = dP.

D-MPI
     The private key d

   All point values are encoded in standard format; Libgcrypt does
currently only support uncompressed points, thus the first byte needs to
be `0x04'.

   The public key is similar with "private-key" replaced by "public-key"
and no D-MPI.

   If the domain parameters are well-known, the name of this curve may
be used.  For example

     (private-key
       (ecc
         (curve "NIST P-192")
         (q Q-POINT)
         (d D-MPI)))

   The `curve' parameter may be given in any case and is used to replace
missing parameters.

Currently implemented curves are:
`NIST P-192'
`1.2.840.10045.3.1.1'
`prime192v1'
`secp192r1'
     The NIST 192 bit curve, its OID, X9.62 and SECP aliases.

`NIST P-224'
`secp224r1'
     The NIST 224 bit curve and its SECP alias.

`NIST P-256'
`1.2.840.10045.3.1.7'
`prime256v1'
`secp256r1'
     The NIST 256 bit curve, its OID, X9.62 and SECP aliases.

`NIST P-384'
`secp384r1'
     The NIST 384 bit curve and its SECP alias.

`NIST P-521'
`secp521r1'
     The NIST 521 bit curve and its SECP alias.

   As usual the OIDs may optionally be prefixed with the string `OID.'
or `oid.'.


File: gcrypt.info,  Node: Public key modules,  Next: Cryptographic Functions,  Prev: Used S-expressions,  Up: Public Key cryptography

6.3 Public key modules
======================

Libgcrypt makes it possible to load additional `public key modules';
these public key algorithms can be used just like the algorithms that
are built into the library directly.  For an introduction into
extension modules, see *Note Modules::.

 -- Data type: gcry_pk_spec_t
     This is the `module specification structure' needed for registering
     public key modules, which has to be filled in by the user before it
     can be used to register a module.  It contains the following
     members:

    `const char *name'
          The primary name of this algorithm.

    `char **aliases'
          A list of strings that are `aliases' for the algorithm.  The
          list must be terminated with a NULL element.

    `const char *elements_pkey'
          String containing the one-letter names of the MPI values
          contained in a public key.

    `const char *element_skey'
          String containing the one-letter names of the MPI values
          contained in a secret key.

    `const char *elements_enc'
          String containing the one-letter names of the MPI values that
          are the result of an encryption operation using this
          algorithm.

    `const char *elements_sig'
          String containing the one-letter names of the MPI values that
          are the result of a sign operation using this algorithm.

    `const char *elements_grip'
          String containing the one-letter names of the MPI values that
          are to be included in the `key grip'.

    `int use'
          The bitwise-OR of the following flags, depending on the
          abilities of the algorithm:
         `GCRY_PK_USAGE_SIGN'
               The algorithm supports signing and verifying of data.

         `GCRY_PK_USAGE_ENCR'
               The algorithm supports the encryption and decryption of
               data.

    `gcry_pk_generate_t generate'
          The function responsible for generating a new key pair.  See
          below for a description of this type.

    `gcry_pk_check_secret_key_t check_secret_key'
          The function responsible for checking the sanity of a
          provided secret key.  See below for a description of this
          type.

    `gcry_pk_encrypt_t encrypt'
          The function responsible for encrypting data.  See below for a
          description of this type.

    `gcry_pk_decrypt_t decrypt'
          The function responsible for decrypting data.  See below for a
          description of this type.

    `gcry_pk_sign_t sign'
          The function responsible for signing data.  See below for a
          description of this type.

    `gcry_pk_verify_t verify'
          The function responsible for verifying that the provided
          signature matches the provided data.  See below for a
          description of this type.

    `gcry_pk_get_nbits_t get_nbits'
          The function responsible for returning the number of bits of
          a provided key.  See below for a description of this type.

 -- Data type: gcry_pk_generate_t
     Type for the `generate' function, defined as: gcry_err_code_t
     (*gcry_pk_generate_t) (int algo, unsigned int nbits, unsigned long
     use_e, gcry_mpi_t *skey, gcry_mpi_t **retfactors)

 -- Data type: gcry_pk_check_secret_key_t
     Type for the `check_secret_key' function, defined as:
     gcry_err_code_t (*gcry_pk_check_secret_key_t) (int algo,
     gcry_mpi_t *skey)

 -- Data type: gcry_pk_encrypt_t
     Type for the `encrypt' function, defined as: gcry_err_code_t
     (*gcry_pk_encrypt_t) (int algo, gcry_mpi_t *resarr, gcry_mpi_t
     data, gcry_mpi_t *pkey, int flags)

 -- Data type: gcry_pk_decrypt_t
     Type for the `decrypt' function, defined as: gcry_err_code_t
     (*gcry_pk_decrypt_t) (int algo, gcry_mpi_t *result, gcry_mpi_t
     *data, gcry_mpi_t *skey, int flags)

 -- Data type: gcry_pk_sign_t
     Type for the `sign' function, defined as: gcry_err_code_t
     (*gcry_pk_sign_t) (int algo, gcry_mpi_t *resarr, gcry_mpi_t data,
     gcry_mpi_t *skey)

 -- Data type: gcry_pk_verify_t
     Type for the `verify' function, defined as: gcry_err_code_t
     (*gcry_pk_verify_t) (int algo, gcry_mpi_t hash, gcry_mpi_t *data,
     gcry_mpi_t *pkey, int (*cmp) (void *, gcry_mpi_t), void *opaquev)

 -- Data type: gcry_pk_get_nbits_t
     Type for the `get_nbits' function, defined as: unsigned
     (*gcry_pk_get_nbits_t) (int algo, gcry_mpi_t *pkey)

 -- Function: gcry_error_t gcry_pk_register (gcry_pk_spec_t *PUBKEY,
          unsigned int *algorithm_id, gcry_module_t *MODULE)
     Register a new public key module whose specification can be found
     in PUBKEY.  On success, a new algorithm ID is stored in
     ALGORITHM_ID and a pointer representing this module is stored in
     MODULE.

 -- Function: void gcry_pk_unregister (gcry_module_t MODULE)
     Unregister the public key module identified by MODULE, which must
     have been registered with gcry_pk_register.

 -- Function: gcry_error_t gcry_pk_list (int *LIST, int *LIST_LENGTH)
     Get a list consisting of the IDs of the loaded pubkey modules.  If
     LIST is zero, write the number of loaded pubkey modules to
     LIST_LENGTH and return.  If LIST is non-zero, the first
     *LIST_LENGTH algorithm IDs are stored in LIST, which must be of
     according size.  In case there are less pubkey modules than
     *LIST_LENGTH, *LIST_LENGTH is updated to the correct number.


File: gcrypt.info,  Node: Cryptographic Functions,  Next: General public-key related Functions,  Prev: Public key modules,  Up: Public Key cryptography

6.4 Cryptographic Functions
===========================

Note that we will in future allow to use keys without p,q and u
specified and may also support other parameters for performance reasons.

Some functions operating on S-expressions support `flags', that
influence the operation.  These flags have to be listed in a
sub-S-expression named `flags'; the following flags are known:

`pkcs1'
     Use PKCS#1 block type 2 padding.

`no-blinding'
     Do not use a technique called `blinding', which is used by default
     in order to prevent leaking of secret information.  Blinding is
     only implemented by RSA, but it might be implemented by other
     algorithms in the future as well, when necessary.

Now that we know the key basics, we can carry on and explain how to
encrypt and decrypt data.  In almost all cases the data is a random
session key which is in turn used for the actual encryption of the real
data.  There are 2 functions to do this:

 -- Function: gcry_error_t gcry_pk_encrypt (gcry_sexp_t *R_CIPH,
          gcry_sexp_t DATA, gcry_sexp_t PKEY)
     Obviously a public key must be provided for encryption.  It is
     expected as an appropriate S-expression (see above) in PKEY.  The
     data to be encrypted can either be in the simple old format, which
     is a very simple S-expression consisting only of one MPI, or it
     may be a more complex S-expression which also allows to specify
     flags for operation, like e.g. padding rules.

     If you don't want to let Libgcrypt handle the padding, you must
     pass an appropriate MPI using this expression for DATA:

          (data
            (flags raw)
            (value MPI))

     This has the same semantics as the old style MPI only way.  MPI is
     the actual data, already padded appropriate for your protocol.
     Most systems however use PKCS#1 padding and so you can use this
     S-expression for DATA:

          (data
            (flags pkcs1)
            (value BLOCK))

     Here, the "flags" list has the "pkcs1" flag which let the function
     know that it should provide PKCS#1 block type 2 padding.  The
     actual data to be encrypted is passed as a string of octets in
     BLOCK.  The function checks that this data actually can be used
     with the given key, does the padding and encrypts it.

     If the function could successfully perform the encryption, the
     return value will be 0 and a new S-expression with the encrypted
     result is allocated and assigned to the variable at the address of
     R_CIPH.  The caller is responsible to release this value using
     `gcry_sexp_release'.  In case of an error, an error code is
     returned and R_CIPH will be set to `NULL'.

     The returned S-expression has this format when used with RSA:

          (enc-val
            (rsa
              (a A-MPI)))

     Where A-MPI is an MPI with the result of the RSA operation.  When
     using the Elgamal algorithm, the return value will have this
     format:

          (enc-val
            (elg
              (a A-MPI)
              (b B-MPI)))

     Where A-MPI and B-MPI are MPIs with the result of the Elgamal
     encryption operation.

 -- Function: gcry_error_t gcry_pk_decrypt (gcry_sexp_t *R_PLAIN,
          gcry_sexp_t DATA, gcry_sexp_t SKEY)
     Obviously a private key must be provided for decryption.  It is
     expected as an appropriate S-expression (see above) in SKEY.  The
     data to be decrypted must match the format of the result as
     returned by `gcry_pk_encrypt', but should be enlarged with a
     `flags' element:

          (enc-val
            (flags)
            (elg
              (a A-MPI)
              (b B-MPI)))

     Note that this function currently does not know of any padding
     methods and the caller must do any un-padding on his own.

     The function returns 0 on success or an error code.  The variable
     at the address of R_PLAIN will be set to NULL on error or receive
     the decrypted value on success.  The format of R_PLAIN is a simple
     S-expression part (i.e. not a valid one) with just one MPI if
     there was no `flags' element in DATA; if at least an empty `flags'
     is passed in DATA, the format is:

          (value PLAINTEXT)

   Another operation commonly performed using public key cryptography is
signing data.  In some sense this is even more important than
encryption because digital signatures are an important instrument for
key management.  Libgcrypt supports digital signatures using 2
functions, similar to the encryption functions:

 -- Function: gcry_error_t gcry_pk_sign (gcry_sexp_t *R_SIG,
          gcry_sexp_t DATA, gcry_sexp_t SKEY)
     This function creates a digital signature for DATA using the
     private key SKEY and place it into the variable at the address of
     R_SIG.  DATA may either be the simple old style S-expression with
     just one MPI or a modern and more versatile S-expression which
     allows to let Libgcrypt handle padding:

           (data
            (flags pkcs1)
            (hash HASH-ALGO BLOCK))

     This example requests to sign the data in BLOCK after applying
     PKCS#1 block type 1 style padding.  HASH-ALGO is a string with the
     hash algorithm to be encoded into the signature, this may be any
     hash algorithm name as supported by Libgcrypt.  Most likely, this
     will be "sha256" or "sha1".  It is obvious that the length of
     BLOCK must match the size of that message digests; the function
     checks that this and other constraints are valid.

     If PKCS#1 padding is not required (because the caller does already
     provide a padded value), either the old format or better the
     following format should be used:

          (data
            (flags raw)
            (value MPI))

     Here, the data to be signed is directly given as an MPI.

     The signature is returned as a newly allocated S-expression in
     R_SIG using this format for RSA:

          (sig-val
            (rsa
              (s S-MPI)))

     Where S-MPI is the result of the RSA sign operation.  For DSA the
     S-expression returned is:

          (sig-val
            (dsa
              (r R-MPI)
              (s S-MPI)))

     Where R-MPI and S-MPI are the result of the DSA sign operation.
     For Elgamal signing (which is slow, yields large numbers and
     probably is not as secure as the other algorithms), the same
     format is used with "elg" replacing "dsa".

The operation most commonly used is definitely the verification of a
signature.  Libgcrypt provides this function:

 -- Function: gcry_error_t gcry_pk_verify (gcry_sexp_t SIG,
          gcry_sexp_t DATA, gcry_sexp_t PKEY)
     This is used to check whether the signature SIG matches the DATA.
     The public key PKEY must be provided to perform this verification.
     This function is similar in its parameters to `gcry_pk_sign' with
     the exceptions that the public key is used instead of the private
     key and that no signature is created but a signature, in a format
     as created by `gcry_pk_sign', is passed to the function in SIG.

     The result is 0 for success (i.e. the data matches the signature),
     or an error code where the most relevant code is
     `GCRYERR_BAD_SIGNATURE' to indicate that the signature does not
     match the provided data.



File: gcrypt.info,  Node: General public-key related Functions,  Next: AC Interface,  Prev: Cryptographic Functions,  Up: Public Key cryptography

6.5 General public-key related Functions
========================================

A couple of utility functions are available to retrieve the length of
the key, map algorithm identifiers and perform sanity checks:

 -- Function: const char * gcry_pk_algo_name (int ALGO)
     Map the public key algorithm id ALGO to a string representation of
     the algorithm name.  For unknown algorithms this functions returns
     the string `"?"'.  This function should not be used to test for the
     availability of an algorithm.

 -- Function: int gcry_pk_map_name (const char *NAME)
     Map the algorithm NAME to a public key algorithm Id.  Returns 0 if
     the algorithm name is not known.

 -- Function: int gcry_pk_test_algo (int ALGO)
     Return 0 if the public key algorithm ALGO is available for use.
     Note that this is implemented as a macro.

 -- Function: unsigned int gcry_pk_get_nbits (gcry_sexp_t KEY)
     Return what is commonly referred as the key length for the given
     public or private in KEY.

 -- Function: unsigned char * gcry_pk_get_keygrip (gcry_sexp_t KEY,
          unsigned char *ARRAY)
     Return the so called "keygrip" which is the SHA-1 hash of the
     public key parameters expressed in a way depended on the
     algorithm.  ARRAY must either provide space for 20 bytes or be
     `NULL'. In the latter case a newly allocated array of that size is
     returned.  On success a pointer to the newly allocated space or to
     ARRAY is returned.  `NULL' is returned to indicate an error which
     is most likely an unknown algorithm or one where a "keygrip" has
     not yet been defined.  The function accepts public or secret keys
     in KEY.

 -- Function: gcry_error_t gcry_pk_testkey (gcry_sexp_t KEY)
     Return zero if the private key KEY is `sane', an error code
     otherwise.  Note that it is not possible to check the `saneness'
     of a public key.


 -- Function: gcry_error_t gcry_pk_algo_info (int ALGO, int WHAT,
          void *BUFFER, size_t *NBYTES)
     Depending on the value of WHAT return various information about
     the public key algorithm with the id ALGO.  Note that the function
     returns `-1' on error and the actual error code must be retrieved
     using the function `gcry_errno'.  The currently defined values for
     WHAT are:

    `GCRYCTL_TEST_ALGO:'
          Return 0 if the specified algorithm is available for use.
          BUFFER must be `NULL', NBYTES may be passed as `NULL' or
          point to a variable with the required usage of the algorithm.
          This may be 0 for "don't care" or the bit-wise OR of these
          flags:

         `GCRY_PK_USAGE_SIGN'
               Algorithm is usable for signing.

         `GCRY_PK_USAGE_ENCR'
               Algorithm is usable for encryption.

          Unless you need to test for the allowed usage, it is in
          general better to use the macro gcry_pk_test_algo instead.

    `GCRYCTL_GET_ALGO_USAGE:'
          Return the usage flags for the given algorithm.  An invalid
          algorithm return 0.  Disabled algorithms are ignored here
          because we want to know whether the algorithm is at all
          capable of a certain usage.

    `GCRYCTL_GET_ALGO_NPKEY'
          Return the number of elements the public key for algorithm
          ALGO consist of.  Return 0 for an unknown algorithm.

    `GCRYCTL_GET_ALGO_NSKEY'
          Return the number of elements the private key for algorithm
          ALGO consist of.  Note that this value is always larger than
          that of the public key.  Return 0 for an unknown algorithm.

    `GCRYCTL_GET_ALGO_NSIGN'
          Return the number of elements a signature created with the
          algorithm ALGO consists of.  Return 0 for an unknown
          algorithm or for an algorithm not capable of creating
          signatures.

    `GCRYCTL_GET_ALGO_NENC'
          Return the number of elements a encrypted message created
          with the algorithm ALGO consists of.  Return 0 for an unknown
          algorithm or for an algorithm not capable of encryption.

     Please note that parameters not required should be passed as
     `NULL'.

 -- Function: gcry_error_t gcry_pk_ctl (int CMD, void *BUFFER,
          size_t BUFLEN)
     This is a general purpose function to perform certain control
     operations.  CMD controls what is to be done. The return value is
     0 for success or an error code.  Currently supported values for
     CMD are:

    `GCRYCTL_DISABLE_ALGO'
          Disable the algorithm given as an algorithm id in BUFFER.
          BUFFER must point to an `int' variable with the algorithm id
          and BUFLEN must have the value `sizeof (int)'.


Libgcrypt also provides a function to generate public key pairs:

 -- Function: gcry_error_t gcry_pk_genkey (gcry_sexp_t *R_KEY,
          gcry_sexp_t PARMS)
     This function create a new public key pair using information given
     in the S-expression PARMS and stores the private and the public key
     in one new S-expression at the address given by R_KEY.  In case of
     an error, R_KEY is set to `NULL'.  The return code is 0 for
     success or an error code otherwise.

     Here is an example for PARMS to create an 2048 bit RSA key:

          (genkey
            (rsa
              (nbits 4:2048)))

     To create an Elgamal key, substitute "elg" for "rsa" and to create
     a DSA key use "dsa".  Valid ranges for the key length depend on the
     algorithms; all commonly used key lengths are supported.  Currently
     supported parameters are:

    `nbits'
          This is always required to specify the length of the key.
          The argument is a string with a number in C-notation.  The
          value should be a multiple of 8.

    `curve NAME'
          For ECC a named curve may be used instead of giving the
          number of requested bits.  This allows to request a specific
          curve to override a default selection Libgcrypt would have
          taken if `nbits' has been given.  The available names are
          listed with the description of the ECC public key parameters.

    `rsa-use-e'
          This is only used with RSA to give a hint for the public
          exponent. The value will be used as a base to test for a
          usable exponent. Some values are special:

         `0'
               Use a secure and fast value.  This is currently the
               number 41.

         `1'
               Use a value as required by some crypto policies.  This
               is currently the number 65537.

         `2'
               Reserved

         `> 2'
               Use the given value.

          If this parameter is not used, Libgcrypt uses for historic
          reasons 65537.

    `qbits'
          This is only meanigful for DSA keys.  If it is given the DSA
          key is generated with a Q parameyer of this size.  If it is
          not given or zero Q is deduced from NBITS in this way:
         `512 <= N <= 1024'
               Q = 160

         `N = 2048'
               Q = 224

         `N = 3072'
               Q = 256

         `N = 7680'
               Q = 384

         `N = 15360'
               Q = 512
          Note that in this case only the values for N, as given in the
          table, are allowed.  When specifying Q all values of N in the
          range 512 to 15680 are valid as long as they are multiples of
          8.

    `transient-key'
          This is only meaningful for RSA and DSA keys.  This is a flag
          with no value.  If given the RSA or DSA key is created using
          a faster and a somewhat less secure random number generator.
          This flag may be used for keys which are only used for a
          short time and do not require full cryptographic strength.

    `domain'
          This is only meaningful for DLP algorithms.  If specified
          keys are generated with domain parameters taken from this
          list.  The exact format of this parameter depends on the
          actual algorithm.  It is currently only implemented for DSA
          using this format:

               (genkey
                 (dsa
                   (domain
                     (p P-MPI)
                     (q Q-MPI)
                     (g Q-MPI))))

          `nbits' and `qbits' may not be specified because they are
          derived from the domain parameters.

    `derive-parms'
          This is currently only implemented for RSA and DSA keys.  It
          is not allowed to use this together with a `domain'
          specification.  If given, it is used to derive the keys using
          the given parameters.

          If given for an RSA key the X9.31 key generation algorithm is
          used even if libgcrypt is not in FIPS mode.  If given for a
          DSA key, the FIPS 186 algorithm is used even if libgcrypt is
          not in FIPS mode.

               (genkey
                 (rsa
                   (nbits 4:1024)
                   (rsa-use-e 1:3)
                   (derive-parms
                     (Xp1 #1A1916DDB29B4EB7EB6732E128#)
                     (Xp2 #192E8AAC41C576C822D93EA433#)
                     (Xp  #D8CD81F035EC57EFE822955149D3BFF70C53520D
                           769D6D76646C7A792E16EBD89FE6FC5B605A6493
                           39DFC925A86A4C6D150B71B9EEA02D68885F5009
                           B98BD984#)
                     (Xq1 #1A5CF72EE770DE50CB09ACCEA9#)
                     (Xq2 #134E4CAA16D2350A21D775C404#)
                     (Xq  #CC1092495D867E64065DEE3E7955F2EBC7D47A2D
                           7C9953388F97DDDC3E1CA19C35CA659EDC2FC325
                           6D29C2627479C086A699A49C4C9CEE7EF7BD1B34
                           321DE34A#))))

               (genkey
                 (dsa
                   (nbits 4:1024)
                   (derive-parms
                     (seed SEED-MPI))))

    `use-x931'
          Force the use of the ANSI X9.31 key generation algorithm
          instead of the default algorithm. This flag is only
          meaningful for RSA and usually not required.  Note that this
          algorithm is implicitly used if either `derive-parms' is
          given or Libgcrypt is in FIPS mode.

    `use-fips186'
          Force the use of the FIPS 186 key generation algorithm
          instead of the default algorithm.  This flag is only
          meaningful for DSA and usually not required.  Note that this
          algorithm is implicitly used if either `derive-parms' is
          given or Libgcrypt is in FIPS mode.  As of now FIPS 186-2 is
          implemented; after the approval of FIPS 186-3 the code will
          be changed to implement 186-3.

    `use-fips186-2'
          Force the use of the FIPS 186-2 key generation algorithm
          instead of the default algorithm.  This algorithm is slighlty
          different from FIPS 186-3 and allows only 1024 bit keys.
          This flag is only meaningful for DSA and only required for
          FIPS testing backward compatibility.


     The key pair is returned in a format depending on the algorithm.
     Both private and public keys are returned in one container and may
     be accompanied by some miscellaneous information.

     As an example, here is what the Elgamal key generation returns:

          (key-data
            (public-key
              (elg
                (p P-MPI)
                (g G-MPI)
                (y Y-MPI)))
            (private-key
              (elg
                (p P-MPI)
                (g G-MPI)
                (y Y-MPI)
                (x X-MPI)))
            (misc-key-info
              (pm1-factors N1 N2 ... NN))

     As you can see, some of the information is duplicated, but this
     provides an easy way to extract either the public or the private
     key.  Note that the order of the elements is not defined, e.g. the
     private key may be stored before the public key. N1 N2 ... NN is a
     list of prime numbers used to composite P-MPI; this is in general
     not a very useful information and only available if the key
     generation algorithm provides them.


File: gcrypt.info,  Node: AC Interface,  Prev: General public-key related Functions,  Up: Public Key cryptography

6.6 Alternative Public Key Interface
====================================

This section documents the alternative interface to asymmetric
cryptography (ac) that is not based on S-expressions, but on native C
data structures.  As opposed to the pk interface described in the
former chapter, this one follows an open/use/close paradigm like other
building blocks of the library.

   *This interface has a few known problems; most noteworthy an
inherent tendency to leak memory.  It might not be available in
forthcoming versions of Libgcrypt.*

* Menu:

* Available asymmetric algorithms::  List of algorithms supported by the library.
* Working with sets of data::   How to work with sets of data.
* Working with IO objects::     How to work with IO objects.
* Working with handles::        How to use handles.
* Working with keys::           How to work with keys.
* Using cryptographic functions::  How to perform cryptographic operations.
* Handle-independent functions::  General functions independent of handles.


File: gcrypt.info,  Node: Available asymmetric algorithms,  Next: Working with sets of data,  Up: AC Interface

6.6.1 Available asymmetric algorithms
-------------------------------------

Libgcrypt supports the RSA (Rivest-Shamir-Adleman) algorithms as well
as DSA (Digital Signature Algorithm) and Elgamal.  The versatile
interface allows to add more algorithms in the future.

 -- Data type: gcry_ac_id_t
     The following constants are defined for this type:

    `GCRY_AC_RSA'
          Rivest-Shamir-Adleman

    `GCRY_AC_DSA'
          Digital Signature Algorithm

    `GCRY_AC_ELG'
          Elgamal

    `GCRY_AC_ELG_E'
          Elgamal, encryption only.


File: gcrypt.info,  Node: Working with sets of data,  Next: Working with IO objects,  Prev: Available asymmetric algorithms,  Up: AC Interface

6.6.2 Working with sets of data
-------------------------------

In the context of this interface the term `data set' refers to a list
of `named MPI values' that is used by functions performing
cryptographic operations; a named MPI value is a an MPI value,
associated with a label.

   Such data sets are used for representing keys, since keys simply
consist of a variable amount of numbers.  Furthermore some functions
return data sets to the caller that are to be provided to other
functions.

   This section documents the data types, symbols and functions that are
relevant for working with data sets.

 -- Data type: gcry_ac_data_t
     A single data set.

   The following flags are supported:

`GCRY_AC_FLAG_DEALLOC'
     Used for storing data in a data set.  If given, the data will be
     released by the library.  Note that whenever one of the ac
     functions is about to release objects because of this flag, the
     objects are expected to be stored in memory allocated through the
     Libgcrypt memory management.  In other words: gcry_free() is used
     instead of free().

`GCRY_AC_FLAG_COPY'
     Used for storing/retrieving data in/from a data set.  If given, the
     library will create copies of the provided/contained data, which
     will then be given to the user/associated with the data set.

 -- Function: gcry_error_t gcry_ac_data_new (gcry_ac_data_t *DATA)
     Creates a new, empty data set and stores it in DATA.

 -- Function: void gcry_ac_data_destroy (gcry_ac_data_t DATA)
     Destroys the data set DATA.

 -- Function: gcry_error_t gcry_ac_data_set (gcry_ac_data_t DATA,
          unsigned int FLAGS, char *NAME, gcry_mpi_t MPI)
     Add the value MPI to DATA with the label NAME.  If FLAGS contains
     GCRY_AC_FLAG_COPY, the data set will contain copies of NAME and
     MPI.  If FLAGS contains GCRY_AC_FLAG_DEALLOC or GCRY_AC_FLAG_COPY,
     the values contained in the data set will be deallocated when they
     are to be removed from the data set.

 -- Function: gcry_error_t gcry_ac_data_copy (gcry_ac_data_t *DATA_CP,
          gcry_ac_data_t DATA)
     Create a copy of the data set DATA and store it in DATA_CP.
     FIXME: exact semantics undefined.

 -- Function: unsigned int gcry_ac_data_length (gcry_ac_data_t DATA)
     Returns the number of named MPI values inside of the data set DATA.

 -- Function: gcry_error_t gcry_ac_data_get_name (gcry_ac_data_t DATA,
          unsigned int FLAGS, char *NAME, gcry_mpi_t *MPI)
     Store the value labelled with NAME found in DATA in MPI.  If FLAGS
     contains GCRY_AC_FLAG_COPY, store a copy of the MPI value
     contained in the data set.  MPI may be NULL (this might be useful
     for checking the existence of an MPI with extracting it).

 -- Function: gcry_error_t gcry_ac_data_get_index (gcry_ac_data_t DATA,
          unsigned int flags, unsigned int INDEX, const char **NAME,
          gcry_mpi_t *MPI)
     Stores in NAME and MPI the named MPI value contained in the data
     set DATA with the index IDX.  If FLAGS contains GCRY_AC_FLAG_COPY,
     store copies of the values contained in the data set. NAME or MPI
     may be NULL.

 -- Function: void gcry_ac_data_clear (gcry_ac_data_t DATA)
     Destroys any values contained in the data set DATA.

 -- Function: gcry_error_t gcry_ac_data_to_sexp (gcry_ac_data_t DATA,
          gcry_sexp_t *SEXP, const char **IDENTIFIERS)
     This function converts the data set DATA into a newly created
     S-Expression, which is to be stored in SEXP; IDENTIFIERS is a NULL
     terminated list of C strings, which specifies the structure of the
     S-Expression.

     Example:

     If IDENTIFIERS is a list of pointers to the strings "foo" and
     "bar" and if DATA is a data set containing the values "val1 =
     0x01" and "val2 = 0x02", then the resulting S-Expression will look
     like this: (foo (bar ((val1 0x01) (val2 0x02))).

 -- Function: gcry_error gcry_ac_data_from_sexp (gcry_ac_data_t *DATA,
          gcry_sexp_t SEXP, const char **IDENTIFIERS)
     This function converts the S-Expression SEXP into a newly created
     data set, which is to be stored in DATA; IDENTIFIERS is a NULL
     terminated list of C strings, which specifies the structure of the
     S-Expression.  If the list of identifiers does not match the
     structure of the S-Expression, the function fails.


File: gcrypt.info,  Node: Working with IO objects,  Next: Working with handles,  Prev: Working with sets of data,  Up: AC Interface

6.6.3 Working with IO objects
-----------------------------

Note: IO objects are currently only used in the context of message
encoding/decoding and encryption/signature schemes.

 -- Data type: gcry_ac_io_t
     `gcry_ac_io_t' is the type to be used for IO objects.

   IO objects provide an uniform IO layer on top of different underlying
IO mechanisms; either they can be used for providing data to the
library (mode is GCRY_AC_IO_READABLE) or they can be used for
retrieving data from the library (mode is GCRY_AC_IO_WRITABLE).

   IO object need to be initialized by calling on of the following
functions:

 -- Function: void gcry_ac_io_init (gcry_ac_io_t *AC_IO,
          gcry_ac_io_mode_t MODE, gcry_ac_io_type_t TYPE, ...);
     Initialize AC_IO according to MODE, TYPE and the variable list of
     arguments.  The list of variable arguments to specify depends on
     the given TYPE.

 -- Function: void gcry_ac_io_init_va (gcry_ac_io_t *AC_IO,
          gcry_ac_io_mode_t MODE, gcry_ac_io_type_t TYPE, va_list AP);
     Initialize AC_IO according to MODE, TYPE and the variable list of
     arguments AP.  The list of variable arguments to specify depends
     on the given TYPE.

   The following types of IO objects exist:

`GCRY_AC_IO_STRING'
     In case of GCRY_AC_IO_READABLE the IO object will provide data
     from a memory string.  Arguments to specify at initialization time:
    `unsigned char *'
          Pointer to the beginning of the memory string

    `size_t'
          Size of the memory string
     In case of GCRY_AC_IO_WRITABLE the object will store retrieved
     data in a newly allocated memory string.  Arguments to specify at
     initialization time:
    `unsigned char **'
          Pointer to address, at which the pointer to the newly created
          memory string is to be stored

    `size_t *'
          Pointer to address, at which the size of the newly created
          memory string is to be stored

`GCRY_AC_IO_CALLBACK'
     In case of GCRY_AC_IO_READABLE the object will forward read
     requests to a provided callback function.  Arguments to specify at
     initialization time:
    `gcry_ac_data_read_cb_t'
          Callback function to use

    `void *'
          Opaque argument to provide to the callback function
     In case of GCRY_AC_IO_WRITABLE the object will forward write
     requests to a provided callback function.  Arguments to specify at
     initialization time:
    `gcry_ac_data_write_cb_t'
          Callback function to use

    `void *'
          Opaque argument to provide to the callback function


File: gcrypt.info,  Node: Working with handles,  Next: Working with keys,  Prev: Working with IO objects,  Up: AC Interface

6.6.4 Working with handles
--------------------------

In order to use an algorithm, an according handle must be created.
This is done using the following function:

 -- Function: gcry_error_t gcry_ac_open (gcry_ac_handle_t *HANDLE, int
          ALGORITHM, int FLAGS)
     Creates a new handle for the algorithm ALGORITHM and stores it in
     HANDLE.  FLAGS is not used currently.

     ALGORITHM must be a valid algorithm ID, see *Note Available
     asymmetric algorithms::, for a list of supported algorithms and the
     according constants.  Besides using the listed constants directly,
     the functions `gcry_pk_name_to_id' may be used to convert the
     textual name of an algorithm into the according numeric ID.

 -- Function: void gcry_ac_close (gcry_ac_handle_t HANDLE)
     Destroys the handle HANDLE.


File: gcrypt.info,  Node: Working with keys,  Next: Using cryptographic functions,  Prev: Working with handles,  Up: AC Interface

6.6.5 Working with keys
-----------------------

 -- Data type: gcry_ac_key_type_t
     Defined constants:

    `GCRY_AC_KEY_SECRET'
          Specifies a secret key.

    `GCRY_AC_KEY_PUBLIC'
          Specifies a public key.

 -- Data type: gcry_ac_key_t
     This type represents a single `key', either a secret one or a
     public one.

 -- Data type: gcry_ac_key_pair_t
     This type represents a `key pair' containing a secret and a public
     key.

   Key data structures can be created in two different ways; a new key
pair can be generated, resulting in ready-to-use key.  Alternatively a
key can be initialized from a given data set.

 -- Function: gcry_error_t gcry_ac_key_init (gcry_ac_key_t *KEY,
          gcry_ac_handle_t HANDLE, gcry_ac_key_type_t TYPE,
          gcry_ac_data_t DATA)
     Creates a new key of type TYPE, consisting of the MPI values
     contained in the data set DATA and stores it in KEY.

 -- Function: gcry_error_t gcry_ac_key_pair_generate (gcry_ac_handle_t
          HANDLE, unsigned int NBITS, void *KEY_SPEC,
          gcry_ac_key_pair_t *KEY_PAIR, gcry_mpi_t **MISC_DATA)
     Generates a new key pair via the handle HANDLE of NBITS bits and
     stores it in KEY_PAIR.

     In case non-standard settings are wanted, a pointer to a structure
     of type `gcry_ac_key_spec_<algorithm>_t', matching the selected
     algorithm, can be given as KEY_SPEC.  MISC_DATA is not used yet.
     Such a structure does only exist for RSA.  A description of the
     members of the supported structures follows.

    `gcry_ac_key_spec_rsa_t'

         `gcry_mpi_t e'
               Generate the key pair using a special `e'.  The value of
               `e' has the following meanings:
              `= 0'
                    Let Libgcrypt decide what exponent should be used.

              `= 1'
                    Request the use of a "secure" exponent; this is
                    required by some specification to be 65537.

              `> 2'
                    Try starting at this value until a working exponent
                    is found.  Note that the current implementation
                    leaks some information about the private key
                    because the incrementation used is not randomized.
                    Thus, this function will be changed in the future
                    to return a random exponent of the given size.

     Example code:
          {
            gcry_ac_key_pair_t key_pair;
            gcry_ac_key_spec_rsa_t rsa_spec;

            rsa_spec.e = gcry_mpi_new (0);
            gcry_mpi_set_ui (rsa_spec.e, 1);

            err = gcry_ac_open  (&handle, GCRY_AC_RSA, 0);
            assert (! err);

            err = gcry_ac_key_pair_generate (handle, 1024, &rsa_spec,
                                             &key_pair, NULL);
            assert (! err);
          }

 -- Function: gcry_ac_key_t gcry_ac_key_pair_extract
          (gcry_ac_key_pair_t KEY_PAIR, gcry_ac_key_type_t WHICH)
     Returns the key of type WHICH out of the key pair KEY_PAIR.

 -- Function: void gcry_ac_key_destroy (gcry_ac_key_t KEY)
     Destroys the key KEY.

 -- Function: void gcry_ac_key_pair_destroy (gcry_ac_key_pair_t
          KEY_PAIR)
     Destroys the key pair KEY_PAIR.

 -- Function: gcry_ac_data_t gcry_ac_key_data_get (gcry_ac_key_t KEY)
     Returns the data set contained in the key KEY.

 -- Function: gcry_error_t gcry_ac_key_test (gcry_ac_handle_t HANDLE,
          gcry_ac_key_t KEY)
     Verifies that the private key KEY is sane via HANDLE.

 -- Function: gcry_error_t gcry_ac_key_get_nbits (gcry_ac_handle_t
          HANDLE, gcry_ac_key_t KEY, unsigned int *NBITS)
     Stores the number of bits of the key KEY in NBITS via HANDLE.

 -- Function: gcry_error_t gcry_ac_key_get_grip (gcry_ac_handle_t
          HANDLE, gcry_ac_key_t KEY, unsigned char *KEY_GRIP)
     Writes the 20 byte long key grip of the key KEY to KEY_GRIP via
     HANDLE.


File: gcrypt.info,  Node: Using cryptographic functions,  Next: Handle-independent functions,  Prev: Working with keys,  Up: AC Interface

6.6.6 Using cryptographic functions
-----------------------------------

The following flags might be relevant:

`GCRY_AC_FLAG_NO_BLINDING'
     Disable any blinding, which might be supported by the chosen
     algorithm; blinding is the default.

   There exist two kinds of cryptographic functions available through
the ac interface: primitives, and high-level functions.

   Primitives deal with MPIs (data sets) directly; what they provide is
direct access to the cryptographic operations provided by an algorithm
implementation.

   High-level functions deal with octet strings, according to a
specified "scheme".  Schemes make use of "encoding methods", which are
responsible for converting the provided octet strings into MPIs, which
are then forwared to the cryptographic primitives.  Since schemes are
to be used for a special purpose in order to achieve a particular
security goal, there exist "encryption schemes" and "signature
schemes".  Encoding methods can be used seperately or implicitly
through schemes.

   What follows is a description of the cryptographic primitives.

 -- Function: gcry_error_t gcry_ac_data_encrypt (gcry_ac_handle_t
          HANDLE, unsigned int FLAGS, gcry_ac_key_t KEY, gcry_mpi_t
          DATA_PLAIN, gcry_ac_data_t *DATA_ENCRYPTED)
     Encrypts the plain text MPI value DATA_PLAIN with the key public
     KEY under the control of the flags FLAGS and stores the resulting
     data set into DATA_ENCRYPTED.

 -- Function: gcry_error_t gcry_ac_data_decrypt (gcry_ac_handle_t
          HANDLE, unsigned int FLAGS, gcry_ac_key_t KEY, gcry_mpi_t
          *DATA_PLAIN, gcry_ac_data_t DATA_ENCRYPTED)
     Decrypts the encrypted data contained in the data set
     DATA_ENCRYPTED with the secret key KEY under the control of the
     flags FLAGS and stores the resulting plain text MPI value in
     DATA_PLAIN.

 -- Function: gcry_error_t gcry_ac_data_sign (gcry_ac_handle_t HANDLE,
          gcry_ac_key_t KEY, gcry_mpi_t DATA, gcry_ac_data_t
          *DATA_SIGNATURE)
     Signs the data contained in DATA with the secret key KEY and
     stores the resulting signature in the data set DATA_SIGNATURE.

 -- Function: gcry_error_t gcry_ac_data_verify (gcry_ac_handle_t
          HANDLE, gcry_ac_key_t KEY, gcry_mpi_t DATA, gcry_ac_data_t
          DATA_SIGNATURE)
     Verifies that the signature contained in the data set
     DATA_SIGNATURE is indeed the result of signing the data contained
     in DATA with the secret key belonging to the public key KEY.

   What follows is a description of the high-level functions.

   The type "gcry_ac_em_t" is used for specifying encoding methods; the
following methods are supported:

`GCRY_AC_EME_PKCS_V1_5'
     PKCS-V1_5 Encoding Method for Encryption.  Options must be provided
     through a pointer to a correctly initialized object of type
     gcry_ac_eme_pkcs_v1_5_t.

`GCRY_AC_EMSA_PKCS_V1_5'
     PKCS-V1_5 Encoding Method for Signatures with Appendix.  Options
     must be provided through a pointer to a correctly initialized
     object of type gcry_ac_emsa_pkcs_v1_5_t.

   Option structure types:

`gcry_ac_eme_pkcs_v1_5_t'

    `gcry_ac_key_t key'

    `gcry_ac_handle_t handle'

`gcry_ac_emsa_pkcs_v1_5_t'

    `gcry_md_algo_t md'

    `size_t em_n'

   Encoding methods can be used directly through the following
functions:

 -- Function: gcry_error_t gcry_ac_data_encode (gcry_ac_em_t METHOD,
          unsigned int FLAGS, void *OPTIONS, unsigned char *M, size_t
          M_N, unsigned char **EM, size_t *EM_N)
     Encodes the message contained in M of size M_N according to
     METHOD, FLAGS and OPTIONS.  The newly created encoded message is
     stored in EM and EM_N.

 -- Function: gcry_error_t gcry_ac_data_decode (gcry_ac_em_t METHOD,
          unsigned int FLAGS, void *OPTIONS, unsigned char *EM, size_t
          EM_N, unsigned char **M, size_t *M_N)
     Decodes the message contained in EM of size EM_N according to
     METHOD, FLAGS and OPTIONS.  The newly created decoded message is
     stored in M and M_N.

   The type "gcry_ac_scheme_t" is used for specifying schemes; the
following schemes are supported:

`GCRY_AC_ES_PKCS_V1_5'
     PKCS-V1_5 Encryption Scheme.  No options can be provided.

`GCRY_AC_SSA_PKCS_V1_5'
     PKCS-V1_5 Signature Scheme (with Appendix).  Options can be
     provided through a pointer to a correctly initialized object of
     type gcry_ac_ssa_pkcs_v1_5_t.

   Option structure types:

`gcry_ac_ssa_pkcs_v1_5_t'

    `gcry_md_algo_t md'

   The functions implementing schemes:

 -- Function: gcry_error_t gcry_ac_data_encrypt_scheme
          (gcry_ac_handle_t HANDLE, gcry_ac_scheme_t SCHEME, unsigned
          int FLAGS, void *OPTS, gcry_ac_key_t KEY, gcry_ac_io_t
          *IO_MESSAGE, gcry_ac_io_t *IO_CIPHER)
     Encrypts the plain text readable from IO_MESSAGE through HANDLE
     with the public key KEY according to SCHEME, FLAGS and OPTS.  If
     OPTS is not NULL, it has to be a pointer to a structure specific
     to the chosen scheme (gcry_ac_es_*_t).  The encrypted message is
     written to IO_CIPHER.

 -- Function: gcry_error_t gcry_ac_data_decrypt_scheme
          (gcry_ac_handle_t HANDLE, gcry_ac_scheme_t SCHEME, unsigned
          int FLAGS, void *OPTS, gcry_ac_key_t KEY, gcry_ac_io_t
          *IO_CIPHER, gcry_ac_io_t *IO_MESSAGE)
     Decrypts the cipher text readable from IO_CIPHER through HANDLE
     with the secret key KEY according to SCHEME, FLAGS and OPTS.  If
     OPTS is not NULL, it has to be a pointer to a structure specific
     to the chosen scheme (gcry_ac_es_*_t).  The decrypted message is
     written to IO_MESSAGE.

 -- Function: gcry_error_t gcry_ac_data_sign_scheme (gcry_ac_handle_t
          HANDLE, gcry_ac_scheme_t SCHEME, unsigned int FLAGS, void
          *OPTS, gcry_ac_key_t KEY, gcry_ac_io_t *IO_MESSAGE,
          gcry_ac_io_t *IO_SIGNATURE)
     Signs the message readable from IO_MESSAGE through HANDLE with the
     secret key KEY according to SCHEME, FLAGS and OPTS.  If OPTS is
     not NULL, it has to be a pointer to a structure specific to the
     chosen scheme (gcry_ac_ssa_*_t).  The signature is written to
     IO_SIGNATURE.

 -- Function: gcry_error_t gcry_ac_data_verify_scheme (gcry_ac_handle_t
          HANDLE, gcry_ac_scheme_t SCHEME, unsigned int FLAGS, void
          *OPTS, gcry_ac_key_t KEY, gcry_ac_io_t *IO_MESSAGE,
          gcry_ac_io_t *IO_SIGNATURE)
     Verifies through HANDLE that the signature readable from
     IO_SIGNATURE is indeed the result of signing the message readable
     from IO_MESSAGE with the secret key belonging to the public key
     KEY according to SCHEME and OPTS.  If OPTS is not NULL, it has to
     be an anonymous structure (gcry_ac_ssa_*_t) specific to the chosen
     scheme.


File: gcrypt.info,  Node: Handle-independent functions,  Prev: Using cryptographic functions,  Up: AC Interface

6.6.7 Handle-independent functions
----------------------------------

These two functions are deprecated; do not use them for new code.

 -- Function: gcry_error_t gcry_ac_id_to_name (gcry_ac_id_t ALGORITHM,
          const char **NAME)
     Stores the textual representation of the algorithm whose id is
     given in ALGORITHM in NAME.  Deprecated; use `gcry_pk_algo_name'.

 -- Function: gcry_error_t gcry_ac_name_to_id (const char *NAME,
          gcry_ac_id_t *ALGORITHM)
     Stores the numeric ID of the algorithm whose textual
     representation is contained in NAME in ALGORITHM. Deprecated; use
     `gcry_pk_map_name'.


File: gcrypt.info,  Node: Hashing,  Next: Random Numbers,  Prev: Public Key cryptography,  Up: Top

7 Hashing
*********

Libgcrypt provides an easy and consistent to use interface for hashing.
Hashing is buffered and several hash algorithms can be updated at once.
It is possible to compute a MAC using the same routines.  The
programming model follows an open/process/close paradigm and is in that
similar to other building blocks provided by Libgcrypt.

   For convenience reasons, a few cyclic redundancy check value
operations are also supported.

* Menu:

* Available hash algorithms::   List of hash algorithms supported by the library.
* Hash algorithm modules::      How to work with hash algorithm modules.
* Working with hash algorithms::  List of functions related to hashing.


File: gcrypt.info,  Node: Available hash algorithms,  Next: Hash algorithm modules,  Up: Hashing

7.1 Available hash algorithms
=============================

`GCRY_MD_NONE'
     This is not a real algorithm but used by some functions as an error
     return value.  This constant is guaranteed to have the value `0'.

`GCRY_MD_SHA1'
     This is the SHA-1 algorithm which yields a message digest of 20
     bytes.  Note that SHA-1 begins to show some weaknesses and it is
     suggested to fade out its use if strong cryptographic properties
     are required.

`GCRY_MD_RMD160'
     This is the 160 bit version of the RIPE message digest
     (RIPE-MD-160).  Like SHA-1 it also yields a digest of 20 bytes.
     This algorithm share a lot of design properties with SHA-1 and
     thus it is advisable not to use it for new protocols.

`GCRY_MD_MD5'
     This is the well known MD5 algorithm, which yields a message
     digest of 16 bytes.  Note that the MD5 algorithm has severe
     weaknesses, for example it is easy to compute two messages
     yielding the same hash (collision attack).  The use of this
     algorithm is only justified for non-cryptographic application.

`GCRY_MD_MD4'
     This is the MD4 algorithm, which yields a message digest of 16
     bytes.  This algorithms ha severe weaknesses and should not be
     used.

`GCRY_MD_MD2'
     This is an reserved identifier for MD-2; there is no
     implementation yet.  This algorithm has severe weaknesses and
     should not be used.

`GCRY_MD_TIGER'
     This is the TIGER/192 algorithm which yields a message digest of
     24 bytes.

`GCRY_MD_HAVAL'
     This is an reserved value for the HAVAL algorithm with 5 passes
     and 160 bit. It yields a message digest of 20 bytes.  Note that
     there is no implementation yet available.

`GCRY_MD_SHA224'
     This is the SHA-224 algorithm which yields a message digest of 28
     bytes.  See Change Notice 1 for FIPS 180-2 for the specification.

`GCRY_MD_SHA256'
     This is the SHA-256 algorithm which yields a message digest of 32
     bytes.  See FIPS 180-2 for the specification.

`GCRY_MD_SHA384'
     This is the SHA-384 algorithm which yields a message digest of 48
     bytes.  See FIPS 180-2 for the specification.

`GCRY_MD_SHA512'
     This is the SHA-384 algorithm which yields a message digest of 64
     bytes.  See FIPS 180-2 for the specification.

`GCRY_MD_CRC32'
     This is the ISO 3309 and ITU-T V.42 cyclic redundancy check.  It
     yields an output of 4 bytes.  Note that this is not a hash
     algorithm in the cryptographic sense.

`GCRY_MD_CRC32_RFC1510'
     This is the above cyclic redundancy check function, as modified by
     RFC 1510.  It yields an output of 4 bytes.  Note that this is not
     a hash algorithm in the cryptographic sense.

`GCRY_MD_CRC24_RFC2440'
     This is the OpenPGP cyclic redundancy check function.  It yields an
     output of 3 bytes.  Note that this is not a hash algorithm in the
     cryptographic sense.

`GCRY_MD_WHIRLPOOL'
     This is the Whirlpool algorithm which yields a message digest of 64
     bytes.



File: gcrypt.info,  Node: Hash algorithm modules,  Next: Working with hash algorithms,  Prev: Available hash algorithms,  Up: Hashing

7.2 Hash algorithm modules
==========================

Libgcrypt makes it possible to load additional `message digest
modules'; these digests can be used just like the message digest
algorithms that are built into the library directly.  For an
introduction into extension modules, see *Note Modules::.

 -- Data type: gcry_md_spec_t
     This is the `module specification structure' needed for registering
     message digest modules, which has to be filled in by the user
     before it can be used to register a module.  It contains the
     following members:

    `const char *name'
          The primary name of this algorithm.

    `unsigned char *asnoid'
          Array of bytes that form the ASN OID.

    `int asnlen'
          Length of bytes in `asnoid'.

    `gcry_md_oid_spec_t *oids'
          A list of OIDs that are to be associated with the algorithm.
          The list's last element must have it's `oid' member set to
          NULL.  See below for an explanation of this type.  See below
          for an explanation of this type.

    `int mdlen'
          Length of the message digest algorithm.  See below for an
          explanation of this type.

    `gcry_md_init_t init'
          The function responsible for initializing a handle.  See
          below for an explanation of this type.

    `gcry_md_write_t write'
          The function responsible for writing data into a message
          digest context.  See below for an explanation of this type.

    `gcry_md_final_t final'
          The function responsible for `finalizing' a message digest
          context.  See below for an explanation of this type.

    `gcry_md_read_t read'
          The function responsible for reading out a message digest
          result.  See below for an explanation of this type.

    `size_t contextsize'
          The size of the algorithm-specific `context', that should be
          allocated for each handle.

 -- Data type: gcry_md_oid_spec_t
     This type is used for associating a user-provided algorithm
     implementation with certain OIDs.  It contains the following
     members:

    `const char *oidstring'
          Textual representation of the OID.

 -- Data type: gcry_md_init_t
     Type for the `init' function, defined as: void (*gcry_md_init_t)
     (void *c)

 -- Data type: gcry_md_write_t
     Type for the `write' function, defined as: void (*gcry_md_write_t)
     (void *c, unsigned char *buf, size_t nbytes)

 -- Data type: gcry_md_final_t
     Type for the `final' function, defined as: void (*gcry_md_final_t)
     (void *c)

 -- Data type: gcry_md_read_t
     Type for the `read' function, defined as: unsigned char
     *(*gcry_md_read_t) (void *c)

 -- Function: gcry_error_t gcry_md_register (gcry_md_spec_t *DIGEST,
          unsigned int *algorithm_id, gcry_module_t *MODULE)
     Register a new digest module whose specification can be found in
     DIGEST.  On success, a new algorithm ID is stored in ALGORITHM_ID
     and a pointer representing this module is stored in MODULE.

 -- Function: void gcry_md_unregister (gcry_module_t MODULE)
     Unregister the digest identified by MODULE, which must have been
     registered with gcry_md_register.

 -- Function: gcry_error_t gcry_md_list (int *LIST, int *LIST_LENGTH)
     Get a list consisting of the IDs of the loaded message digest
     modules.  If LIST is zero, write the number of loaded message
     digest modules to LIST_LENGTH and return.  If LIST is non-zero,
     the first *LIST_LENGTH algorithm IDs are stored in LIST, which
     must be of according size.  In case there are less message digests
     modules than *LIST_LENGTH, *LIST_LENGTH is updated to the correct
     number.


File: gcrypt.info,  Node: Working with hash algorithms,  Prev: Hash algorithm modules,  Up: Hashing

7.3 Working with hash algorithms
================================

To use most of these function it is necessary to create a context; this
is done using:

 -- Function: gcry_error_t gcry_md_open (gcry_md_hd_t *HD, int ALGO,
          unsigned int FLAGS)
     Create a message digest object for algorithm ALGO.  FLAGS may be
     given as an bitwise OR of constants described below.  ALGO may be
     given as `0' if the algorithms to use are later set using
     `gcry_md_enable'. HD is guaranteed to either receive a valid
     handle or NULL.

     For a list of supported algorithms, see *Note Available hash
     algorithms::.

     The flags allowed for MODE are:

    `GCRY_MD_FLAG_SECURE'
          Allocate all buffers and the resulting digest in "secure
          memory".  Use this is the hashed data is highly confidential.

    `GCRY_MD_FLAG_HMAC'
          Turn the algorithm into a HMAC message authentication
          algorithm.  This only works if just one algorithm is enabled
          for the handle.  Note that the function `gcry_md_setkey' must
          be used to set the MAC key.  The size of the MAC is equal to
          the message digest of the underlying hash algorithm.  If you
          want CBC message authentication codes based on a cipher, see
          *Note Working with cipher handles::.


     You may use the function `gcry_md_is_enabled' to later check
     whether an algorithm has been enabled.


   If you want to calculate several hash algorithms at the same time,
you have to use the following function right after the `gcry_md_open':

 -- Function: gcry_error_t gcry_md_enable (gcry_md_hd_t H, int ALGO)
     Add the message digest algorithm ALGO to the digest object
     described by handle H.  Duplicated enabling of algorithms is
     detected and ignored.

   If the flag `GCRY_MD_FLAG_HMAC' was used, the key for the MAC must
be set using the function:

 -- Function: gcry_error_t gcry_md_setkey (gcry_md_hd_t H, const void
          *KEY, size_t KEYLEN)
     For use with the HMAC feature, set the MAC key to the value of KEY
     of length KEYLEN bytes.  There is no restriction on the length of
     the key.

   After you are done with the hash calculation, you should release the
resources by using:

 -- Function: void gcry_md_close (gcry_md_hd_t H)
     Release all resources of hash context H.  H should not be used
     after a call to this function.  A `NULL' passed as H is ignored.
     The function also zeroises all sensitive information associated
     with this handle.


   Often you have to do several hash operations using the same
algorithm.  To avoid the overhead of creating and releasing context, a
reset function is provided:

 -- Function: void gcry_md_reset (gcry_md_hd_t H)
     Reset the current context to its initial state.  This is
     effectively identical to a close followed by an open and enabling
     all currently active algorithms.

   Often it is necessary to start hashing some data and then continue to
hash different data.  To avoid hashing the same data several times
(which might not even be possible if the data is received from a pipe),
a snapshot of the current hash context can be taken and turned into a
new context:

 -- Function: gcry_error_t gcry_md_copy (gcry_md_hd_t *HANDLE_DST,
          gcry_md_hd_t HANDLE_SRC)
     Create a new digest object as an exact copy of the object
     described by handle HANDLE_SRC and store it in HANDLE_DST.  The
     context is not reset and you can continue to hash data using this
     context and independently using the original context.

   Now that we have prepared everything to calculate hashes, it is time
to see how it is actually done.  There are two ways for this, one to
update the hash with a block of memory and one macro to update the hash
by just one character.  Both methods can be used on the same hash
context.

 -- Function: void gcry_md_write (gcry_md_hd_t H, const void *BUFFER,
          size_t LENGTH)
     Pass LENGTH bytes of the data in BUFFER to the digest object with
     handle H to update the digest values. This function should be used
     for large blocks of data.

 -- Function: void gcry_md_putc (gcry_md_hd_t H, int C)
     Pass the byte in C to the digest object with handle H to update
     the digest value.  This is an efficient function, implemented as a
     macro to buffer the data before an actual update.

   The semantics of the hash functions do not provide for reading out
intermediate message digests because the calculation must be finalized
first.  This finalization may for example include the number of bytes
hashed in the message digest or some padding.

 -- Function: void gcry_md_final (gcry_md_hd_t H)
     Finalize the message digest calculation.  This is not really needed
     because `gcry_md_read' does this implicitly.  After this has been
     done no further updates (by means of `gcry_md_write' or
     `gcry_md_putc' are allowed.  Only the first call to this function
     has an effect. It is implemented as a macro.

   The way to read out the calculated message digest is by using the
function:

 -- Function: unsigned char * gcry_md_read (gcry_md_hd_t H, int ALGO)
     `gcry_md_read' returns the message digest after finalizing the
     calculation.  This function may be used as often as required but
     it will always return the same value for one handle.  The returned
     message digest is allocated within the message context and
     therefore valid until the handle is released or reseted (using
     `gcry_md_close' or `gcry_md_reset'.  ALGO may be given as 0 to
     return the only enabled message digest or it may specify one of
     the enabled algorithms.  The function does return `NULL' if the
     requested algorithm has not been enabled.

   Because it is often necessary to get the message digest of one block
of memory, a fast convenience function is available for this task:

 -- Function: void gcry_md_hash_buffer (int ALGO, void *DIGEST, const
          void *BUFFER, size_t LENGTH);
     `gcry_md_hash_buffer' is a shortcut function to calculate a message
     digest of a buffer.  This function does not require a context and
     immediately returns the message digest of the LENGTH bytes at
     BUFFER.  DIGEST must be allocated by the caller, large enough to
     hold the message digest yielded by the the specified algorithm
     ALGO.  This required size may be obtained by using the function
     `gcry_md_get_algo_dlen'.

     Note that this function will abort the process if an unavailable
     algorithm is used.

   Hash algorithms are identified by internal algorithm numbers (see
`gcry_md_open' for a list).  However, in most applications they are
used by names, so two functions are available to map between string
representations and hash algorithm identifiers.

 -- Function: const char * gcry_md_algo_name (int ALGO)
     Map the digest algorithm id ALGO to a string representation of the
     algorithm name.  For unknown algorithms this function returns the
     string `"?"'.  This function should not be used to test for the
     availability of an algorithm.

 -- Function: int gcry_md_map_name (const char *NAME)
     Map the algorithm with NAME to a digest algorithm identifier.
     Returns 0 if the algorithm name is not known.  Names representing
     ASN.1 object identifiers are recognized if the IETF dotted format
     is used and the OID is prefixed with either "`oid.'" or "`OID.'".
     For a list of supported OIDs, see the source code at
     `cipher/md.c'. This function should not be used to test for the
     availability of an algorithm.

 -- Function: gcry_error_t gcry_md_get_asnoid (int ALGO, void *BUFFER,
          size_t *LENGTH)
     Return an DER encoded ASN.1 OID for the algorithm ALGO in the user
     allocated BUFFER. LENGTH must point to variable with the available
     size of BUFFER and receives after return the actual size of the
     returned OID.  The returned error code may be `GPG_ERR_TOO_SHORT'
     if the provided buffer is to short to receive the OID; it is
     possible to call the function with `NULL' for BUFFER to have it
     only return the required size.  The function returns 0 on success.


   To test whether an algorithm is actually available for use, the
following macro should be used:

 -- Function: gcry_error_t gcry_md_test_algo (int ALGO)
     The macro returns 0 if the algorithm ALGO is available for use.

   If the length of a message digest is not known, it can be retrieved
using the following function:

 -- Function: unsigned int gcry_md_get_algo_dlen (int ALGO)
     Retrieve the length in bytes of the digest yielded by algorithm
     ALGO.  This is often used prior to `gcry_md_read' to allocate
     sufficient memory for the digest.

   In some situations it might be hard to remember the algorithm used
for the ongoing hashing. The following function might be used to get
that information:

 -- Function: int gcry_md_get_algo (gcry_md_hd_t H)
     Retrieve the algorithm used with the handle H.  Note that this
     does not work reliable if more than one algorithm is enabled in H.

   The following macro might also be useful:

 -- Function: int gcry_md_is_secure (gcry_md_hd_t H)
     This function returns true when the digest object H is allocated
     in "secure memory"; i.e. H was created with the
     `GCRY_MD_FLAG_SECURE'.

 -- Function: int gcry_md_is_enabled (gcry_md_hd_t H, int ALGO)
     This function returns true when the algorithm ALGO has been
     enabled for the digest object H.

   Tracking bugs related to hashing is often a cumbersome task which
requires to add a lot of printf statements into the code.  Libgcrypt
provides an easy way to avoid this.  The actual data hashed can be
written to files on request.

 -- Function: void gcry_md_debug (gcry_md_hd_t H, const char *SUFFIX)
     Enable debugging for the digest object with handle H.  This
     creates create files named `dbgmd-<n>.<string>' while doing the
     actual hashing.  SUFFIX is the string part in the filename.  The
     number is a counter incremented for each new hashing.  The data in
     the file is the raw data as passed to `gcry_md_write' or
     `gcry_md_putc'.  If `NULL' is used for SUFFIX, the debugging is
     stopped and the file closed.  This is only rarely required because
     `gcry_md_close' implicitly stops debugging.

   The following two deprecated macros are used for debugging by old
code.  They shopuld be replaced by `gcry_md_debug'.

 -- Function: void gcry_md_start_debug (gcry_md_hd_t H, const char
          *SUFFIX)
     Enable debugging for the digest object with handle H.  This
     creates create files named `dbgmd-<n>.<string>' while doing the
     actual hashing.  SUFFIX is the string part in the filename.  The
     number is a counter incremented for each new hashing.  The data in
     the file is the raw data as passed to `gcry_md_write' or
     `gcry_md_putc'.

 -- Function: void gcry_md_stop_debug (gcry_md_hd_t H, int RESERVED)
     Stop debugging on handle H.  RESERVED should be specified as 0.
     This function is usually not required because `gcry_md_close' does
     implicitly stop debugging.


File: gcrypt.info,  Node: Random Numbers,  Next: S-expressions,  Prev: Hashing,  Up: Top

8 Random Numbers
****************

* Menu:

* Quality of random numbers::   Libgcrypt uses different quality levels.
* Retrieving random numbers::   How to retrieve random numbers.


File: gcrypt.info,  Node: Quality of random numbers,  Next: Retrieving random numbers,  Up: Random Numbers

8.1 Quality of random numbers
=============================

Libgcypt offers random numbers of different quality levels:

 -- Data type: gcry_random_level_t
     The constants for the random quality levels are of this enum type.

`GCRY_WEAK_RANDOM'
     For all functions, except for `gcry_mpi_randomize', this level maps
     to GCRY_STRONG_RANDOM.  If you do not want this, consider using
     `gcry_create_nonce'.

`GCRY_STRONG_RANDOM'
     Use this level for session keys and similar purposes.

`GCRY_VERY_STRONG_RANDOM'
     Use this level for long term key material.


File: gcrypt.info,  Node: Retrieving random numbers,  Prev: Quality of random numbers,  Up: Random Numbers

8.2 Retrieving random numbers
=============================

 -- Function: void gcry_randomize (unsigned char *BUFFER, size_t
          LENGTH, enum gcry_random_level LEVEL)
     Fill BUFFER with LENGTH random bytes using a random quality as
     defined by LEVEL.

 -- Function: void * gcry_random_bytes (size_t NBYTES, enum
          gcry_random_level LEVEL)
     Convenience function to allocate a memory block consisting of
     NBYTES fresh random bytes using a random quality as defined by
     LEVEL.

 -- Function: void * gcry_random_bytes_secure (size_t NBYTES, enum
          gcry_random_level LEVEL)
     Convenience function to allocate a memory block consisting of
     NBYTES fresh random bytes using a random quality as defined by
     LEVEL.  This function differs from `gcry_random_bytes' in that the
     returned buffer is allocated in a "secure" area of the memory.

 -- Function: void gcry_create_nonce (unsigned char *BUFFER, size_t
          LENGTH)
     Fill BUFFER with LENGTH unpredictable bytes.  This is commonly
     called a nonce and may also be used for initialization vectors and
     padding.  This is an extra function nearly independent of the
     other random function for 3 reasons: It better protects the
     regular random generator's internal state, provides better
     performance and does not drain the precious entropy pool.



File: gcrypt.info,  Node: S-expressions,  Next: MPI library,  Prev: Random Numbers,  Up: Top

9 S-expressions
***************

S-expressions are used by the public key functions to pass complex data
structures around.  These LISP like objects are used by some
cryptographic protocols (cf. RFC-2692) and Libgcrypt provides functions
to parse and construct them.  For detailed information, see `Ron
Rivest, code and description of S-expressions,
`http://theory.lcs.mit.edu/~rivest/sexp.html''.

* Menu:

* Data types for S-expressions::  Data types related with S-expressions.
* Working with S-expressions::  How to work with S-expressions.


File: gcrypt.info,  Node: Data types for S-expressions,  Next: Working with S-expressions,  Up: S-expressions

9.1 Data types for S-expressions
================================

 -- Data type: gcry_sexp_t
     The `gcry_sexp_t' type describes an object with the Libgcrypt
     internal representation of an S-expression.


File: gcrypt.info,  Node: Working with S-expressions,  Prev: Data types for S-expressions,  Up: S-expressions

9.2 Working with S-expressions
==============================

There are several functions to create an Libgcrypt S-expression object
from its external representation or from a string template.  There is
also a function to convert the internal representation back into one of
the external formats:

 -- Function: gcry_error_t gcry_sexp_new (gcry_sexp_t *R_SEXP,
          const void *BUFFER, size_t LENGTH, int AUTODETECT)
     This is the generic function to create an new S-expression object
     from its external representation in BUFFER of LENGTH bytes.  On
     success the result is stored at the address given by R_SEXP.  With
     AUTODETECT set to 0, the data in BUFFER is expected to be in
     canonized format, with AUTODETECT set to 1 the parses any of the
     defined external formats.  If BUFFER does not hold a valid
     S-expression an error code is returned and R_SEXP set to `NULL'.
     Note that the caller is responsible for releasing the newly
     allocated S-expression using `gcry_sexp_release'.

 -- Function: gcry_error_t gcry_sexp_create (gcry_sexp_t *R_SEXP,
          void *BUFFER, size_t LENGTH, int AUTODETECT,
          void (*FREEFNC)(void*))
     This function is identical to `gcry_sexp_new' but has an extra
     argument FREEFNC, which, when not set to `NULL', is expected to be
     a function to release the BUFFER; most likely the standard `free'
     function is used for this argument.  This has the effect of
     transferring the ownership of BUFFER to the created object in
     R_SEXP.  The advantage of using this function is that Libgcrypt
     might decide to directly use the provided buffer and thus avoid
     extra copying.

 -- Function: gcry_error_t gcry_sexp_sscan (gcry_sexp_t *R_SEXP,
          size_t *ERROFF, const char *BUFFER, size_t LENGTH)
     This is another variant of the above functions.  It behaves nearly
     identical but provides an ERROFF argument which will receive the
     offset into the buffer where the parsing stopped on error.

 -- Function: gcry_error_t gcry_sexp_build (gcry_sexp_t *R_SEXP,
          size_t *ERROFF, const char *FORMAT, ...)
     This function creates an internal S-expression from the string
     template FORMAT and stores it at the address of R_SEXP. If there
     is a parsing error, the function returns an appropriate error code
     and stores the offset into FORMAT where the parsing stopped in
     ERROFF.  The function supports a couple of printf-like formatting
     characters and expects arguments for some of these escape
     sequences right after FORMAT.  The following format characters are
     defined:

    `%m'
          The next argument is expected to be of type `gcry_mpi_t' and
          a copy of its value is inserted into the resulting
          S-expression.

    `%s'
          The next argument is expected to be of type `char *' and that
          string is inserted into the resulting S-expression.

    `%d'
          The next argument is expected to be of type `int' and its
          value is inserted into the resulting S-expression.

    `%b'
          The next argument is expected to be of type `int' directly
          followed by an argument of type `char *'.  This represents a
          buffer of given length to be inserted into the resulting
          S-expression.

    `%S'
          The next argument is expected to be of type `gcry_sexp_t' and
          a copy of that S-expression is embedded in the resulting
          S-expression.  The argument needs to be a regular
          S-expression, starting with a parenthesis.


     No other format characters are defined and would return an error.
     Note that the format character `%%' does not exists, because a
     percent sign is not a valid character in an S-expression.

 -- Function: void gcry_sexp_release (gcry_sexp_t SEXP)
     Release the S-expression object SEXP.  If the S-expression is
     stored in secure memory it explicitly zeroises that memory; note
     that this is done in addition to the zeroisation always done when
     freeing secure memory.

The next 2 functions are used to convert the internal representation
back into a regular external S-expression format and to show the
structure for debugging.

 -- Function: size_t gcry_sexp_sprint (gcry_sexp_t SEXP, int MODE,
          char *BUFFER, size_t MAXLENGTH)
     Copies the S-expression object SEXP into BUFFER using the format
     specified in MODE.  MAXLENGTH must be set to the allocated length
     of BUFFER.  The function returns the actual length of valid bytes
     put into BUFFER or 0 if the provided buffer is too short.  Passing
     `NULL' for BUFFER returns the required length for BUFFER.  For
     convenience reasons an extra byte with value 0 is appended to the
     buffer.

     The following formats are supported:

    `GCRYSEXP_FMT_DEFAULT'
          Returns a convenient external S-expression representation.

    `GCRYSEXP_FMT_CANON'
          Return the S-expression in canonical format.

    `GCRYSEXP_FMT_BASE64'
          Not currently supported.

    `GCRYSEXP_FMT_ADVANCED'
          Returns the S-expression in advanced format.

 -- Function: void gcry_sexp_dump (gcry_sexp_t SEXP)
     Dumps SEXP in a format suitable for debugging to Libgcrypt's
     logging stream.

Often canonical encoding is used in the external representation.  The
following function can be used to check for valid encoding and to learn
the length of the S-expression"

 -- Function: size_t gcry_sexp_canon_len (const unsigned char *BUFFER,
          size_t LENGTH, size_t *ERROFF, int *ERRCODE)
     Scan the canonical encoded BUFFER with implicit length values and
     return the actual length this S-expression uses.  For a valid
     S-expression it should never return 0.  If LENGTH is not 0, the
     maximum length to scan is given; this can be used for syntax
     checks of data passed from outside.  ERRCODE and ERROFF may both be
     passed as `NULL'.


There are functions to parse S-expressions and retrieve elements:

 -- Function: gcry_sexp_t gcry_sexp_find_token (const gcry_sexp_t LIST,
          const char *TOKEN, size_t TOKLEN)
     Scan the S-expression for a sublist with a type (the car of the
     list) matching the string TOKEN.  If TOKLEN is not 0, the token is
     assumed to be raw memory of this length.  The function returns a
     newly allocated S-expression consisting of the found sublist or
     `NULL' when not found.

 -- Function: int gcry_sexp_length (const gcry_sexp_t LIST)
     Return the length of the LIST.  For a valid S-expression this
     should be at least 1.

 -- Function: gcry_sexp_t gcry_sexp_nth (const gcry_sexp_t LIST,
          int NUMBER)
     Create and return a new S-expression from the element with index
     NUMBER in LIST.  Note that the first element has the index 0.  If
     there is no such element, `NULL' is returned.

 -- Function: gcry_sexp_t gcry_sexp_car (const gcry_sexp_t LIST)
     Create and return a new S-expression from the first element in
     LIST; this called the "type" and should always exist and be a
     string. `NULL' is returned in case of a problem.

 -- Function: gcry_sexp_t gcry_sexp_cdr (const gcry_sexp_t LIST)
     Create and return a new list form all elements except for the
     first one.  Note that this function may return an invalid
     S-expression because it is not guaranteed, that the type exists
     and is a string.  However, for parsing a complex S-expression it
     might be useful for intermediate lists.  Returns `NULL' on error.

 -- Function: const char * gcry_sexp_nth_data (const gcry_sexp_t LIST,
          int NUMBER, size_t *DATALEN)
     This function is used to get data from a LIST.  A pointer to the
     actual data with index NUMBER is returned and the length of this
     data will be stored to DATALEN.  If there is no data at the given
     index or the index represents another list, `NULL' is returned.
     *Caution:* The returned pointer is valid as long as LIST is not
     modified or released.

     Here is an example on how to extract and print the surname (Meier)
     from the S-expression `(Name Otto Meier (address Burgplatz 3))':

          size_t len;
          const char *name;

          name = gcry_sexp_nth_data (list, 2, &len);
          printf ("my name is %.*s\n", (int)len, name);

 -- Function: char * gcry_sexp_nth_string (gcry_sexp_t LIST, int NUMBER)
     This function is used to get and convert data from a LIST. The
     data is assumed to be a Nul terminated string.  The caller must
     release this returned value using `gcry_free'.  If there is no
     data at the given index, the index represents a list or the value
     can't be converted to a string, `NULL' is returned.

 -- Function: gcry_mpi_t gcry_sexp_nth_mpi (gcry_sexp_t LIST,
          int NUMBER, int MPIFMT)
     This function is used to get and convert data from a LIST. This
     data is assumed to be an MPI stored in the format described by
     MPIFMT and returned as a standard Libgcrypt MPI.  The caller must
     release this returned value using `gcry_mpi_release'.  If there is
     no data at the given index, the index represents a list or the
     value can't be converted to an MPI, `NULL' is returned.


File: gcrypt.info,  Node: MPI library,  Next: Prime numbers,  Prev: S-expressions,  Up: Top

10 MPI library
**************

* Menu:

* Data types::                  MPI related data types.
* Basic functions::             First steps with MPI numbers.
* MPI formats::                 External representation of MPIs.
* Calculations::                Performing MPI calculations.
* Comparisons::                 How to compare MPI values.
* Bit manipulations::           How to access single bits of MPI values.
* Miscellaneous::               Miscellaneous MPI functions.

   Public key cryptography is based on mathematics with large numbers.
To implement the public key functions, a library for handling these
large numbers is required.  Because of the general usefulness of such a
library, its interface is exposed by Libgcrypt.  In the context of
Libgcrypt and in most other applications, these large numbers are
called MPIs (multi-precision-integers).


File: gcrypt.info,  Node: Data types,  Next: Basic functions,  Up: MPI library

10.1 Data types
===============

 -- Data type: gcry_mpi_t
     This type represents an object to hold an MPI.


File: gcrypt.info,  Node: Basic functions,  Next: MPI formats,  Prev: Data types,  Up: MPI library

10.2 Basic functions
====================

To work with MPIs, storage must be allocated and released for the
numbers.  This can be done with one of these functions:

 -- Function: gcry_mpi_t gcry_mpi_new (unsigned int NBITS)
     Allocate a new MPI object, initialize it to 0 and initially
     allocate enough memory for a number of at least NBITS.  This
     pre-allocation is only a small performance issue and not actually
     necessary because Libgcrypt automatically re-allocates the
     required memory.

 -- Function: gcry_mpi_t gcry_mpi_snew (unsigned int NBITS)
     This is identical to `gcry_mpi_new' but allocates the MPI in the so
     called "secure memory" which in turn will take care that all
     derived values will also be stored in this "secure memory".  Use
     this for highly confidential data like private key parameters.

 -- Function: gcry_mpi_t gcry_mpi_copy (const gcry_mpi_t A)
     Create a new MPI as the exact copy of A.

 -- Function: void gcry_mpi_release (gcry_mpi_t A)
     Release the MPI A and free all associated resources.  Passing
     `NULL' is allowed and ignored.  When a MPI stored in the "secure
     memory" is released, that memory gets wiped out immediately.

The simplest operations are used to assign a new value to an MPI:

 -- Function: gcry_mpi_t gcry_mpi_set (gcry_mpi_t W, const gcry_mpi_t U)
     Assign the value of U to W and return W.  If `NULL' is passed for
     W, a new MPI is allocated, set to the value of U and returned.

 -- Function: gcry_mpi_t gcry_mpi_set_ui (gcry_mpi_t W, unsigned long U)
     Assign the value of U to W and return W.  If `NULL' is passed for
     W, a new MPI is allocated, set to the value of U and returned.
     This function takes an `unsigned int' as type for U and thus it is
     only possible to set W to small values (usually up to the word
     size of the CPU).

 -- Function: void gcry_mpi_swap (gcry_mpi_t A, gcry_mpi_t B)
     Swap the values of A and B.


File: gcrypt.info,  Node: MPI formats,  Next: Calculations,  Prev: Basic functions,  Up: MPI library

10.3 MPI formats
================

The following functions are used to convert between an external
representation of an MPI and the internal one of Libgcrypt.

 -- Function: gcry_error_t gcry_mpi_scan (gcry_mpi_t *R_MPI,
          enum gcry_mpi_format FORMAT, const unsigned char *BUFFER,
          size_t BUFLEN, size_t *NSCANNED)
     Convert the external representation of an integer stored in BUFFER
     with a length of BUFLEN into a newly created MPI returned which
     will be stored at the address of R_MPI.  For certain formats the
     length argument is not required and should be passed as `0'.
     After a successful operation the variable NSCANNED receives the
     number of bytes actually scanned unless NSCANNED was given as
     `NULL'. FORMAT describes the format of the MPI as stored in BUFFER:

    `GCRYMPI_FMT_STD'
          2-complement stored without a length header.

    `GCRYMPI_FMT_PGP'
          As used by OpenPGP (only defined as unsigned). This is
          basically `GCRYMPI_FMT_STD' with a 2 byte big endian length
          header.

    `GCRYMPI_FMT_SSH'
          As used in the Secure Shell protocol.  This is
          `GCRYMPI_FMT_STD' with a 4 byte big endian header.

    `GCRYMPI_FMT_HEX'
          Stored as a C style string with each byte of the MPI encoded
          as 2 hex digits.  When using this format, BUFLEN must be zero.

    `GCRYMPI_FMT_USG'
          Simple unsigned integer.

     Note that all of the above formats store the integer in big-endian
     format (MSB first).

 -- Function: gcry_error_t gcry_mpi_print (enum gcry_mpi_format FORMAT,
          unsigned char *BUFFER, size_t BUFLEN, size_t *NWRITTEN,
          const gcry_mpi_t A)
     Convert the MPI A into an external representation described by
     FORMAT (see above) and store it in the provided BUFFER which has a
     usable length of at least the BUFLEN bytes. If NWRITTEN is not
     NULL, it will receive the number of bytes actually stored in
     BUFFER after a successful operation.

 -- Function: gcry_error_t gcry_mpi_aprint
          (enum gcry_mpi_format FORMAT, unsigned char **BUFFER,
          size_t *NBYTES, const gcry_mpi_t A)
     Convert the MPI A into an external representation described by
     FORMAT (see above) and store it in a newly allocated buffer which
     address will be stored in the variable BUFFER points to.  The
     number of bytes stored in this buffer will be stored in the
     variable NBYTES points to, unless NBYTES is `NULL'.

 -- Function: void gcry_mpi_dump (const gcry_mpi_t A)
     Dump the value of A in a format suitable for debugging to
     Libgcrypt's logging stream.  Note that one leading space but no
     trailing space or linefeed will be printed.  It is okay to pass
     `NULL' for A.


File: gcrypt.info,  Node: Calculations,  Next: Comparisons,  Prev: MPI formats,  Up: MPI library

10.4 Calculations
=================

Basic arithmetic operations:

 -- Function: void gcry_mpi_add (gcry_mpi_t W, gcry_mpi_t U,
          gcry_mpi_t V)
     W = U + V.

 -- Function: void gcry_mpi_add_ui (gcry_mpi_t W, gcry_mpi_t U,
          unsigned long V)
     W = U + V.  Note that V is an unsigned integer.

 -- Function: void gcry_mpi_addm (gcry_mpi_t W, gcry_mpi_t U,
          gcry_mpi_t V, gcry_mpi_t M)
     W = U + V \bmod M.

 -- Function: void gcry_mpi_sub (gcry_mpi_t W, gcry_mpi_t U,
          gcry_mpi_t V)
     W = U - V.

 -- Function: void gcry_mpi_sub_ui (gcry_mpi_t W, gcry_mpi_t U,
          unsigned long V)
     W = U - V.  V is an unsigned integer.

 -- Function: void gcry_mpi_subm (gcry_mpi_t W, gcry_mpi_t U,
          gcry_mpi_t V, gcry_mpi_t M)
     W = U - V \bmod M.

 -- Function: void gcry_mpi_mul (gcry_mpi_t W, gcry_mpi_t U,
          gcry_mpi_t V)
     W = U * V.

 -- Function: void gcry_mpi_mul_ui (gcry_mpi_t W, gcry_mpi_t U,
          unsigned long V)
     W = U * V.  V is an unsigned integer.

 -- Function: void gcry_mpi_mulm (gcry_mpi_t W, gcry_mpi_t U,
          gcry_mpi_t V, gcry_mpi_t M)
     W = U * V \bmod M.

 -- Function: void gcry_mpi_mul_2exp (gcry_mpi_t W, gcry_mpi_t U,
          unsigned long E)
     W = U * 2^e.

 -- Function: void gcry_mpi_div (gcry_mpi_t Q, gcry_mpi_t R,
          gcry_mpi_t DIVIDEND, gcry_mpi_t DIVISOR, int ROUND)
     Q = DIVIDEND / DIVISOR, R = DIVIDEND \bmod DIVISOR.  Q and R may
     be passed as `NULL'.  ROUND should be negative or 0.

 -- Function: void gcry_mpi_mod (gcry_mpi_t R, gcry_mpi_t DIVIDEND,
          gcry_mpi_t DIVISOR)
     R = DIVIDEND \bmod DIVISOR.

 -- Function: void gcry_mpi_powm (gcry_mpi_t W, const gcry_mpi_t B,
          const gcry_mpi_t E, const gcry_mpi_t M)
     W = B^e \bmod M.

 -- Function: int gcry_mpi_gcd (gcry_mpi_t G, gcry_mpi_t A,
          gcry_mpi_t B)
     Set G to the greatest common divisor of A and B.  Return true if
     the G is 1.

 -- Function: int gcry_mpi_invm (gcry_mpi_t X, gcry_mpi_t A,
          gcry_mpi_t M)
     Set X to the multiplicative inverse of A \bmod M.  Return true if
     the inverse exists.


File: gcrypt.info,  Node: Comparisons,  Next: Bit manipulations,  Prev: Calculations,  Up: MPI library

10.5 Comparisons
================

The next 2 functions are used to compare MPIs:

 -- Function: int gcry_mpi_cmp (const gcry_mpi_t U, const gcry_mpi_t V)
     Compare the multi-precision-integers number U and V returning 0
     for equality, a positive value for U > V and a negative for U < V.

 -- Function: int gcry_mpi_cmp_ui (const gcry_mpi_t U, unsigned long V)
     Compare the multi-precision-integers number U with the unsigned
     integer V returning 0 for equality, a positive value for U > V and
     a negative for U < V.


File: gcrypt.info,  Node: Bit manipulations,  Next: Miscellaneous,  Prev: Comparisons,  Up: MPI library

10.6 Bit manipulations
======================

There are a couple of functions to get information on arbitrary bits in
an MPI and to set or clear them:

 -- Function: unsigned int gcry_mpi_get_nbits (gcry_mpi_t A)
     Return the number of bits required to represent A.

 -- Function: int gcry_mpi_test_bit (gcry_mpi_t A, unsigned int N)
     Return true if bit number N (counting from 0) is set in A.

 -- Function: void gcry_mpi_set_bit (gcry_mpi_t A, unsigned int N)
     Set bit number N in A.

 -- Function: void gcry_mpi_clear_bit (gcry_mpi_t A, unsigned int N)
     Clear bit number N in A.

 -- Function: void gcry_mpi_set_highbit (gcry_mpi_t A, unsigned int N)
     Set bit number N in A and clear all bits greater than N.

 -- Function: void gcry_mpi_clear_highbit (gcry_mpi_t A, unsigned int N)
     Clear bit number N in A and all bits greater than N.

 -- Function: void gcry_mpi_rshift (gcry_mpi_t X, gcry_mpi_t A,
          unsigned int N)
     Shift the value of A by N bits to the right and store the result
     in X.

 -- Function: void gcry_mpi_lshift (gcry_mpi_t X, gcry_mpi_t A,
          unsigned int N)
     Shift the value of A by N bits to the left and store the result in
     X.


File: gcrypt.info,  Node: Miscellaneous,  Prev: Bit manipulations,  Up: MPI library

10.7 Miscellaneous
==================

 -- Function: gcry_mpi_t gcry_mpi_set_opaque (gcry_mpi_t A, void *P,
          unsigned int NBITS)
     Store NBITS of the value P points to in A and mark A as an opaque
     value (i.e. an value that can't be used for any math calculation
     and is only used to store an arbitrary bit pattern in A).

     WARNING: Never use an opaque MPI for actual math operations.  The
     only valid functions are gcry_mpi_get_opaque and gcry_mpi_release.
     Use gcry_mpi_scan to convert a string of arbitrary bytes into an
     MPI.


 -- Function: void * gcry_mpi_get_opaque (gcry_mpi_t A,
          unsigned int *NBITS)
     Return a pointer to an opaque value stored in A and return its
     size in NBITS.  Note that the returned pointer is still owned by A
     and that the function should never be used for an non-opaque MPI.

 -- Function: void gcry_mpi_set_flag (gcry_mpi_t A,
          enum gcry_mpi_flag FLAG)
     Set the FLAG for the MPI A.  Currently only the flag
     `GCRYMPI_FLAG_SECURE' is allowed to convert A into an MPI stored
     in "secure memory".

 -- Function: void gcry_mpi_clear_flag (gcry_mpi_t A,
          enum gcry_mpi_flag FLAG)
     Clear FLAG for the multi-precision-integers A.  Note that this
     function is currently useless as no flags are allowed.

 -- Function: int gcry_mpi_get_flag (gcry_mpi_t A,
          enum gcry_mpi_flag FLAG)
     Return true when the FLAG is set for A.

 -- Function: void gcry_mpi_randomize (gcry_mpi_t W,
          unsigned int NBITS, enum gcry_random_level LEVEL)
     Set the multi-precision-integers W to a random value of NBITS,
     using random data quality of level LEVEL.  In case NBITS is not a
     multiple of a byte, NBITS is rounded up to the next byte boundary.
     When using a LEVEL of `GCRY_WEAK_RANDOM' this function makes use of
     `gcry_create_nonce'.


File: gcrypt.info,  Node: Prime numbers,  Next: Utilities,  Prev: MPI library,  Up: Top

11 Prime numbers
****************

* Menu:

* Generation::                  Generation of new prime numbers.
* Checking::                    Checking if a given number is prime.


File: gcrypt.info,  Node: Generation,  Next: Checking,  Up: Prime numbers

11.1 Generation
===============

 -- Function: gcry_error_t gcry_prime_generate (gcry_mpi_t
          *PRIME,unsigned int PRIME_BITS, unsigned int FACTOR_BITS,
          gcry_mpi_t **FACTORS, gcry_prime_check_func_t CB_FUNC, void
          *CB_ARG, gcry_random_level_t RANDOM_LEVEL, unsigned int FLAGS)
     Generate a new prime number of PRIME_BITS bits and store it in
     PRIME.  If FACTOR_BITS is non-zero, one of the prime factors of
     (PRIME - 1) / 2 must be FACTOR_BITS bits long.  If FACTORS is
     non-zero, allocate a new, `NULL'-terminated array holding the
     prime factors and store it in FACTORS.  FLAGS might be used to
     influence the prime number generation process.

 -- Function: gcry_error_t gcry_prime_group_generator (gcry_mpi_t *R_G,
          gcry_mpi_t PRIME, gcry_mpi_t *FACTORS, gcry_mpi_t START_G)
     Find a generator for PRIME where the factorization of (PRIME-1) is
     in the `NULL' terminated array FACTORS.  Return the generator as a
     newly allocated MPI in R_G.  If START_G is not NULL, use this as
     the start for the search.

 -- Function: void gcry_prime_release_factors (gcry_mpi_t *FACTORS)
     Convenience function to release the FACTORS array.


File: gcrypt.info,  Node: Checking,  Prev: Generation,  Up: Prime numbers

11.2 Checking
=============

 -- Function: gcry_error_t gcry_prime_check (gcry_mpi_t P, unsigned int
          FLAGS)
     Check wether the number P is prime.  Returns zero in case P is
     indeed a prime, returns `GPG_ERR_NO_PRIME' in case P is not a
     prime and a different error code in case something went horribly
     wrong.


File: gcrypt.info,  Node: Utilities,  Next: Architecture,  Prev: Prime numbers,  Up: Top

12 Utilities
************

* Menu:

* Memory allocation:: Functions related with memory allocation.


File: gcrypt.info,  Node: Memory allocation,  Up: Utilities

12.1 Memory allocation
======================

 -- Function: void * gcry_malloc (size_t N)
     This function tries to allocate N bytes of memory.  On success it
     returns a pointer to the memory area, in an out-of-core condition,
     it returns NULL.

 -- Function: void * gcry_malloc_secure (size_t N)
     Like `gcry_malloc', but uses secure memory.

 -- Function: void * gcry_calloc (size_t N, size_t M)
     This function allocates a cleared block of memory (i.e.
     initialized with zero bytes) long enough to contain a vector of N
     elements, each of size M bytes.  On success it returns a pointer
     to the memory block; in an out-of-core condition, it returns NULL.

 -- Function: void * gcry_calloc_secure (size_t N, size_t M)
     Like `gcry_calloc', but uses secure memory.

 -- Function: void * gcry_realloc (void *P, size_t N)
     This function tries to resize the memory area pointed to by P to N
     bytes.  On success it returns a pointer to the new memory area, in
     an out-of-core condition, it returns NULL.  Depending on whether
     the memory pointed to by P is secure memory or not, gcry_realloc
     tries to use secure memory as well.

 -- Function: void gcry_free (void *P)
     Release the memory area pointed to by P.


File: gcrypt.info,  Node: Architecture,  Next: Self-Tests,  Prev: Utilities,  Up: Top

13 Architecture
***************

This chapter describes the internal architecture of Libgcrypt.

   Libgcrypt is a function library written in ISO C-90.  Any compliant
compiler should be able to build Libgcrypt as long as the target is
either a POSIX platform or compatible to the API used by Windows NT.
Provisions have been take so that the library can be directly used from
C++ applications; however building with a C++ compiler is not supported.

   Building Libgcrypt is done by using the common `./configure && make'
approach.  The configure command is included in the source distribution
and as a portable shell script it works on any Unix-alike system.  The
result of running the configure script are a C header file
(`config.h'), customized Makefiles, the setup of symbolic links and a
few other things.  After that the make tool builds and optionally
installs the library and the documentation.  See the files `INSTALL'
and `README' in the source distribution on how to do this.

   Libgcrypt is developed using a Subversion(1) repository.  Although
all released versions are tagged in this repository, they should not be
used to build production versions of Libgcrypt.  Instead released
tarballs should be used.  These tarballs are available from several
places with the master copy at <ftp://ftp.gnupg.org/gcrypt/libgcrypt/>.
Announcements of new releases are posted to the
<gnupg-announce@gnupg.org> mailing list(2).

     [image src="libgcrypt-modules.png" alt="Libgcrypt subsystems" ]
Figure 13.1: Libgcrypt subsystems

   Libgcrypt consists of several subsystems (*note Figure 13.1:
fig:subsystems.) and all these subsystems provide a public API; this
includes the helper subsystems like the one for S-expressions.  The API
style depends on the subsystem; in general an open-use-close approach
is implemented.  The open returns a handle to a context used for all
further operations on this handle, several functions may then be used
on this handle and a final close function releases all resources
associated with the handle.

* Menu:

* Public-Key Subsystem Architecture::              About public keys.
* Symmetric Encryption Subsystem Architecture::    About standard ciphers.
* Hashing and MACing Subsystem Architecture::      About hashing.
* Multi-Precision-Integer Subsystem Architecture:: About big integers.
* Prime-Number-Generator Subsystem Architecture::  About prime numbers.
* Random-Number Subsystem Architecture::           About random stuff.

   ---------- Footnotes ----------

   (1) A version control system available for many platforms

   (2) See `http://www.gnupg.org/documentation/mailing-lists.en.html'
for details.


File: gcrypt.info,  Node: Public-Key Subsystem Architecture,  Next: Symmetric Encryption Subsystem Architecture,  Up: Architecture

13.1 Public-Key Architecture
============================

Libgcrypt implements two interfaces for public key cryptography: The
standard interface is PK interface using functions in the `gcry_pk_'
name space.  The AC interface in an alternative one which is now
deprecated and will not be further described.  The AC interface is also
disabled in FIPS mode.

   Because public key cryptography is almost always used to process
small amounts of data (hash values or session keys), the interface is
not implemented using the open-use-close paradigm, but with single
self-contained functions.  Due to the wide variety of parameters
required by different algorithms S-expressions, as flexible way to
convey these parameters, are used.  There is a set of helper functions
to work with these S-expressions.

   Aside of functions to register new algorithms, map algorithms names
to algorithms identifiers and to lookup properties of a key, the
following main functions are available:

`gcry_pk_encrypt'
     Encrypt data using a public key.

`gcry_pk_decrypt'
     Decrypt data using a private key.

`gcry_pk_sign'
     Sign data using a private key.

`gcry_pk_verify'
     Verify that a signature matches the data.

`gcry_pk_testkey'
     Perform a consistency over a public or private key.

`gcry_pk_genkey'
     Create a new public/private key pair.


   With the help of the module registration system all these functions
lookup the module implementing the algorithm and pass the actual work
to that module.  The parsing of the S-expression input and the
construction of S-expression for the return values is done by the high
level code (`cipher/pubkey.c').  Thus the internal interface between
the algorithm modules and the high level functions passes data in a
custom format.  The interface to the modules is published
(`gcrypt-modules.h') so that it can used to register external
implementations of algorithms with Libgcrypt.  However, for some
algorithms this module interface is to limited and thus for the
internal modules an extra interface is sometimes used to convey more
information.

   By default Libgcrypt uses a blinding technique for RSA decryption to
mitigate real world timing attacks over a network: Instead of using the
RSA decryption directly, a blinded value y = x r^e \bmod n is decrypted
and the unblinded value x' = y' r^-1 \bmod n returned.  The blinding
value r is a random value with the size of the modulus n and generated
with `GCRY_WEAK_RANDOM' random level.

   The algorithm used for RSA and DSA key generation depends on whether
Libgcrypt is operated in standard or in FIPS mode.  In standard mode an
algorithm based on the Lim-Lee prime number generator is used.  In FIPS
mode RSA keys are generated as specified in ANSI X9.31 (1998) and DSA
keys as specified in FIPS 186-2.


File: gcrypt.info,  Node: Symmetric Encryption Subsystem Architecture,  Next: Hashing and MACing Subsystem Architecture,  Prev: Public-Key Subsystem Architecture,  Up: Architecture

13.2 Symmetric Encryption Subsystem Architecture
================================================

The interface to work with symmetric encryption algorithms is made up
of functions from the `gcry_cipher_' name space.  The implementation
follows the open-use-close paradigm and uses registered algorithm
modules for the actual work.  Unless a module implements optimized
cipher mode implementations, the high level code (`cipher/cipher.c')
implements the modes and calls the core algorithm functions to process
each block.

   The most important functions are:

`gcry_cipher_open'
     Create a new instance to encrypt or decrypt using a specified
     algorithm and mode.

`gcry_cipher_close'
     Release an instance.

`gcry_cipher_setkey'
     Set a key to be used for encryption or decryption.

`gcry_cipher_setiv'
     Set an initialization vector to be used for encryption or
     decryption.

`gcry_cipher_encrypt'
`gcry_cipher_decrypt'
     Encrypt or decrypt data.  These functions may be called with
     arbitrary amounts of data and as often as needed to encrypt or
     decrypt all data.


   There are also functions to query properties of algorithms or
context, like block length, key length, map names or to enable features
like padding methods.


File: gcrypt.info,  Node: Hashing and MACing Subsystem Architecture,  Next: Multi-Precision-Integer Subsystem Architecture,  Prev: Symmetric Encryption Subsystem Architecture,  Up: Architecture

13.3 Hashing and MACing Subsystem Architecture
==============================================

The interface to work with message digests and CRC algorithms is made
up of functions from the `gcry_md_' name space.  The implementation
follows the open-use-close paradigm and uses registered algorithm
modules for the actual work.  Although CRC algorithms are not
considered cryptographic hash algorithms, they share enough properties
so that it makes sense to handle them in the same way.  It is possible
to use several algorithms at once with one context and thus compute
them all on the same data.

   The most important functions are:

`gcry_md_open'
     Create a new message digest instance and optionally enable one
     algorithm.  A flag may be used to turn the message digest algorithm
     into a HMAC algorithm.

`gcry_md_enable'
     Enable an additional algorithm for the instance.

`gcry_md_setkey'
     Set the key for the MAC.

`gcry_md_write'
     Pass more data for computing the message digest to an instance.

`gcry_md_putc'
     Buffered version of `gcry_md_write' implemented as a macro.

`gcry_md_read'
     Finalize the computation of the message digest or HMAC and return
     the result.

`gcry_md_close'
     Release an instance

`gcry_md_hash_buffer'
     Convenience function to directly compute a message digest over a
     memory buffer without the need to create an instance first.


   There are also functions to query properties of algorithms or the
instance, like enabled algorithms, digest length, map algorithm names.
it is also possible to reset an instance or to copy the current state
of an instance at any time.  Debug functions to write the hashed data
to files are available as well.


File: gcrypt.info,  Node: Multi-Precision-Integer Subsystem Architecture,  Next: Prime-Number-Generator Subsystem Architecture,  Prev: Hashing and MACing Subsystem Architecture,  Up: Architecture

13.4 Multi-Precision-Integer Subsystem Architecture
===================================================

The implementation of Libgcrypt's big integer computation code is based
on an old release of GNU Multi-Precision Library (GMP).  The decision
not to use the GMP library directly was due to stalled development at
that time and due to security requirements which could not be provided
by the code in GMP.  As GMP does, Libgcrypt provides high performance
assembler implementations of low level code for several CPUS to gain
much better performance than with a generic C implementation.

Major features of Libgcrypt's multi-precision-integer code compared to
GMP are:

   * Avoidance of stack based allocations to allow protection against
     swapping out of sensitive data and for easy zeroing of sensitive
     intermediate results.

   * Optional use of secure memory and tracking of its use so that
     results are also put into secure memory.

   * MPIs are identified by a handle (implemented as a pointer) to give
     better control over allocations and to augment them with extra
     properties like opaque data.

   * Removal of unnecessary code to reduce complexity.

   * Functions specialized for public key cryptography.



File: gcrypt.info,  Node: Prime-Number-Generator Subsystem Architecture,  Next: Random-Number Subsystem Architecture,  Prev: Multi-Precision-Integer Subsystem Architecture,  Up: Architecture

13.5 Prime-Number-Generator Subsystem Architecture
==================================================

Libgcrypt provides an interface to its prime number generator.  These
functions make use of the internal prime number generator which is
required for the generation for public key key pairs.  The plain prime
checking function is exported as well.

   The generation of random prime numbers is based on the Lim and Lee
algorithm to create practically save primes.(1) This algorithm creates
a pool of smaller primes, select a few of them to create candidate
primes of the form 2 * p_0 * p_1 * ... * p_n + 1, tests the candidate
for primality and permutates the pool until a prime has been found.  It
is possible to clamp one of the small primes to a certain size to help
DSA style algorithms.  Because most of the small primes in the pool are
not used for the resulting prime number, they are saved for later use
(see `save_pool_prime' and `get_pool_prime' in `cipher/primegen.c').
The prime generator optionally supports the finding of an appropriate
generator.

The primality test works in three steps:

  1. The standard sieve algorithm using the primes up to 4999 is used
     as a quick first check.

  2. A Fermat test filters out almost all non-primes.

  3. A 5 round Rabin-Miller test is finally used.  The first round uses
     a witness of 2, whereas the next rounds use a random witness.


   To support the generation of RSA and DSA keys in FIPS mode according
to X9.31 and FIPS 186-2, Libgcrypt implements two additional prime
generation functions: `_gcry_derive_x931_prime' and
`_gcry_generate_fips186_2_prime'.  These functions are internal and not
available through the public API.

   ---------- Footnotes ----------

   (1) Chae Hoon Lim and Pil Joong Lee. A key recovery attack on
discrete log-based shemes using a prime order subgroup. In Burton S.
Kaliski Jr., editor, Advances in Cryptology: Crypto '97, pages
249­-263, Berlin / Heidelberg / New York, 1997. Springer-Verlag.
Described on page 260.


File: gcrypt.info,  Node: Random-Number Subsystem Architecture,  Prev: Prime-Number-Generator Subsystem Architecture,  Up: Architecture

13.6 Random-Number Subsystem Architecture
=========================================

Libgcrypt provides 3 levels or random quality: The level
`GCRY_VERY_STRONG_RANDOM' usually used for key generation, the level
`GCRY_STRONG_RANDOM' for all other strong random requirements and the
function `gcry_create_nonce' which is used for weaker usages like
nonces.  There is also a level `GCRY_WEAK_RANDOM' which in general maps
to `GCRY_STRONG_RANDOM' except when used with the function
`gcry_mpi_randomize', where it randomizes an multi-precision-integer
using the `gcry_create_nonce' function.

There are two distinct random generators available:

   * The Continuously Seeded Pseudo Random Number Generator (CSPRNG),
     which is based on the classic GnuPG derived big pool
     implementation.  Implemented in `random/random-csprng.c' and used
     by default.

   * A FIPS approved ANSI X9.31 PRNG using AES with a 128 bit key.
     Implemented in `random/random-fips.c' and used if Libgcrypt is in
     FIPS mode.

Both generators make use of so-called entropy gathering modules:

rndlinux
     Uses the operating system provided `/dev/random' and
     `/dev/urandom' devices.

rndunix
     Runs several operating system commands to collect entropy from
     sources like virtual machine and process statistics.  It is a kind
     of poor-man's `/dev/random' implementation. It is not available in
     FIPS mode.

rndegd
     Uses the operating system provided Entropy Gathering Daemon (EGD).
     The EGD basically uses the same algorithms as rndunix does.
     However as a system daemon it keeps on running and thus can serve
     several processes requiring entropy input and does not waste
     collected entropy if the application does not need all the
     collected entropy. It is not available in FIPS mode.

rndw32
     Targeted for the Microsoft Windows OS.  It uses certain properties
     of that system and is the only gathering module available for that
     OS.

rndhw
     Extra module to collect additional entropy by utilizing a hardware
     random number generator.  As of now the only supported hardware
     RNG is the Padlock engine of VIA (Centaur) CPUs.  It is not
     available in FIPS mode.


* Menu:

* CSPRNG Description::      Description of the CSPRNG.
* FIPS PRNG Description::   Description of the FIPS X9.31 PRNG.


File: gcrypt.info,  Node: CSPRNG Description,  Next: FIPS PRNG Description,  Up: Random-Number Subsystem Architecture

13.6.1 Description of the CSPRNG
--------------------------------

This random number generator is loosely modelled after the one
described in Peter Gutmann's paper: "Software Generation of Practically
Strong Random Numbers".(1)

   A pool of 600 bytes is used and mixed using the core RIPE-MD160 hash
transform function.  Several extra features are used to make the robust
against a wide variety of attacks and to protect against failures of
subsystems.  The state of the generator may be saved to a file and
initially seed form a file.

   Depending on how Libgcrypt was build the generator is able to select
the best working entropy gathering module.  It makes use of the slow
and fast collection methods and requires the pool to initially seeded
form the slow gatherer or a seed file.  An entropy estimation is used
to mix in enough data from the gather modules before returning the
actual random output.  Process fork detection and protection is
implemented.

   The implementation of the nonce generator (for `gcry_create_nonce')
is a straightforward repeated hash design: A 28 byte buffer is
initially seeded with the PID and the time in seconds in the first 20
bytes and with 8 bytes of random taken from the `GCRY_STRONG_RANDOM'
generator.  Random numbers are then created by hashing all the 28 bytes
with SHA-1 and saving that again in the first 20 bytes.  The hash is
also returned as result.

   ---------- Footnotes ----------

   (1) Also described in chapter 6 of his book "Cryptographic Security
Architecture", New York, 2004, ISBN 0-387-95387-6.


File: gcrypt.info,  Node: FIPS PRNG Description,  Prev: CSPRNG Description,  Up: Random-Number Subsystem Architecture

13.6.2 Description of the FIPS X9.31 PRNG
-----------------------------------------

The core of this deterministic random number generator is implemented
according to the document "NIST-Recommended Random Number Generator
Based on ANSI X9.31 Appendix A.2.4 Using the 3-Key Triple DES and AES
Algorithms", dated 2005-01-31.  This implementation uses the AES
variant.

   The generator is based on contexts to utilize the same core functions
for all random levels as required by the high-level interface.  All
random generators return their data in 128 bit blocks.  If the caller
requests less bits, the extra bits are not used.  The key for each
generator is only set once at the first time a generator context is
used.  The seed value is set along with the key and again after 1000
output blocks.

   On Unix like systems the `GCRY_VERY_STRONG_RANDOM' and
`GCRY_STRONG_RANDOM' generators are keyed and seeded using the rndlinux
module with the `/dev/radnom' device. Thus these generators may block
until the OS kernel has collected enough entropy.  When used with
Microsoft Windows the rndw32 module is used instead.

   The generator used for `gcry_create_nonce' is keyed and seeded from
the `GCRY_STRONG_RANDOM' generator.  Thus is may also block if the
`GCRY_STRONG_RANDOM' generator has not yet been used before and thus
gets initialized on the first use by `gcry_create_nonce'.  This special
treatment is justified by the weaker requirements for a nonce generator
and to save precious kernel entropy for use by the "real" random
generators.

   A self-test facility uses a separate context to check the
functionality of the core X9.31 functions using a known answers test.
During runtime each output block is compared to the previous one to
detect a stucked generator.

   The DT value for the generator is made up of the current time down to
microseconds (if available) and a free running 64 bit counter.  When
used with the test context the DT value is taken from the context and
incremented on each use.


File: gcrypt.info,  Node: Self-Tests,  Next: FIPS Mode,  Prev: Architecture,  Up: Top

Appendix A Description of the Self-Tests
****************************************

In addition to the build time regression test suite, Libgcrypt
implements self-tests to be performed at runtime.  Which self-tests are
actually used depends on the mode Libgcrypt is used in.  In standard
mode a limited set of self-tests is run at the time an algorithm is
first used.  Note that not all algorithms feature a self-test in
standard mode.  The `GCRYCTL_SELFTEST' control command may be used to
run all implemented self-tests at any time; this will even run more
tests than those run in FIPS mode.

   If any of the self-tests fails, the library immediately returns an
error code to the caller.  If Libgcrypt is in FIPS mode the self-tests
will be performed within the "Self-Test" state and any failure puts the
library into the "Error" state.

A.1 Power-Up Tests
==================

Power-up tests are only performed if Libgcrypt is in FIPS mode.

A.1.1 Symmetric Cipher Algorithm Power-Up Tests
-----------------------------------------------

The following symmetric encryption algorithm tests are run during
power-up:

3DES
     To test the 3DES 3-key EDE encryption in ECB mode these tests are
     run:
       1. A known answer test is run on a 64 bit test vector processed
          by 64 rounds of Single-DES block encryption and decryption
          using a key changed with each round.

       2. A known answer test is run on a 64 bit test vector processed
          by 16 rounds of 2-key and 3-key Triple-DES block encryption
          and decryptions using a key changed with each round.

       3. 10 known answer tests using 3-key Triple-DES EDE encryption,
          comparing the ciphertext to the known value, then running a
          decryption and comparing it to the initial plaintext.
          (`cipher/des.c:selftest')

AES-128
     A known answer tests is run using one test vector and one test key
     with AES in ECB mode. (`cipher/rijndael.c:selftest_basic_128')

AES-192
     A known answer tests is run using one test vector and one test key
     with AES in ECB mode. (`cipher/rijndael.c:selftest_basic_192')

AES-256
     A known answer tests is run using one test vector and one test key
     with AES in ECB mode. (`cipher/rijndael.c:selftest_basic_256')

A.1.2 Hash Algorithm Power-Up Tests
-----------------------------------

The following hash algorithm tests are run during power-up:

SHA-1
     A known answer test using the string `"abc"' is run.
     (`cipher/sha1.c:selftests_sha1')

SHA-224
     A known answer test using the string `"abc"' is run.
     (`cipher/sha256.c:selftests_sha224')

SHA-256
     A known answer test using the string `"abc"' is run.
     (`cipher/sha256.c:selftests_sha256')

SHA-384
     A known answer test using the string `"abc"' is run.
     (`cipher/sha512.c:selftests_sha384')

SHA-512
     A known answer test using the string `"abc"' is run.
     (`cipher/sha512.c:selftests_sha512')

A.1.3 MAC Algorithm Power-Up Tests
----------------------------------

The following MAC algorithm tests are run during power-up:

HMAC SHA-1
     A known answer test using 9 byte of data and a 64 byte key is run.
     (`cipher/hmac-tests.c:selftests_sha1')

HMAC SHA-224
     A known answer test using 28 byte of data and a 4 byte key is run.
     (`cipher/hmac-tests.c:selftests_sha224')

HMAC SHA-256
     A known answer test using 28 byte of data and a 4 byte key is run.
     (`cipher/hmac-tests.c:selftests_sha256')

HMAC SHA-384
     A known answer test using 28 byte of data and a 4 byte key is run.
     (`cipher/hmac-tests.c:selftests_sha384')

HMAC SHA-512
     A known answer test using 28 byte of data and a 4 byte key is run.
     (`cipher/hmac-tests.c:selftests_sha512')

A.1.4 Random Number Power-Up Test
---------------------------------

The DRNG is tested during power-up this way:

  1. Requesting one block of random using the public interface to check
     general working and the duplicated block detection.

  2. 3 know answer tests using pre-defined keys, seed and initial DT
     values.  For each test 3 blocks of 16 bytes are requested and
     compared to the expected result.  The DT value is incremented for
     each block.

A.1.5 Public Key Algorithm Power-Up Tests
-----------------------------------------

The public key algorithms are tested during power-up:

RSA
     A pre-defined 1024 bit RSA key is used and these tests are run in
     turn:
       1. Conversion of S-expression to internal format.
          (`cipher/rsa.c:selftests_rsa')

       2. Private key consistency check.  (`cipher/rsa.c:selftests_rsa')

       3. A pre-defined 20 byte value is signed with PKCS#1 padding for
          SHA-1.  The result is verified using the public key against
          the original data and against modified data.
          (`cipher/rsa.c:selftest_sign_1024')

       4. A 1000 bit random value is encrypted and checked that it does
          not match the orginal random value.  The encrtypted result is
          then decrypted and checked that it macthes the original
          random value.  (`cipher/rsa.c:selftest_encr_1024')

DSA
     A pre-defined 1024 bit DSA key is used and these tests are run in
     turn:
       1. Conversion of S-expression to internal format.
          (`cipher/dsa.c:selftests_dsa')

       2. Private key consistency check.  (`cipher/dsa.c:selftests_dsa')

       3. A pre-defined 20 byte value is signed with PKCS#1 padding for
          SHA-1.  The result is verified using the public key against
          the original data and against modified data.
          (`cipher/dsa.c:selftest_sign_1024')

A.1.6 Integrity Power-Up Tests
------------------------------

The integrity of the Libgcrypt is tested during power-up but only if
checking has been enabled at build time.  The check works by computing
a HMAC SHA-256 checksum over the file used to load Libgcrypt into
memory.  That checksum is compared against a checksum stored in a file
of the same name but with a single dot as a prefix and a suffix of
`.hmac'.

A.1.7 Critical Functions Power-Up Tests
---------------------------------------

The 3DES weak key detection is tested during power-up by calling the
detection function with keys taken from a table listening all weak
keys.  The table itself is protected using a SHA-1 hash.
(`cipher/des.c:selftest')

A.2 Conditional Tests
=====================

The conditional tests are performed if a certain contidion is met.
This may occur at any time; the library does not necessary enter the
"Self-Test" state to run these tests but will transit to the "Error"
state if a test failed.

A.2.1 Key-Pair Generation Tests
-------------------------------

After an asymmetric key-pair has been generated, Libgcrypt runs a
pair-wise consistency tests on the generated key.  On failure the
generated key is not used, an error code is returned and, if in FIPS
mode, the library is put into the "Error" state.

RSA
     The test uses a random number 64 bits less the size of the modulus
     as plaintext and runs an encryption and decryption operation in
     turn.  The encrypted value is checked to not match the plaintext
     and the result of the decryption is checked to match the plaintext.

     A new random number of the same size is generated, signed and
     verified to test the correctness of the signing operation.  As a
     second signing test, the signature is modified by incrementing its
     value and then verified with the expected result that the
     verification fails.  (`cipher/rsa.c:test_keys')

DSA
     The test uses a random number of the size of the Q parameter to
     create a signature and then checks that the signature verifies.
     As a second signing test, the data is modified by incrementing its
     value and then verified against the signature with the expected
     result that the verification fails.  (`cipher/dsa.c:test_keys')

A.2.2 Software Load Tests
-------------------------

Loading of extra modules into libgcrypt is disabled in FIPS mode and
thus no tests are implemented. (`cipher/cipher.c:_gcry_cipher_register',
`cipher/md.c:_gcry_md_register', `cipher/pubkey.c:_gcry_pk_register')

A.2.3 Manual Key Entry Tests
----------------------------

A manual key entry feature is not implemented in Libgcrypt.

A.2.4 Continuous RNG Tests
--------------------------

The continuous random number test is only used in FIPS mode.  The RNG
generates blocks of 128 bit size; the first block generated per context
is saved in the context and another block is generated to be returned
to the caller.  Each block is compared against the saved block and then
stored in the context.  If a duplicated block is detected an error is
signaled and the libray is put into the "Fatal-Error" state.
(`random/random-fips.c:x931_aes_driver')

A.3 Application Requested Tests
===============================

The application may requests tests at any time by means of the
`GCRYCTL_SELFTEST' control command.  Note that using these tests is not
FIPS conform: Although Libgcrypt rejects all application requests for
services while running self-tests, it does not ensure that no other
operations of Libgcrypt are still being executed.  Thus, in FIPS mode
an application requesting self-tests needs to power-cycle Libgcrypt
instead.

   When self-tests are requested, Libgcrypt runs all the tests it does
during power-up as well as a few extra checks as described below.

A.3.1 Symmetric Cipher Algorithm Tests
--------------------------------------

The following symmetric encryption algorithm tests are run in addition
to the power-up tests:

AES-128
     A known answer tests with test vectors taken from NIST SP800-38a
     and using the high level functions is run for block modes CFB and
     OFB.


A.3.2 Hash Algorithm Tests
--------------------------

The following hash algorithm tests are run in addition to the power-up
tests:

SHA-1
SHA-224
SHA-256
       1. A known answer test using a 56 byte string is run.

       2. A known answer test using a string of one million letters "a"
          is run.
          (`cipher/sha1.c:selftests_sha1',
     `cipher/sha256.c:selftests_sha224',
     `cipher/sha256.c:selftests_sha256')

SHA-384

SHA-512
       1. A known answer test using a 112 byte string is run.

       2. A known answer test using a string of one million letters "a"
          is run.
          (`cipher/sha512.c:selftests_sha384',
     `cipher/sha512.c:selftests_sha512')

A.3.3 MAC Algorithm Tests
-------------------------

The following MAC algorithm tests are run in addition to the power-up
tests:

HMAC SHA-1
       1. A known answer test using 9 byte of data and a 20 byte key is
          run.

       2. A known answer test using 9 byte of data and a 100 byte key
          is run.

       3. A known answer test using 9 byte of data and a 49 byte key is
          run.
          (`cipher/hmac-tests.c:selftests_sha1')

HMAC SHA-224
HMAC SHA-256
HMAC SHA-384
HMAC SHA-512
       1. A known answer test using 9 byte of data and a 20 byte key is
          run.

       2. A known answer test using 50 byte of data and a 20 byte key
          is run.

       3. A known answer test using 50 byte of data and a 26 byte key
          is run.

       4. A known answer test using 54 byte of data and a 131 byte key
          is run.

       5. A known answer test using 152 byte of data and a 131 byte key
          is run.
          (`cipher/hmac-tests.c:selftests_sha224',
     `cipher/hmac-tests.c:selftests_sha256',
     `cipher/hmac-tests.c:selftests_sha384',
     `cipher/hmac-tests.c:selftests_sha512')


File: gcrypt.info,  Node: FIPS Mode,  Next: Library Copying,  Prev: Self-Tests,  Up: Top

Appendix B Description of the FIPS Mode
***************************************

This appendix gives detailed information pertaining to the FIPS mode.
In particular, the changes to the standard mode and the finite state
machine are described.  The self-tests required in this mode are
described in the appendix on self-tests.

B.1 Restrictions in FIPS Mode
=============================

If Libgcrypt is used in FIPS mode these restrictions are effective:

   * The cryptographic algorithms are restricted to this list:

    GCRY_CIPHER_3DES
          3 key EDE Triple-DES symmetric encryption.

    GCRY_CIPHER_AES128
          AES 128 bit symmetric encryption.

    GCRY_CIPHER_AES192
          AES 192 bit symmetric encryption.

    GCRY_CIPHER_AES256
          AES 256 bit symmetric encryption.

    GCRY_MD_SHA1
          SHA-1 message digest.

    GCRY_MD_SHA224
          SHA-224 message digest.

    GCRY_MD_SHA256
          SHA-256 message digest.

    GCRY_MD_SHA384
          SHA-384 message digest.

    GCRY_MD_SHA512
          SHA-512 message digest.

    GCRY_MD_SHA1,GCRY_MD_FLAG_HMAC
          HMAC using a SHA-1 message digest.

    GCRY_MD_SHA224,GCRY_MD_FLAG_HMAC
          HMAC using a SHA-224 message digest.

    GCRY_MD_SHA256,GCRY_MD_FLAG_HMAC
          HMAC using a SHA-256 message digest.

    GCRY_MD_SHA384,GCRY_MD_FLAG_HMAC
          HMAC using a SHA-384 message digest.

    GCRY_MD_SHA512,GCRY_MD_FLAG_HMAC
          HMAC using a SHA-512 message digest.

    GCRY_PK_RSA
          RSA encryption and signing.

    GCRY_PK_DSA
          DSA signing.

     Note that the CRC algorithms are not considered cryptographic
     algorithms and thus are in addition available.

   * RSA key generation refuses to create a key with a keysize of less
     than 1024 bits.

   * DSA key generation refuses to create a key with a keysize other
     than 1024 bits.

   * The `transient-key' flag for RSA and DSA key generation is ignored.

   * Support for the VIA Padlock engine is disabled.

   * FIPS mode may only be used on systems with a /dev/random device.
     Switching into FIPS mode on other systems will fail at runtime.

   * Saving and loading a random seed file is ignored.

   * An X9.31 style random number generator is used in place of the
     large-pool-CSPRNG generator.

   * The command `GCRYCTL_ENABLE_QUICK_RANDOM' is ignored.

   * The Alternative Public Key Interface (`gcry_ac_xxx') is not
     supported and all API calls return an error.

   * Registration of external modules is not supported.

   * Message digest debugging is disabled.

   * All debug output related to cryptographic data is suppressed.

   * On-the-fly self-tests are not performed, instead self-tests are run
     before entering operational state.

   * The function `gcry_set_allocation_handler' may not be used.  If it
     is used Libgcrypt disables FIPS mode unless Enforced FIPS mode is
     enabled, in which case Libgcrypt will enter the error state.

   * The digest algorithm MD5 may not be used.  If it is used Libgcrypt
     disables FIPS mode unless Enforced FIPS mode is enabled, in which
     case Libgcrypt will enter the error state.

   * In Enforced FIPS mode the command `GCRYCTL_DISABLE_SECMEM' is
     ignored.  In standard FIPS mode it disables FIPS mode.

   * A handler set by `gcry_set_outofcore_handler' is ignored.

   * A handler set by `gcry_set_fatalerror_handler' is ignored.


   Note that when we speak about disabling FIPS mode, it merely means
that the function `gcry_fips_mode_active' returns false; it does not
mean that any non FIPS algorithms are allowed.

B.2 FIPS Finite State Machine
=============================

The FIPS mode of libgcrypt implements a finite state machine (FSM) using
8 states (*note tbl:fips-states::) and checks at runtime that only valid
transitions (*note tbl:fips-state-transitions::) may happen.

            [image src="fips-fsm.png" alt="FIPS FSM Diagram" ]
Figure B.1: FIPS mode state diagram

States used by the FIPS FSM:
Power-Off
     Libgcrypt is not runtime linked to another application.  This
     usually means that the library is not loaded into main memory.
     This state is documentation only.

Power-On
     Libgcrypt is loaded into memory and API calls may be made.
     Compiler introducted constructor functions may be run.  Note that
     Libgcrypt does not implement any arbitrary constructor functions
     to be called by the operating system

Init
     The Libgcrypt initialization functions are performed and the
     library has not yet run any self-test.

Self-Test
     Libgcrypt is performing self-tests.

Operational
     Libgcrypt is in the operational state and all interfaces may be
     used.

Error
     Libgrypt is in the error state.  When calling any FIPS relevant
     interfaces they either return an error (`GPG_ERR_NOT_OPERATIONAL')
     or put Libgcrypt into the Fatal-Error state and won't return.

Fatal-Error
     Libgcrypt is in a non-recoverable error state and will
     automatically transit into the  Shutdown state.

Shutdown
     Libgcrypt is about to be terminated and removed from the memory.
     The application may at this point still runing cleanup handlers.


Table B.1: FIPS mode states

The valid state transitions (*note Figure B.1: fig:fips-fsm.) are:
`1'
     Power-Off to Power-On is implicitly done by the OS loading
     Libgcrypt as a shared library and having it linked to an
     application.

`2'
     Power-On to Init is triggered by the application calling the
     Libgcrypt intialization function `gcry_check_version'.

`3'
     Init to Self-Test is either triggred by a dedicated API call or
     implicit by invoking a libgrypt service conrolled by the FSM.

`4'
     Self-Test to Operational is triggered after all self-tests passed
     successfully.

`5'
     Operational to Shutdown is an artifical state without any direct
     action in Libgcrypt.  When reaching the Shutdown state the library
     is deinitialized and can't return to any other state again.

`6'
     Shutdown to Power-off is the process of removing Libgcrypt from the
     computer's memory.  For obvious reasons the Power-Off state can't
     be represented within Libgcrypt and thus this transition is for
     documentation only.

`7'
     Operational to Error is triggered if Libgcrypt detected an
     application error which can't be returned to the caller but still
     allows Libgcrypt to properly run.  In the Error state all FIPS
     relevant interfaces return an error code.

`8'
     Error to Shutdown is similar to the Operational to Shutdown
     transition (5).

`9'
     Error to Fatal-Error is triggred if Libgrypt detects an fatal error
     while already being in Error state.

`10'
     Fatal-Error to Shutdown is automatically entered by Libgcrypt
     after having reported the error.

`11'
     Power-On to Shutdown is an artifical state to document that
     Libgcrypt has not ye been initializaed but the process is about to
     terminate.

`12'
     Power-On to Fatal-Error will be triggerd if certain Libgcrypt
     functions are used without having reached the Init state.

`13'
     Self-Test to Fatal-Error is triggred by severe errors in Libgcrypt
     while running self-tests.

`14'
     Self-Test to Error is triggred by a failed self-test.

`15'
     Operational to Fatal-Error is triggered if Libcrypt encountered a
     non-recoverable error.

`16'
     Operational to Self-Test is triggred if the application requested
     to run the self-tests again.

`17'
     Error to Self-Test is triggered if the application has requested
     to run self-tests to get to get back into operational state after
     an error.

`18'
     Init to Error is triggered by errors in the initialization code.

`19'
     Init to Fatal-Error is triggered by non-recoverable errors in the
     initialization code.

`20'
     Error to Error is triggered by errors while already in the Error
     state.


Table B.2: FIPS mode state transitions

B.3 FIPS Miscellaneous Information
==================================

Libgcrypt does not do any key management on itself; the application
needs to care about it.  Keys which are passed to Libgcrypt should be
allocated in secure memory as available with the functions
`gcry_malloc_secure' and `gcry_calloc_secure'.  By calling `gcry_free'
on this memory, the memory and thus the keys are overwritten with zero
bytes before releasing the memory.

   For use with the random number generator, Libgcrypt generates 3
internal keys which are stored in the encryption contexts used by the
RNG.  These keys are stored in secure memory for the lifetime of the
process.  Application are required to use `GCRYCTL_TERM_SECMEM' before
process termination.  This will zero out the entire secure memory and
thus also the encryption contexts with these keys.


File: gcrypt.info,  Node: Library Copying,  Next: Copying,  Prev: FIPS Mode,  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!


File: gcrypt.info,  Node: Copying,  Next: Figures and Tables,  Prev: Library Copying,  Up: Top

GNU General Public License
**************************

                         Version 2, June 1991

     Copyright (C) 1989, 1991 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.

Preamble
========

The licenses for most software are designed to take away your freedom
to share and change it.  By contrast, the GNU General Public License is
intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users.  This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it.  (Some other Free Software Foundation software is covered by
the GNU Library General Public License instead.)  You can apply it to
your programs, too.

   When we speak of free software, we are referring to freedom, 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 or use pieces of it in
new free programs; and that you know you can do these things.

   To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.

   For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have.  You must make sure that they, too, receive or can get the
source code.  And you must show them these terms so they know their
rights.

   We protect your rights with two steps: (1) copyright the software,
and (2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.

   Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software.  If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.

   Finally, any free program is threatened constantly by software
patents.  We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary.  To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.

   The precise terms and conditions for copying, distribution and
modification follow.

    TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
  1. This License applies to any program or other work which contains a
     notice placed by the copyright holder saying it may be distributed
     under the terms of this General Public License.  The "Program",
     below, refers to any such program or work, and a "work based on
     the Program" means either the Program or any derivative work under
     copyright law: that is to say, a work containing the Program or a
     portion of it, either verbatim or with modifications and/or
     translated into another language.  (Hereinafter, translation is
     included without limitation in the term "modification".)  Each
     licensee is addressed as "you".

     Activities other than copying, distribution and modification are
     not covered by this License; they are outside its scope.  The act
     of running the Program is not restricted, and the output from the
     Program is covered only if its contents constitute a work based on
     the Program (independent of having been made by running the
     Program).  Whether that is true depends on what the Program does.

  2. You may copy and distribute verbatim copies of the Program's
     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 give any other recipients of the Program a copy of
     this License along with the Program.

     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.

  3. You may modify your copy or copies of the Program or any portion
     of it, thus forming a work based on the Program, 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. You must cause the modified files to carry prominent notices
          stating that you changed the files and the date of any change.

       b. You must cause any work that you distribute or publish, that
          in whole or in part contains or is derived from the Program
          or any part thereof, to be licensed as a whole at no charge
          to all third parties under the terms of this License.

       c. If the modified program normally reads commands interactively
          when run, you must cause it, when started running for such
          interactive use in the most ordinary way, to print or display
          an announcement including an appropriate copyright notice and
          a notice that there is no warranty (or else, saying that you
          provide a warranty) and that users may redistribute the
          program under these conditions, and telling the user how to
          view a copy of this License.  (Exception: if the Program
          itself is interactive but does not normally print such an
          announcement, your work based on the Program is not required
          to print an announcement.)

     These requirements apply to the modified work as a whole.  If
     identifiable sections of that work are not derived from the
     Program, 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 Program, 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 Program.

     In addition, mere aggregation of another work not based on the
     Program with the Program (or with a work based on the Program) on
     a volume of a storage or distribution medium does not bring the
     other work under the scope of this License.

  4. You may copy and distribute the Program (or a work based on it,
     under Section 2) in object code or executable form under the terms
     of Sections 1 and 2 above provided that you also do one of the
     following:

       a. 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; or,

       b. Accompany it with a written offer, valid for at least three
          years, to give any third party, for a charge no more than your
          cost of physically performing source distribution, a complete
          machine-readable copy of the corresponding source code, to be
          distributed under the terms of Sections 1 and 2 above on a
          medium customarily used for software interchange; or,

       c. Accompany it with the information you received as to the offer
          to distribute corresponding source code.  (This alternative is
          allowed only for noncommercial distribution and only if you
          received the program in object code or executable form with
          such an offer, in accord with Subsection b above.)

     The source code for a work means the preferred form of the work for
     making modifications to it.  For an executable work, 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 executable.
     However, as a special exception, the source code 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.

     If distribution of executable or 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 counts as
     distribution of the source code, even though third parties are not
     compelled to copy the source along with the object code.

  5. You may not copy, modify, sublicense, or distribute the Program
     except as expressly provided under this License.  Any attempt
     otherwise to copy, modify, sublicense or distribute the Program 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.

  6. 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 Program or its derivative works.  These actions
     are prohibited by law if you do not accept this License.
     Therefore, by modifying or distributing the Program (or any work
     based on the Program), you indicate your acceptance of this
     License to do so, and all its terms and conditions for copying,
     distributing or modifying the Program or works based on it.

  7. Each time you redistribute the Program (or any work based on the
     Program), the recipient automatically receives a license from the
     original licensor to copy, distribute or modify the Program
     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 to this License.

  8. 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
     Program at all.  For example, if a patent license would not permit
     royalty-free redistribution of the Program 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 Program.

     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.

  9. If the distribution and/or use of the Program is restricted in
     certain countries either by patents or by copyrighted interfaces,
     the original copyright holder who places the Program 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.

 10. The Free Software Foundation may publish revised and/or new
     versions of the 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
     Program 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 Program
     does not specify a version number of this License, you may choose
     any version ever published by the Free Software Foundation.

 11. If you wish to incorporate parts of the Program into other free
     programs whose distribution conditions are different, 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
 12. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO
     WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE
     LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
     HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "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 PROGRAM IS WITH YOU.  SHOULD THE
     PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY
     SERVICING, REPAIR OR CORRECTION.

 13. 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 PROGRAM 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 PROGRAM (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 PROGRAM TO OPERATE WITH ANY
     OTHER PROGRAMS), 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 Programs
=============================================

If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these
terms.

   To do so, attach the following notices to the program.  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 PROGRAM'S NAME AND AN IDEA OF WHAT IT DOES.
     Copyright (C) 19YY  NAME OF AUTHOR

     This program is free software; you can redistribute it and/or
     modify it under the terms of the GNU General Public License
     as published by the Free Software Foundation; either version 2
     of the License, or (at your option) any later version.

     This program is distributed in the hope that it will be useful,
     but WITHOUT ANY WARRANTY; without even the implied warranty of
     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     GNU General Public License for more details.

     You should have received a copy of the GNU General Public License along
     with this program; if not, 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.

   If the program is interactive, make it output a short notice like
this when it starts in an interactive mode:

     Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR
     Gnomovision comes with ABSOLUTELY NO WARRANTY; for details
     type `show w'.  This is free software, and you are welcome
     to redistribute it under certain conditions; type `show c'
     for details.

   The hypothetical commands `show w' and `show c' should show the
appropriate parts of the General Public License.  Of course, the
commands you use may be called something other than `show w' and `show
c'; they could even be mouse-clicks or menu items--whatever suits your
program.

   You should also get your employer (if you work as a programmer) or
your school, if any, to sign a "copyright disclaimer" for the program,
if necessary.  Here is a sample; alter the names:

     Yoyodyne, Inc., hereby disclaims all copyright
     interest in the program `Gnomovision'
     (which makes passes at compilers) written
     by James Hacker.

     SIGNATURE OF TY COON, 1 April 1989
     Ty Coon, President of Vice

   This General Public License does not permit incorporating your
program into proprietary programs.  If your program is a subroutine
library, you may consider it more useful to permit linking proprietary
applications with the library.  If this is what you want to do, use the
GNU Library General Public License instead of this License.


File: gcrypt.info,  Node: Figures and Tables,  Next: Concept Index,  Prev: Copying,  Up: Top

List of Figures and Tables
**************************

* Menu:

* Figure 13.1: Libgcrypt subsystems:     fig:subsystems.
* Figure B.1: FIPS mode state ...:       fig:fips-fsm.

* Menu:

* Table B.1: FIPS mode states:           tbl:fips-states.
* Table B.2: FIPS mode state ...:        tbl:fips-state-transitions.


File: gcrypt.info,  Node: Concept Index,  Next: Function and Data Index,  Prev: Figures and Tables,  Up: Top

Concept Index
*************

 [index ]
* Menu:

* 3DES:                                  Available ciphers.   (line  16)
* Advanced Encryption Standard:          Available ciphers.   (line  37)
* AES:                                   Available ciphers.   (line  37)
* Arcfour:                               Available ciphers.   (line  54)
* Blowfish:                              Available ciphers.   (line  24)
* Camellia:                              Available ciphers.   (line  81)
* CAST5:                                 Available ciphers.   (line  21)
* CBC, Cipher Block Chaining mode:       Available cipher modes.
                                                              (line  20)
* CBC-MAC:                               Working with cipher handles.
                                                              (line  52)
* CFB, Cipher Feedback mode:             Available cipher modes.
                                                              (line  16)
* cipher text stealing:                  Working with cipher handles.
                                                              (line  45)
* CRC32:                                 Available hash algorithms.
                                                              (line   6)
* CTR, Counter mode:                     Available cipher modes.
                                                              (line  29)
* DES:                                   Available ciphers.   (line  59)
* DES-EDE:                               Available ciphers.   (line  16)
* Digital Encryption Standard:           Available ciphers.   (line  16)
* ECB, Electronic Codebook mode:         Available cipher modes.
                                                              (line  13)
* Enforced FIPS mode:                    Enabling FIPS mode.  (line  30)
* error codes:                           Error Values.        (line   6)
* error codes, list of <1>:              Error Codes.         (line   6)
* error codes, list of:                  Error Sources.       (line   6)
* error codes, printing of:              Error Strings.       (line   6)
* error sources:                         Error Values.        (line   6)
* error sources, printing of:            Error Strings.       (line   6)
* error strings:                         Error Strings.       (line   6)
* error values:                          Error Values.        (line   6)
* error values, printing of:             Error Strings.       (line   6)
* FIPS 140:                              Enabling FIPS mode.  (line   6)
* FIPS 186 <1>:                          Public-Key Subsystem Architecture.
                                                              (line  63)
* FIPS 186:                              General public-key related Functions.
                                                              (line 256)
* FIPS mode:                             Enabling FIPS mode.  (line   6)
* GPL, GNU General Public License:       Copying.             (line   6)
* HAVAL:                                 Available hash algorithms.
                                                              (line   6)
* HMAC:                                  Working with hash algorithms.
                                                              (line  27)
* IDEA:                                  Available ciphers.   (line  11)
* LGPL, GNU Lesser General Public License: Library Copying.   (line   6)
* MD2, MD4, MD5:                         Available hash algorithms.
                                                              (line   6)
* OFB, Output Feedback mode:             Available cipher modes.
                                                              (line  26)
* RC2:                                   Available ciphers.   (line  71)
* RC4:                                   Available ciphers.   (line  54)
* rfc-2268:                              Available ciphers.   (line  71)
* Rijndael:                              Available ciphers.   (line  37)
* RIPE-MD-160:                           Available hash algorithms.
                                                              (line   6)
* Seed (cipher):                         Available ciphers.   (line  76)
* Serpent:                               Available ciphers.   (line  67)
* SHA-1:                                 Available hash algorithms.
                                                              (line   6)
* SHA-224, SHA-256, SHA-384, SHA-512:    Available hash algorithms.
                                                              (line   6)
* sync mode (OpenPGP):                   Working with cipher handles.
                                                              (line  40)
* TIGER:                                 Available hash algorithms.
                                                              (line   6)
* Triple-DES:                            Available ciphers.   (line  16)
* Twofish:                               Available ciphers.   (line  48)
* Whirlpool:                             Available hash algorithms.
                                                              (line   6)
* X9.31 <1>:                             Public-Key Subsystem Architecture.
                                                              (line  63)
* X9.31:                                 General public-key related Functions.
                                                              (line 249)


File: gcrypt.info,  Node: Function and Data Index,  Prev: Concept Index,  Up: Top

Function and Data Index
***********************

 [index ]
* Menu:

* AM_PATH_LIBGCRYPT:                     Building sources using Automake.
                                                              (line  13)
* gcry_ac_close:                         Working with handles.
                                                              (line  21)
* gcry_ac_data_clear:                    Working with sets of data.
                                                              (line  75)
* gcry_ac_data_copy:                     Working with sets of data.
                                                              (line  53)
* gcry_ac_data_decode:                   Using cryptographic functions.
                                                              (line 100)
* gcry_ac_data_decrypt:                  Using cryptographic functions.
                                                              (line  40)
* gcry_ac_data_decrypt_scheme:           Using cryptographic functions.
                                                              (line 137)
* gcry_ac_data_destroy:                  Working with sets of data.
                                                              (line  41)
* gcry_ac_data_encode:                   Using cryptographic functions.
                                                              (line  93)
* gcry_ac_data_encrypt:                  Using cryptographic functions.
                                                              (line  33)
* gcry_ac_data_encrypt_scheme:           Using cryptographic functions.
                                                              (line 127)
* gcry_ac_data_from_sexp:                Working with sets of data.
                                                              (line  93)
* gcry_ac_data_get_index:                Working with sets of data.
                                                              (line  69)
* gcry_ac_data_get_name:                 Working with sets of data.
                                                              (line  61)
* gcry_ac_data_length:                   Working with sets of data.
                                                              (line  57)
* gcry_ac_data_new:                      Working with sets of data.
                                                              (line  38)
* gcry_ac_data_set:                      Working with sets of data.
                                                              (line  45)
* gcry_ac_data_sign:                     Using cryptographic functions.
                                                              (line  48)
* gcry_ac_data_sign_scheme:              Using cryptographic functions.
                                                              (line 147)
* gcry_ac_data_t:                        Working with sets of data.
                                                              (line  20)
* gcry_ac_data_to_sexp:                  Working with sets of data.
                                                              (line  79)
* gcry_ac_data_verify:                   Using cryptographic functions.
                                                              (line  54)
* gcry_ac_data_verify_scheme:            Using cryptographic functions.
                                                              (line 157)
* gcry_ac_id_t:                          Available asymmetric algorithms.
                                                              (line  11)
* gcry_ac_id_to_name:                    Handle-independent functions.
                                                              (line  10)
* gcry_ac_io_init:                       Working with IO objects.
                                                              (line  22)
* gcry_ac_io_init_va:                    Working with IO objects.
                                                              (line  28)
* gcry_ac_io_t:                          Working with IO objects.
                                                              (line  10)
* gcry_ac_key_data_get:                  Working with keys.   (line  93)
* gcry_ac_key_destroy:                   Working with keys.   (line  86)
* gcry_ac_key_get_grip:                  Working with keys.   (line 105)
* gcry_ac_key_get_nbits:                 Working with keys.   (line 101)
* gcry_ac_key_init:                      Working with keys.   (line  30)
* gcry_ac_key_pair_destroy:              Working with keys.   (line  90)
* gcry_ac_key_pair_extract:              Working with keys.   (line  83)
* gcry_ac_key_pair_generate:             Working with keys.   (line  36)
* gcry_ac_key_pair_t:                    Working with keys.   (line  20)
* gcry_ac_key_t:                         Working with keys.   (line  16)
* gcry_ac_key_test:                      Working with keys.   (line  97)
* gcry_ac_key_type_t:                    Working with keys.   (line   7)
* gcry_ac_name_to_id:                    Handle-independent functions.
                                                              (line  15)
* gcry_ac_open:                          Working with handles.
                                                              (line  11)
* gcry_calloc:                           Memory allocation.   (line  15)
* gcry_calloc_secure:                    Memory allocation.   (line  21)
* gcry_check_version:                    Initializing the library.
                                                              (line  17)
* gcry_cipher_algo_info:                 General cipher functions.
                                                              (line  12)
* gcry_cipher_algo_name:                 General cipher functions.
                                                              (line  39)
* gcry_cipher_close:                     Working with cipher handles.
                                                              (line  59)
* gcry_cipher_ctl:                       Working with cipher handles.
                                                              (line 159)
* gcry_cipher_decrypt:                   Working with cipher handles.
                                                              (line 129)
* gcry_cipher_decrypt_t:                 Cipher modules.      (line  80)
* gcry_cipher_encrypt:                   Working with cipher handles.
                                                              (line 110)
* gcry_cipher_encrypt_t:                 Cipher modules.      (line  75)
* gcry_cipher_info:                      Working with cipher handles.
                                                              (line 168)
* gcry_cipher_list:                      Cipher modules.      (line 106)
* gcry_cipher_map_name:                  General cipher functions.
                                                              (line  45)
* gcry_cipher_mode_from_oid:             General cipher functions.
                                                              (line  50)
* gcry_cipher_oid_spec_t:                Cipher modules.      (line  60)
* gcry_cipher_open:                      Working with cipher handles.
                                                              (line  11)
* gcry_cipher_register:                  Cipher modules.      (line  96)
* gcry_cipher_reset:                     Working with cipher handles.
                                                              (line  97)
* gcry_cipher_setctr:                    Working with cipher handles.
                                                              (line  90)
* gcry_cipher_setiv:                     Working with cipher handles.
                                                              (line  83)
* gcry_cipher_setkey:                    Working with cipher handles.
                                                              (line  68)
* gcry_cipher_setkey_t:                  Cipher modules.      (line  70)
* gcry_cipher_spec_t:                    Cipher modules.      (line  12)
* gcry_cipher_stdecrypt_t:               Cipher modules.      (line  90)
* gcry_cipher_stencrypt_t:               Cipher modules.      (line  85)
* gcry_cipher_sync:                      Working with cipher handles.
                                                              (line 149)
* gcry_cipher_unregister:                Cipher modules.      (line 101)
* gcry_control:                          Controlling the library.
                                                              (line   7)
* gcry_create_nonce:                     Retrieving random numbers.
                                                              (line  26)
* gcry_err_code:                         Error Values.        (line  43)
* gcry_err_code_from_errno:              Error Values.        (line  95)
* gcry_err_code_t:                       Error Values.        (line   7)
* gcry_err_code_to_errno:                Error Values.        (line 100)
* gcry_err_make:                         Error Values.        (line  57)
* gcry_err_make_from_errno:              Error Values.        (line  81)
* gcry_err_source:                       Error Values.        (line  49)
* gcry_err_source_t:                     Error Values.        (line  14)
* gcry_error:                            Error Values.        (line  64)
* gcry_error_from_errno:                 Error Values.        (line  86)
* gcry_error_t:                          Error Values.        (line  25)
* gcry_fips_mode_active:                 Controlling the library.
                                                              (line 221)
* gcry_free:                             Memory allocation.   (line  31)
* gcry_handler_alloc_t:                  Allocation handler.  (line  12)
* gcry_handler_error_t:                  Error handler.       (line  27)
* gcry_handler_free_t:                   Allocation handler.  (line  24)
* gcry_handler_log_t:                    Logging handler.     (line   7)
* gcry_handler_no_mem_t:                 Error handler.       (line  11)
* gcry_handler_progress_t:               Progress handler.    (line  10)
* gcry_handler_realloc_t:                Allocation handler.  (line  20)
* gcry_handler_secure_check_t:           Allocation handler.  (line  16)
* gcry_malloc:                           Memory allocation.   (line   7)
* gcry_malloc_secure:                    Memory allocation.   (line  12)
* gcry_md_algo_name:                     Working with hash algorithms.
                                                              (line 154)
* gcry_md_close:                         Working with hash algorithms.
                                                              (line  61)
* gcry_md_copy:                          Working with hash algorithms.
                                                              (line  84)
* gcry_md_debug:                         Working with hash algorithms.
                                                              (line 218)
* gcry_md_enable:                        Working with hash algorithms.
                                                              (line  44)
* gcry_md_final:                         Working with hash algorithms.
                                                              (line 112)
* gcry_md_final_t:                       Hash algorithm modules.
                                                              (line  73)
* gcry_md_get_algo:                      Working with hash algorithms.
                                                              (line 198)
* gcry_md_get_algo_dlen:                 Working with hash algorithms.
                                                              (line 189)
* gcry_md_get_asnoid:                    Working with hash algorithms.
                                                              (line 170)
* gcry_md_hash_buffer:                   Working with hash algorithms.
                                                              (line 137)
* gcry_md_init_t:                        Hash algorithm modules.
                                                              (line  65)
* gcry_md_is_enabled:                    Working with hash algorithms.
                                                              (line 209)
* gcry_md_is_secure:                     Working with hash algorithms.
                                                              (line 204)
* gcry_md_list:                          Hash algorithm modules.
                                                              (line  91)
* gcry_md_map_name:                      Working with hash algorithms.
                                                              (line 160)
* gcry_md_oid_spec_t:                    Hash algorithm modules.
                                                              (line  57)
* gcry_md_open:                          Working with hash algorithms.
                                                              (line  11)
* gcry_md_putc:                          Working with hash algorithms.
                                                              (line 102)
* gcry_md_read:                          Working with hash algorithms.
                                                              (line 122)
* gcry_md_read_t:                        Hash algorithm modules.
                                                              (line  77)
* gcry_md_register:                      Hash algorithm modules.
                                                              (line  82)
* gcry_md_reset:                         Working with hash algorithms.
                                                              (line  72)
* gcry_md_setkey:                        Working with hash algorithms.
                                                              (line  53)
* gcry_md_spec_t:                        Hash algorithm modules.
                                                              (line  12)
* gcry_md_start_debug:                   Working with hash algorithms.
                                                              (line 232)
* gcry_md_stop_debug:                    Working with hash algorithms.
                                                              (line 240)
* gcry_md_test_algo:                     Working with hash algorithms.
                                                              (line 183)
* gcry_md_unregister:                    Hash algorithm modules.
                                                              (line  87)
* gcry_md_write:                         Working with hash algorithms.
                                                              (line  97)
* gcry_md_write_t:                       Hash algorithm modules.
                                                              (line  69)
* gcry_module_t:                         Modules.             (line  10)
* gcry_mpi_add:                          Calculations.        (line  10)
* gcry_mpi_add_ui:                       Calculations.        (line  14)
* gcry_mpi_addm:                         Calculations.        (line  18)
* gcry_mpi_aprint:                       MPI formats.         (line  54)
* gcry_mpi_clear_bit:                    Bit manipulations.   (line  19)
* gcry_mpi_clear_flag:                   Miscellaneous.       (line  32)
* gcry_mpi_clear_highbit:                Bit manipulations.   (line  25)
* gcry_mpi_cmp:                          Comparisons.         (line   9)
* gcry_mpi_cmp_ui:                       Comparisons.         (line  13)
* gcry_mpi_copy:                         Basic functions.     (line  23)
* gcry_mpi_div:                          Calculations.        (line  50)
* gcry_mpi_dump:                         MPI formats.         (line  61)
* gcry_mpi_gcd:                          Calculations.        (line  63)
* gcry_mpi_get_flag:                     Miscellaneous.       (line  37)
* gcry_mpi_get_nbits:                    Bit manipulations.   (line  10)
* gcry_mpi_get_opaque:                   Miscellaneous.       (line  20)
* gcry_mpi_invm:                         Calculations.        (line  68)
* gcry_mpi_lshift:                       Bit manipulations.   (line  34)
* gcry_mpi_mod:                          Calculations.        (line  55)
* gcry_mpi_mul:                          Calculations.        (line  34)
* gcry_mpi_mul_2exp:                     Calculations.        (line  46)
* gcry_mpi_mul_ui:                       Calculations.        (line  38)
* gcry_mpi_mulm:                         Calculations.        (line  42)
* gcry_mpi_new:                          Basic functions.     (line  10)
* gcry_mpi_powm:                         Calculations.        (line  59)
* gcry_mpi_print:                        MPI formats.         (line  45)
* gcry_mpi_randomize:                    Miscellaneous.       (line  41)
* gcry_mpi_release:                      Basic functions.     (line  26)
* gcry_mpi_rshift:                       Bit manipulations.   (line  29)
* gcry_mpi_scan:                         MPI formats.         (line  12)
* gcry_mpi_set:                          Basic functions.     (line  33)
* gcry_mpi_set_bit:                      Bit manipulations.   (line  16)
* gcry_mpi_set_flag:                     Miscellaneous.       (line  26)
* gcry_mpi_set_highbit:                  Bit manipulations.   (line  22)
* gcry_mpi_set_opaque:                   Miscellaneous.       (line   8)
* gcry_mpi_set_ui:                       Basic functions.     (line  37)
* gcry_mpi_snew:                         Basic functions.     (line  17)
* gcry_mpi_sub:                          Calculations.        (line  22)
* gcry_mpi_sub_ui:                       Calculations.        (line  26)
* gcry_mpi_subm:                         Calculations.        (line  30)
* gcry_mpi_swap:                         Basic functions.     (line  44)
* gcry_mpi_t:                            Data types.          (line   7)
* gcry_mpi_test_bit:                     Bit manipulations.   (line  13)
* gcry_pk_algo_info:                     General public-key related Functions.
                                                              (line  47)
* gcry_pk_algo_name:                     General public-key related Functions.
                                                              (line  10)
* gcry_pk_check_secret_key_t:            Public key modules.  (line  91)
* gcry_pk_ctl:                           General public-key related Functions.
                                                              (line 100)
* gcry_pk_decrypt:                       Cryptographic Functions.
                                                              (line  85)
* gcry_pk_decrypt_t:                     Public key modules.  (line 101)
* gcry_pk_encrypt:                       Cryptographic Functions.
                                                              (line  29)
* gcry_pk_encrypt_t:                     Public key modules.  (line  96)
* gcry_pk_generate_t:                    Public key modules.  (line  86)
* gcry_pk_genkey:                        General public-key related Functions.
                                                              (line 115)
* gcry_pk_get_keygrip:                   General public-key related Functions.
                                                              (line  29)
* gcry_pk_get_nbits:                     General public-key related Functions.
                                                              (line  24)
* gcry_pk_get_nbits_t:                   Public key modules.  (line 116)
* gcry_pk_list:                          Public key modules.  (line 131)
* gcry_pk_map_name:                      General public-key related Functions.
                                                              (line  16)
* gcry_pk_register:                      Public key modules.  (line 121)
* gcry_pk_sign:                          Cryptographic Functions.
                                                              (line 117)
* gcry_pk_sign_t:                        Public key modules.  (line 106)
* gcry_pk_spec_t:                        Public key modules.  (line  12)
* gcry_pk_test_algo:                     General public-key related Functions.
                                                              (line  20)
* gcry_pk_testkey:                       General public-key related Functions.
                                                              (line  40)
* gcry_pk_unregister:                    Public key modules.  (line 127)
* gcry_pk_verify:                        Cryptographic Functions.
                                                              (line 170)
* gcry_pk_verify_t:                      Public key modules.  (line 111)
* gcry_prime_check:                      Checking.            (line   8)
* gcry_prime_generate:                   Generation.          (line  10)
* gcry_prime_group_generator:            Generation.          (line  19)
* gcry_prime_release_factors:            Generation.          (line  25)
* gcry_random_bytes:                     Retrieving random numbers.
                                                              (line  13)
* gcry_random_bytes_secure:              Retrieving random numbers.
                                                              (line  19)
* gcry_random_level_t:                   Quality of random numbers.
                                                              (line   9)
* gcry_randomize:                        Retrieving random numbers.
                                                              (line   8)
* gcry_realloc:                          Memory allocation.   (line  24)
* gcry_set_allocation_handler:           Allocation handler.  (line  34)
* gcry_set_fatalerror_handler:           Error handler.       (line  32)
* gcry_set_log_handler:                  Logging handler.     (line  12)
* gcry_set_outofcore_handler:            Error handler.       (line  16)
* gcry_set_progress_handler:             Progress handler.    (line  21)
* gcry_sexp_build:                       Working with S-expressions.
                                                              (line  43)
* gcry_sexp_canon_len:                   Working with S-expressions.
                                                              (line 126)
* gcry_sexp_car:                         Working with S-expressions.
                                                              (line 155)
* gcry_sexp_cdr:                         Working with S-expressions.
                                                              (line 160)
* gcry_sexp_create:                      Working with S-expressions.
                                                              (line  26)
* gcry_sexp_dump:                        Working with S-expressions.
                                                              (line 117)
* gcry_sexp_find_token:                  Working with S-expressions.
                                                              (line 138)
* gcry_sexp_length:                      Working with S-expressions.
                                                              (line 145)
* gcry_sexp_new:                         Working with S-expressions.
                                                              (line  13)
* gcry_sexp_nth:                         Working with S-expressions.
                                                              (line 150)
* gcry_sexp_nth_data:                    Working with S-expressions.
                                                              (line 168)
* gcry_sexp_nth_mpi:                     Working with S-expressions.
                                                              (line 193)
* gcry_sexp_nth_string:                  Working with S-expressions.
                                                              (line 185)
* gcry_sexp_release:                     Working with S-expressions.
                                                              (line  83)
* gcry_sexp_sprint:                      Working with S-expressions.
                                                              (line  94)
* gcry_sexp_sscan:                       Working with S-expressions.
                                                              (line  37)
* gcry_sexp_t:                           Data types for S-expressions.
                                                              (line   7)
* gcry_strerror:                         Error Strings.       (line   7)
* gcry_strsource:                        Error Strings.       (line  13)



Tag Table:
Node: Top775
Node: Introduction2994
Node: Getting Started3366
Node: Features4247
Node: Overview5031
Node: Preparation5662
Node: Header6519
Node: Building sources7589
Node: Building sources using Automake9503
Node: Initializing the library10685
Ref: sample-use-suspend-secmem13860
Ref: sample-use-resume-secmem14480
Node: Multi-Threading15376
Ref: Multi-Threading-Footnote-119389
Node: Enabling FIPS mode19797
Node: Generalities21663
Node: Controlling the library21988
Node: Modules34155
Node: Error Handling34934
Node: Error Values37457
Node: Error Sources42397
Node: Error Codes44668
Node: Error Strings48153
Node: Handler Functions49336
Node: Progress handler49895
Node: Allocation handler51891
Node: Error handler53442
Node: Logging handler55009
Node: Symmetric cryptography55601
Node: Available ciphers56406
Node: Cipher modules58913
Node: Available cipher modes63437
Node: Working with cipher handles64316
Node: General cipher functions72631
Node: Public Key cryptography75149
Node: Available algorithms76064
Node: Used S-expressions76413
Node: RSA key parameters77525
Node: DSA key parameters78800
Node: ECC key parameters79458
Node: Public key modules81223
Node: Cryptographic Functions86807
Node: General public-key related Functions94287
Node: AC Interface106576
Node: Available asymmetric algorithms107711
Node: Working with sets of data108380
Node: Working with IO objects112882
Node: Working with handles115602
Node: Working with keys116549
Node: Using cryptographic functions120631
Node: Handle-independent functions127538
Node: Hashing128286
Node: Available hash algorithms129077
Node: Hash algorithm modules132184
Node: Working with hash algorithms136032
Node: Random Numbers147334
Node: Quality of random numbers147608
Node: Retrieving random numbers148292
Node: S-expressions149776
Node: Data types for S-expressions150418
Node: Working with S-expressions150742
Node: MPI library160113
Node: Data types161071
Node: Basic functions161265
Node: MPI formats163333
Node: Calculations166216
Node: Comparisons168470
Node: Bit manipulations169114
Node: Miscellaneous170429
Node: Prime numbers172398
Node: Generation172668
Node: Checking173952
Node: Utilities174365
Node: Memory allocation174558
Node: Architecture175885
Ref: fig:subsystems177405
Ref: Architecture-Footnote-1178490
Ref: Architecture-Footnote-2178552
Node: Public-Key Subsystem Architecture178636
Node: Symmetric Encryption Subsystem Architecture181577
Node: Hashing and MACing Subsystem Architecture183024
Node: Multi-Precision-Integer Subsystem Architecture184948
Node: Prime-Number-Generator Subsystem Architecture186389
Ref: Prime-Number-Generator Subsystem Architecture-Footnote-1188320
Node: Random-Number Subsystem Architecture188607
Node: CSPRNG Description191096
Ref: CSPRNG Description-Footnote-1192658
Node: FIPS PRNG Description192781
Node: Self-Tests194916
Node: FIPS Mode206607
Ref: fig:fips-fsm210587
Ref: tbl:fips-states210689
Ref: tbl:fips-state-transitions211942
Node: Library Copying215556
Node: Copying243674
Node: Figures and Tables262848
Node: Concept Index263258
Node: Function and Data Index268823

End Tag Table
