diff --git a/NEWS b/NEWS
index 5860dfe1..1511c10e 100644
--- a/NEWS
+++ b/NEWS
@@ -1,555 +1,559 @@
+Noteworthy changes in version 1.4.3
+------------------------------------------------
+
+
 Noteworthy changes in version 1.4.2 (2008-09-08)
 ------------------------------------------------
 
  * The long missing gcry_mpi_lshift function has been added.
 
  * RSA key generation now supports a "transient-key" flag.
 
  * The keygrip computation for ECDSA has been implemented thus ECDSA
    is now fully supported.
 
  * A few macros have been replaced by functions for better type
    checking.
 
  * The thread initialization structure now carries version
    information.
 
  * The manual describes more clearly how to initialize Libgcrypt.
 
  * The library may now be switched into a FIPS mode.
 
  * Interface changes relative to the 1.3.0 release:
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  GCRYCTL_OPERATIONAL_P   NEW.
  GCRYCTL_FIPS_MODE_P     NEW.
  GCRYCTL_FORCE_FIPS_MODE NEW.
  gcry_cipher_setkey      NEW: Replaces macro.
  gcry_cipher_setiv       NEW: Replaces macro.
  gcry_cipher_setctr      NEW: Replaces macro.
  gcry_mpi_lshift         NEW.
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
 Noteworthy changes in version 1.4.1 (2008-04-25)
 ------------------------------------------------
 
  * Fixed a bug introduced by 1.3.1 which led to the comsumption of far
    too much entropy for the intial seeding.
 
  * Improved AES performance for CFB and CBC modes.
 
  * Removed build problems for the Padlock support.
 
 
 Noteworthy changes in version 1.4.0 (2007-12-10)
 ------------------------------------------------
 
  * New configure option --disable-padlock-support which is mostly
    useful in case of build problems.
 
 
 Noteworthy changes in version 1.3.2 (2007-12-03)
 ------------------------------------------------
 
  * The visibility attribute is now used if supported by the toolchain.
 
  * The ACE engine of VIA processors is now used for AES-128.
 
  * The ASN.1 DER template for SHA-224 has been fixed.
 
 
 Noteworthy changes in version 1.3.1 (2007-10-26)
 ------------------------------------------------
 
  * The entire library is now under the LGPL. The helper programs and
    the manual are under the GPL.  Kudos to Peter Gutmann for giving
    permissions to relicense the rndw32 and rndunix modules.
 
  * The Camellia cipher is now under the LGPL and included by default.
 
  * Fixed a bug in the detection of symbol prefixes which inhibited the
    build of optimzied assembler code on certain systems.
 
  * Updated the entropy gatherer for W32.
 
 
 Noteworthy changes in version 1.3.0 (2007-05-04)
 ------------------------------------------------
 
  * Changed the way the RNG gets initialized. This allows to keep it
    uninitialized as long as no random numbers are used.  To override
    this, the new macro gcry_fast_random_poll may be used.  It is in
    general a good idea to spread this macro into the application code
    to make sure that these polls happen often enough.
 
  * Made the RNG immune against fork without exec.
 
  * Reading and writing the random seed file is now protected by a
    fcntl style file lock on systems that provide this function.
 
  * Support for SHA-224 and HMAC using SHA-384 and SHA-512.
 
  * Support for the SEED cipher.
 
  * Support for the Camellia cipher.  Note that Camellia is disabled by
    default, and that enabling it changes the license of libgcrypt from
    LGPL to GPL.
 
  * Support for OFB encryption mode.
 
  * gcry_mpi_rshift does not anymore truncate the shift count.
 
  * Reserved algorithm ranges for use by applications.
 
  * Support for DSA2.
 
  * The new function gcry_md_debug should be used instead of the
    gcry_md_start_debug and gcry_md_stop_debug macros.
 
  * New configure option --enable-random-daemon to support a system
    wide random daemon.  The daemon code is experimental and not yet
    very well working.  It will eventually allow to keep a global
    random pool for the sake of short living processes.
 
  * Non executable stack support is now used by default on systems
    supporting it.
 
  * Support for Microsoft Windows.
 
  * Assembler support for the AMD64 architecture.
 
  * New configure option --enable-mpi-path for optimized builds.
 
  * Experimental support for ECDSA; should only be used for testing.
 
  * New control code GCRYCTL_PRINT_CONFIG to print the build
    configuration.
 
  * Minor changes to some function declarations.  Buffer arguments are
    now typed as void pointer.  This should not affect any compilation.
    Fixed two bugs in return values and clarified documentation.
 
  * Interface changes relative to the 1.2.0 release:
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  gcry_fast_random_poll	 NEW
  gcry_md_debug           NEW
  gcry_sexp_nth_string    NEW
  GCRY_MD_SHA224          NEW
  GCRY_PK_USAGE_CERT      NEW
  GCRY_PK_USAGE_AUTH      NEW
  GCRY_PK_USAGE_UNKN      NEW
  GCRY_PK_ECDSA           NEW
  GCRY_CIPHER_SEED        NEW
  GCRY_CIPHER_CAMELLIA128 NEW
  GCRY_CIPHER_CAMELLIA192 NEW
  GCRY_CIPHER_CAMELLIA256 NEW
  GCRYCTL_FAKED_RANDOM_P  NEW 
  GCRYCTL_PRINT_CONFIG    NEW
  GCRYCTL_SET_RNDEGD_SOCKET  NEW.
  gcry_mpi_scan           CHANGED: Argument BUFFER is now void*.
  gcry_pk_algo_name       CHANGED: Returns "?" instead of NULL.
  gcry_cipher_algo_name   CHANGED: Returns "?" instead of "".
  gcry_pk_spec_t          CHANGED: Element ALIASES is now const ptr.
  gcry_md_write_t         CHANGED: Argument BUF is now a const void*.
  gcry_md_ctl             CHANGED: Argument BUFFER is now void*.
  gcry_cipher_encrypt     CHANGED: Arguments IN and OUT are now void*.
  gcry_cipher_decrypt     CHANGED: Arguments IN and OUT are now void*.
  gcry_sexp_sprint        CHANGED: Argument BUFFER is now void*.
  gcry_create_nonce       CHANGED: Argument BUFFER is now void*.
  gcry_randomize          CHANGED: Argument BUFFER is now void*.
  gcry_cipher_register    CHANGED: Argument ALGORITHM_ID is now int*.
  ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
 Noteworthy changes in version 1.2.0 (2004-04-15)
 ------------------------------------------------
 
  * First stable release.
 
 
 Noteworthy changes in version 1.1.94 (2004-03-29)
 -------------------------------------------------
 
  * The support for multi-threaded users goes into its third
    incarnation.  We removed compile time support for thread libraries.
    To support the thread library of your choice, you have to set up
    callback handlers at initialization time.  New data structures, a
    new control command, and default initializers are provided for this
    purpose.
 
  * Interface changes relative to the 1.1.93 release:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 libgcrypt-config --thread	OBSOLETE
 libgcrypt-pth.la		REMOVED
 libgcrypt-pthread.la		REMOVED
 GCRYCTL_SET_THREAD_CBS		NEW
 struct gcrypt_thread_cbs	NEW
 enum gcry_thread_option		NEW
 GCRY_THREAD_OPTION_PTH_IMPL	NEW
 GCRY_THREAD_OPTION_PTHREAD_IMPL	NEW
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Noteworthy changes in version 1.1.93 (2004-03-06)
 -------------------------------------------------
 
  * The automatic thread library detection has finally been removed.
    From now on, only linking explicitely to libgcrypt, libgcrypt-pth
    or libgcrypt-pthread is supported.
 
 Noteworthy changes in version 1.1.92 (2004-02-20)
 -------------------------------------------------
 
  * Minor bug fixes.
 
  * Included a limited implementation of RFC2268.
 
  * Changed API of the gcry_ac_ functions.  Only a very few programs
    should be affected by this.
 
  * Interface changes relative to the 1.1.91 release:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 GCRY_CIPHER_RFC2268_40          NEW.
 gcry_ac_data_set                CHANGED: New argument FLAGS.
 gcry_ac_data_get_name           CHANGED: New argument FLAGS.
 gcry_ac_data_get_index          CHANGED: New argument FLAGS.
 gcry_ac_key_pair_generate       CHANGED: New and reordered arguments.
 gcry_ac_key_test                CHANGED: New argument HANDLE.
 gcry_ac_key_get_nbits           CHANGED: New argument HANDLE.
 gcry_ac_key_get_grip            CHANGED: New argument HANDLE.
 gcry_ac_data_search             REMOVED.
 gcry_ac_data_add                REMOVED.
 GCRY_AC_DATA_FLAG_NO_BLINDING   REMOVED.
 GCRY_AC_FLAG_NO_BLINDING        NEW: Replaces above.
 
 
 Noteworthy changes in version 1.1.91 (2003-12-19)
 -------------------------------------------------
 
  * Code cleanups and minor bug fixes.
 
 
 Noteworthy changes in version 1.1.90 (2003-11-14)
 -------------------------------------------------
 
  * The use of the GCRY_WEAK_RANDOM level is now deprecated in favor of
    the new gcry_create_nonce function.
 
  * gcry_sexp_build now supports a "%b" format to include a memory buffer.
 
  * Minor configuration fixes.
  
  * Interface changes relative to the 1.1.44 release:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 gcry_create_nonce               NEW
 gcry_sexp_build                 ENHANCED
 
 
 Noteworthy changes in version 1.1.44 (2003-10-31)
 -------------------------------------------------
 
  * Bug fixes and more code cleanups.
 
  * Enhanced the prime API.
 
  * Interface changes relative to the 1.1.43 release:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 gcry_prime_group_generator      NEW
 gcry_prime_release_factors      NEW
 
 
 Noteworthy changes in version 1.1.43 (2003-09-04)
 -------------------------------------------------
 
  * Bug fixes and internal code cleanups.
 
  * Support for the Serpent cipher algorithm.
 
  * Interface changes relative to the 1.1.42 release:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 gcry_prime_generate             NEW
 gcry_prime_check                NEW
 
 
 Noteworthy changes in version 1.1.42 (2003-07-31)
 -------------------------------------------------
 
  * Major API cleanup.  Applications need to be converted to the new
    API.  See README.apichanges for hints on how to do that.  Backward
    compatibility is provided where it was possible without too much
    effort and did not collide with the overall sanitization effort.
    However, this is only for ease of transition.  NO DEPRECATED
    FUNCTION OR DATA TYPE IS CONSIDERED A PART OF THE API OR ABI AND
    WILL BE DROPPED IN THE FUTURE WITHOUT CHANGING THE SONAME OF THE
    LIBRARY. 
 
  * If gcrypt.h is included in sources compiled by GCC 3.1 or later,
    deprecated attributes will warn about use of obsolete functions and
    type definitions.  You can suppress these warnings by passing
    -Wno-deprecated-declarations to the gcc command.
 
  * gcry_check_version must be called from now on to initialize the
    library, it is not longer optional.
 
  * Removed `libgcrypt errno' concept.
 
  * Libgcrypt depends on libgpg-error, a library that provides error
    codes and according functions for all GnuPG components.  Functions
    that used to return error codes asa `int' have been changed to
    return a code of type `gcry_error_t'.  All GCRYERR_* error symbols
    have been removed, since they are now contained in libgpg-error
    (GPG_ERR_*). All functions and types in libgpg-error have also been
    wrapped in Libgcrypt. The new types are gcry_err_code_t and
    gcry_err_source_t.  The new functions are gcry_err_code,
    gcry_err_source, gcry_error, gcry_err_make, gcry_error_from_errno,
    gcry_err_make_from_errno, gcry_err_code_from_errno,
    gcry_err_code_to_errno, gcry_strsource.
 
  * New function gcry_mpi_dump to help in debugging. 
 
  * Added alternative interface for asymmetric cryptography.
 
  * CRC-32, CRC-32 a'la RFC 1510, CRC-24 a'la RFC 2440 are now
    supported.
 
  * SHA-256, SHA-384 and SHA-512 are now supported.
 
  * 128 bit Twofish is now supported.
 
  * The random module won't print the "not enough random bytes
    available" anymore.  A new progress status is issued instead.
 
  * CBC-MAC for block ciphers is now supported, by using a
    GCRY_CIPHER_CBC_MAC cipher flag.
 
  * CTR mode for block ciphers is now supported.
 
  * The public RSA exponent can now be specified in key generation. 
 
  * RSA blinding is now supported and is used automatically for RSA
    decryption.  It can be explicitely disabled by using the
    `no-blinding' symbol in the `flags' S-Expression or by using the
    GCRY_AC_FLAG_DATA_NO_BLINDING flag when using the ac interface.
 
  * gcry_sexp_canon_len does not use a `historically encoded' error
    code anymore.
 
 
  * Interface changes relative to the 1.1.12 release:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 GCRY_MPI			DEPRECATED; Use: gcry_mpi_t
 GcryMPI				DEPRECATED; Use: gcry_mpi_t
 GCRY_SEXP			DEPRECATED; Use: gcry_sexp_t
 GcrySexp			DEPRECATED; Use: gcry_sexp_t
 GCRY_CIPHER_HD			DEPRECATED; Use: gcry_cipher_hd_t
 GcryCipherHd			DEPRECATED; Use: gcry_cipher_hd_t
 GCRY_MD_HD			DEPRECATED; Use: gcry_md_hd_t
 GcryMDHd			DEPRECATED; Use: gcry_md_hd_t
 gcry_error_t			NEW
 gcry_err_code_t			NEW
 gcry_err_source_t		NEW
 gcry_err_make			NEW
 gcry_error			NEW
 gcry_err_code			NEW
 gcry_err_source			NEW
 gcry_err_code_from_errno	NEW
 gcry_err_code_to_errno		NEW
 gcry_err_make_from_errno	NEW
 gcry_error_from_errno		NEW
 gcry_strsource			NEW
 GCRYERR_{some error code}	REMOVED; Use GPG_ERR_*
                                          from libgpg-error instead.
 gcry_errno                      REMOVED
 gcry_sexp_canon_len		CHANGED
 gcry_sexp_build_array		NEW
 gcry_mpi_scan			CHANGED: New argument to separate in/out args.
 gcry_mpi_print			CHANGED: Ditto.
 gcry_mpi_dump			NEW
 gcry_cipher_open		CHANGED
 gcry_cipher_reset		NEW
 gcry_cipher_register		NEW
 gcry_cipher_unregister		NEW
 gcry_cipher_list		NEW
 gcry_cipher_algo_keylen		REPLACED macro with function.
 gcry_cipher_algo_blklen		REPLACED macro with function.
 gcry_pk_register		NEW
 gcry_pk_unregister		NEW
 gcry_pk_list			NEW
 gcry_pk_decrypt			ENHANCED: Allows flag to return
                                           complete S-expression.
 gcry_md_open			CHANGED
 gcry_md_copy			CHANGED
 gcry_md_is_enabled		NEW
 gcry_md_is_secure		NEW
 gcry_md_register		NEW
 gcry_md_unregister		NEW
 gcry_md_list			NEW
 gcry_ac_data_t			NEW
 gcry_ac_key_t			NEW
 gcry_ac_key_pair_t		NEW
 gcry_ac_handle_t		NEW
 gcry_ac_key_spec_rsa_t		NEW
 gcry_ac_data_new		NEW
 gcry_ac_data_destroy		NEW
 gcry_ac_data_set		NEW
 gcry_ac_data_copy		NEW
 gcry_ac_data_length		NEW
 gcry_ac_data_get_name		NEW
 gcry_ac_data_get_index		NEW
 gcry_ac_data_clear		NEW
 gcry_ac_open			NEW
 gcry_ac_close			NEW
 gcry_ac_key_init		NEW
 gcry_ac_key_pair_generate	NEW
 gcry_ac_key_pair_extract	NEW
 gcry_ac_key_data_get		NEW
 gcry_ac_key_test		NEW
 gcry_ac_key_get_nbits		NEW
 gcry_ac_key_get_grip		NEW
 gcry_ac_key_destroy		NEW
 gcry_ac_key_pair_destroy	NEW
 gcry_ac_data_encrypt		NEW
 gcry_ac_data_decrypt		NEW
 gcry_ac_data_sign		NEW
 gcry_ac_data_verify		NEW
 gcry_ac_id_to_name		NEW
 gcry_ac_name_to_id		NEW
 gcry_handler_progress_t		NEW
 gcry_handler_alloc_t		NEW
 gcry_handler_secure_check_t	NEW
 gcry_handle_realloc_t		NEW
 gcry_handler_free_t		NEW
 gcry_handler_no_mem_t		NEW
 gcry_handler_error_t		NEW
 gcry_handler_log_t		NEW
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Noteworthy changes in version 1.1.12 (2003-01-20)
 -------------------------------------------------
 
  * gcry_pk_sign, gcry_pk_verify and gcry_pk_encrypt can now handle an
    optional pkcs1 flags parameter in the S-expression.  A similar flag
    may be passed to gcry_pk_decrypt but it is only syntactically
    implemented.
 
  * New convenience macro gcry_md_get_asnoid.
 
  * There is now some real stuff in the manual.
 
 
 Noteworthy changes in version 1.1.11 (2002-12-21)
 -------------------------------------------------
 
  * Don't export internal symbols anymore (currently only for GNU systems)
 
  * New algorithm: MD4
 
  * Implemented ciphertext stealing.
 
  * Smaller bugs fixes and a few new OIDs.
 
  * Interface changes relative to the 1.1.8 release:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 gcry_cipher_cts                   NEW
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
 Noteworthy changes in version 1.1.10 (2002-09-20)
 -------------------------------------------------
 
  * Fixed shared library builds for i386, PPC and Sparc.
 
  * Added simple benchmark tool.
 
  * Replaced the internal mutexes by code which automatically adapts to
    the used threading library.  Currently Pth and Pthread are
    supported.  For non-ELF systems the GNU toolchain is now required..
 
  * Added untested support to build Windows DLLs.
 
 Noteworthy changes in version 1.1.9 (2002-08-23)
 ------------------------------------------------
 
  * Support for plain old DES.
 
 
 Noteworthy changes in version 1.1.8 (2002-06-25)
 ------------------------------------------------
 
  * Minor cleanups and exported a few new functions.
 
  * Interface changes relative to the 1.1.7 release:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 gcry_mpi_div                      NEW
 gcry_mpi_mod                      NEW
 gcry_mpi_invm                     NEW
 gcry_mpi_swap                     NEW
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Noteworthy changes in version 1.1.7 (2002-05-21)
 ------------------------------------------------
 
 * Libgcrypt is now distributed under the terms of the GNU Lesser
   General Public License; see the README file for details.    
   
 * It is possible to use libgcrypt w/o intialized secure memory.
 
 * Libgcrypt should now be thread safe after the initialization.
   gcry_control (GCRYCRL_INITIALIZATION_FINISHED,NULL,0) should have
   been called before creating additional threads.
 
  * Interface changes relative to the 1.1.6 release:
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 GCRYCTL_DISABLE_INTERNAL_LOCKING  NEW
 GCRYCTL_DISABLE_SECMEM            NEW
 GCRYCTL_INITIALIZATION_FINISHED   NEW
 GCRYCTL_INITIALIZATION_FINISHED_P NEW
 GCRYCTL_ANY_INITIALIZATION_P      NEW
 gcry_strdup                       NEW
 gcry_sexp_create                  NEW
 gcry_sexp_new                     NEW
 gcry_set_progress_handler         NEW
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 Noteworthy changes in version 1.1.6 (2002-02-07)
 ------------------------------------------------
 
   * Enhanced the S-expression conversion functions.
         
 Noteworthy changes in version 1.1.5 (2001-12-18)
 ------------------------------------------------
 
   * gcry_{cipher,md}_map_name are now able to map stringified object IDs.
 
   * New functions gcry_sexp_canon_len and gcry_cipher_mode_from_oid.
 
   * Closed some memory leaks.
 
 
 Noteworthy changes in version 1.1.4 (2001-08-03)
 ------------------------------------------------
 
   * Arcfour does now work.                   
 
   * Some minor fixes.
 
   * Added a first test program
 
   * Migrated to autoconf 2.52.
 
 
 Noteworthy changes in version 1.1.3 (2001-05-31)
 ------------------------------------------------
 
   * First release of Libgcrypt which is a result of splitting GnuPG
     into into libgcrypt and GnuPG.
 
 
 Copyright 2001, 2002, 2003, 2004, 2007, 2008 Free Software Foundation, Inc.
 
 This file is free software; as a special exception the author gives
 unlimited permission to copy and/or distribute it, with or without
 modifications, as long as this notice is preserved.
 
 This file is distributed in the hope that it will be useful, but
 WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
 implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/cipher/ChangeLog b/cipher/ChangeLog
index a026bad6..b3412f87 100644
--- a/cipher/ChangeLog
+++ b/cipher/ChangeLog
@@ -1,3684 +1,3694 @@
+2008-09-09  Werner Koch  <wk@g10code.com>
+
+	* hmac-tests.c (selftests_sha1): Add tests.
+	(selftests_sha224, selftests_sha384, selftests_sha512): Make up tests.
+
+	* hash-common.c, hash-common.h: New.
+	* sha1.c (selftests_sha1): Add 3 tests.
+	* sha256.c (selftests_sha256, selftests_sha224): Ditto.
+	* sha512.c (selftests_sha512, selftests_sha384): Ditto.
+
 2008-08-29  Werner Koch  <wk@g10code.com>
 
 	* pubkey.c (gcry_pk_get_keygrip): Remove the special case for RSA
 	and check whether a custom computation function has been setup.
 	* rsa.c (compute_keygrip): New.
 	(_gcry_pubkey_extraspec_rsa): Setup this function.
 	* ecc.c (compute_keygrip): New.
 	(_gcry_pubkey_extraspec_ecdsa): Setup this function.
 
 2008-08-28  Werner Koch  <wk@g10code.com>
 
 	* cipher.c (cipher_decrypt, cipher_encrypt): Return an error if
 	mode NONE is used.
 	(gcry_cipher_open): Allow mode NONE only with a debug flag set and
 	if not in FIPS mode.
 
 2008-08-26  Werner Koch  <wk@g10code.com>
 
 	* pubkey.c (pubkey_generate): Add arg KEYGEN_FLAGS.
 	(gcry_pk_genkey): Implement new parameter "transient-key" and
 	pass it as flags to pubkey_generate.
 	(pubkey_generate): Make use of an ext_generate function.
 	* rsa.c (generate): Add new arg transient_key and pass appropriate
 	args to the prime generator.
 	(_gcry_rsa_generate): Factor all code out to ...
 	(rsa_generate): .. new func with extra arg KEYGEN_FLAGS.
 	(_gcry_pubkey_extraspec_ecdsa): Setup rsa_generate.
 	* primegen.c (_gcry_generate_secret_prime) 
 	(_gcry_generate_public_prime): Add new arg RANDOM_LEVEL.
 
 2008-08-21  Werner Koch  <wk@g10code.com>
 
 	* primegen.c (_gcry_generate_secret_prime)
 	(_gcry_generate_public_prime): Use a constant macro for the random
 	level.
 	
 2008-08-19  Werner Koch  <wk@g10code.com>
 
 	* pubkey.c (sexp_elements_extract_ecc) [!USE_ECC]: Do not allow
 	allow "curve" parameter.
 
 2008-08-15  Werner Koch  <wk@g10code.com>
 
 	* pubkey.c (_gcry_pk_selftest): New.
 	* dsa.c (selftests_dsa, run_selftests): New.
 	* rsa.c (selftests_rsa, run_selftests): New.
 	* ecc.c (selftests_ecdsa, run_selftests): New.
 
 	* md.c (_gcry_md_selftest): New.
 	* sha1.c (run_selftests, selftests_sha1): New.
 	* sha256.c (selftests_sha224, selftests_sha256, run_selftests): New.
 	* sha512.c (selftests_sha384, selftests_sha512, run_selftests): New.
 
 	* des.c (selftest): Remove static variable form selftest.
 	(des_setkey): No on-the-fly self test in fips mode.
 	(tripledes_set3keys): Ditto.
 
 	* cipher.c (_gcry_cipher_setkey, _gcry_cipher_setiv): 
 
 	* dsa.c (generate): Bail out in fips mode if NBITS is less than	1024.
 	* rsa.c (generate): Return an error code if the the requested size
 	is less than 1024 and we are in fpis mode.
 	(_gcry_rsa_generate): Take care of that error code.
 
 	* ecc.c (generate_curve): In fips mode enable only NIST curves.
 
 	* cipher.c (_gcry_cipher_selftest): New.
 
 	* sha512.c (_gcry_digest_extraspec_sha384)
 	(_gcry_digest_extraspec_sha512): New.
 	* sha256.c (_gcry_digest_extraspec_sha224)
 	(_gcry_digest_extraspec_sha256): New.
 	* sha1.c (_gcry_digest_extraspec_sha1): New.
 	* ecc.c (_gcry_pubkey_extraspec_ecdsa): New.
 	* dsa.c (_gcry_pubkey_extraspec_dsa): New.
 	* rsa.c (_gcry_pubkey_extraspec_rsa): New.
 	* rijndael.c (_gcry_cipher_extraspec_aes)
 	(_gcry_cipher_extraspec_aes192, _gcry_cipher_extraspec_aes256): New.
 	* des.c (_gcry_cipher_extraspec_tripledes): New.
 
 	* cipher.c (gcry_cipher_register): Rename to _gcry_cipher_register.
 	Add arg EXTRASPEC.
 	(dummy_extra_spec): New.
 	(cipher_table_entry): Add extraspec field.
 	* md.c (_gcry_md_register): Rename to _gcry_md_register.  Add
 	arg EXTRASPEC.
 	(dummy_extra_spec): New.
 	(digest_table_entry): Add extraspec field.
 	* pubkey.c (gcry_pk_register): Rename to _gcry_pk_register.  Add
 	arg EXTRASPEC.
 	(dummy_extra_spec): New.
 	(pubkey_table_entry): Add extraspec field.
 
 	* ac.c: Let most public functions return GPG_ERR_UNSUPPORTED in
 	fips mode.
 
 	* pubkey.c (pubkey_table_entry): Add field FIPS_ALLOWED and mark
 	appropriate algorithms.
 	(dummy_generate, dummy_check_secret_key, dummy_encrypt) 
 	(dummy_decrypt, dummy_sign, dummy_verify, dummy_get_nbits): Signal
 	a fips error when used.
 	(gcry_pk_register): In fips mode do not allow to register new
 	algorithms.
 
 	* md.c (digest_table): Add field FIPS_ALLOWED and mark appropriate
 	algorithms.
 	(md_register_default): In fips mode register only fips algorithms.
 	(gcry_md_register): In fips mode do not allow to register new
 	algorithms.
 	(gcry_md_get): Signal a fips error if called.
 	(gcry_md_hash_buffer): Do not allow rmd160 when not in fips mode.
 	(md_start_debug): Disable in fips_mode.
 
 	* md.c (gcry_md_register_default): Rename to ..
 	(md_register_default): .. this.
 	(md_digest): Remove this commented fucntion.
 	* pubkey.c (gcry_pk_register_default): Rename to ..
 	(pk_register_default): .. this.
 
 	* cipher.c (cipher_table_entry): Add field FIPS_ALLOWED.
 	(gcry_cipher_register_default): Register only fips approved
 	algorithms.
 	(gcry_cipher_register): Do not allow to register new ciphers.
 	(cipher_setiv): Signal fips error.
 	
 	* cipher (gcry_cipher_register_default): Rename to ..
 	(cipher_register_default): .. this.
 	(REGISTER_DEFAULT_CIPHERS): Adjust for that change.
 
 2008-07-05  Werner Koch  <wk@g10code.com>
 
 	* random-daemon.c, random.h, rndhw.c, rndunix.c, rand-internal.h
 	* random.c, rndegd.c, rndlinux.c, rndw32.c: Move to ../cipher.
 	* Makefile.am: Remove random stuff.
 
 2008-06-24  Szakats Istvan <szaki.ms@gmail.com>  (wk)
 
 	* ac.c (_gcry_ac_key_destroy, _gcry_ac_key_pair_generate): Relase
 	some more memory.
 
 2008-04-22  Werner Koch  <wk@g10code.com>
 
 	* rijndael.c (_gcry_aes_cfb_enc, _gcry_aes_cbc_enc) 
 	(_gcry_aes_cfb_dec, _gcry_aes_cbc_dec): Use Padlock if possible.
 
 2008-04-18  Werner Koch  <wk@g10code.com>
 
 	* sha1.c (transform_aligned): Remove.  That is will obviosuly not
 	work because we need a scratch working area and our internal API
 	does not allow to modify the buffers.
 
 	* rijndael.c: Factor tables out to ..
 	* rijndael-tables.h: .. new.
 
 	* ac.c (ac_data_extract): Make static.
 
 	* camellia.h [HAVE_CONFIG_H]: Include config.h.
 
 	* rndw32.c (registry_poll): Only print the performance data
 	problem warning once.  Suggested by Simon Josefsson.
 
 2008-03-19  Werner Koch  <wk@g10code.com>
 
 	* cipher.c (gcry_cipher_open) [USE_AES]: Init bulk encryption only
 	if requested.  Suggested by Dirk Stoecker.
 
 2008-03-18  Werner Koch  <wk@g10code.com>
 
 	* sha1.c: Include stdint.h.
 	(transform): Add arg NBLOCKS so that we can work on more than one
 	block and avoid updates of the chaining variables.  Changed all
 	callers to use 1.
 	(sha1_write): Replace loop around transform.
 	(transform_aligned) [WORDS_BIGENDIAN]: New.
 	(TRANSFORM): New macro to replace all direct calls of transform.
 
 2008-03-17  Werner Koch  <wk@g10code.com>
 
 	* rijndael.c (_gcry_aes_cfb_dec): New.
 	(do_encrypt): Factor code out to ..
 	(do_encrypt_aligned): .. New.
 	(_gcry_aes_cfb_enc, _gcry_aes_cfb_dec): Use new function.
 	(do_decrypt): Factor code out to ..
 	(do_decrypt_aligned): .. new.
 	(_gcry_aes_cbc_enc, _gcry_aes_cbc_dec): New.
 	* cipher.c (struct gcry_cipher_handle): Put field IV into new
 	union U_IV to enforce proper alignment.  Change all users.
 	(do_cfb_decrypt): Optimize.
 	(do_cbc_encrypt, do_cbc_decrypt): Optimize.
 
 2008-03-15  Werner Koch  <wk@g10code.com>
 
 	* rijndael.c (_gcry_aes_cfb_enc): New.
 	* cipher.c (struct gcry_cipher_handle): Add field ALGO and BULK.
 	(gcry_cipher_open): Set ALGO and BULK.
 	(do_cfb_encrypt): Optimize.
 
 2008-02-18  Werner Koch  <wk@g10code.com>
 
 	* rsa.c (_gcry_rsa_verify) [IS_DEVELOPMENT_VERSION]: Print
 	intermediate results.
 
 2008-01-08  Werner Koch  <wk@g10code.com>
 
 	* random.c (add_randomness): Do not just increment
 	POOL_FILLED_COUNTER but update it by the actual amount of data.
 
 2007-12-13  Werner Koch  <wk@g10code.com>
 
 	* pubkey.c (sexp_data_to_mpi): Support SHA-224.
 
 2007-12-05  Werner Koch  <wk@g10code.com>
 
 	* rijndael.c (USE_PADLOCK): Depend on ENABLE_PADLOCK_SUPPORT.
 	* rndhw.c (USE_PADLOCK): Ditto
 
 	* rsa.c (secret): Fixed condition test for using CRT.  Reported by
 	Dean Scarff.  Fixes bug#864.
 	(_gcry_rsa_check_secret_key): Return an erro if the optional
 	parameters are missing.
 	* pubkey.c (sexp_elements_extract): Add arg ALGO_NAME. Changed all
 	callers to pass NULL. Add hack to allow for optional RSA
 	parameters.
 	(sexp_to_key): Pass algo name to sexp_elements_extract.
 
 2007-12-03  Werner Koch  <wk@g10code.com>
 
 	* random.c (gcry_random_add_bytes): Implement it.
 	* rand-internal.h (RANDOM_ORIGIN_EXTERNAL): New.
 
 2007-11-30  Werner Koch  <wk@g10code.com>
 
 	* rndhw.c: New.
 	* rndlinux.c (_gcry_rndlinux_gather_random): Try to read 50%
 	directly from the hwrng.
 	* random.c (do_fast_random_poll): Also run the hw rng fast poll.
 	(_gcry_random_dump_stats): Tell whether the hw rng failed.
 
 2007-11-29  Werner Koch  <wk@g10code.com>
 
 	* rijndael.c (USE_PADLOCK): Define new macro used for ia32.
 	(RIJNDAEL_context) [USE_PADLOCK]: Add fields USE_PADLOCK and
 	PADLOCK_KEY.
 	(do_setkey) [USE_PADLOCK]: Enable padlock if available for 128 bit
 	AES.
 	(do_padlock) [USE_PADLOCK]: New.
 	(rijndael_encrypt, rijndael_decrypt) [USE_PADLOCK]: Divert to
 	do_padlock.
 	* cipher.c (cipher_context_alignment_t): New.  Use it in this
 	module in place of PROPERLY_ALIGNED_TYPE.
 	(NEED_16BYTE_ALIGNED_CONTEXT): Define macro for ia32.
 	(struct gcry_cipher_handle): Add field HANDLE_OFFSET.
 	(gcry_cipher_open): Take care of increased alignment requirements.
 	(gcry_cipher_close): Ditto.
 
 2007-11-28  Werner Koch  <wk@g10code.com>
 
 	* sha256.c (asn224): Fixed wrong template.  It happened due to a
 	bug in RFC4880.  SHA-224 is not in the stable version of libgcrypt
 	so the consequences are limited to users of this devel version.
 
 2007-10-31  Werner Koch  <wk@g10code.com>
 
 	* ac.c (gcry_ac_data_new): Remove due to the visibility wrapper.
 	(gcry_ac_data_destroy, gcry_ac_data_copy, gcry_ac_data_length) 
 	(gcry_ac_data_set, gcry_ac_data_get_name, gcry_ac_data_get_index) 
 	(gcry_ac_data_to_sexp, gcry_ac_data_from_sexp) 
 	(gcry_ac_data_clear, gcry_ac_io_init, gcry_ac_open) 
 	(gcry_ac_close, gcry_ac_key_init, gcry_ac_key_pair_generate) 
 	(gcry_ac_key_pair_extract, gcry_ac_key_destroy) 
 	(gcry_ac_key_pair_destroy, gcry_ac_key_data_get) 
 	(gcry_ac_key_test, gcry_ac_key_get_nbits, gcry_ac_key_get_grip) 
 	(gcry_ac_data_encrypt, gcry_ac_data_decrypt, gcry_ac_data_sign) 
 	(gcry_ac_data_verify, gcry_ac_data_encode, gcry_ac_data_decode) 
 	(gcry_ac_mpi_to_os, gcry_ac_mpi_to_os_alloc, gcry_ac_os_to_mpi) 
 	(gcry_ac_data_encrypt_scheme, gcry_ac_data_decrypt_scheme) 
 	(gcry_ac_data_sign_scheme, gcry_ac_data_verify_scheme) 
 	(gcry_ac_io_init_va): Ditto.
 	(gcry_ac_id_to_name, gcry_ac_name_to_id): Remove as these
 	deprecated functions are now implemented by visibility.c.
 
 2007-10-26  Werner Koch  <wk@g10code.com>
 
 	* rndw32.c: Disable debug flag.
 
 2007-10-25  Werner Koch  <wk@g10code.com>
 
 	* rndw32.c: Updated from current cryptlib snapshot and modified
 	for our use.  Removed support from pre NT systems.
 	(slow_gatherer_windows95): Remove.
 	(_gcry_rndw32_gather_random): Require an NT platform.
 	(init_system_rng, read_system_rng, read_mbm_data): New.
 	(slow_gatherer_windowsNT): Rename to ...
 	(slow_gatherer): .. this.  Read system RNG and MBM.
 	(registry_poll): New with code factored out from slow_gatherer.
 
 2007-08-23  Werner Koch  <wk@g10code.com>
 
 	* random.c (pool_filled_counter): New.
 	(add_randomness): Use it.
 
 2007-08-22  Werner Koch  <wk@g10code.com>
 
 	* rndw32.c, rndunix.c: Switched to LGPL.
 
 2007-05-30  Werner Koch  <wk@g10code.com>
 
 	* camellia.h, camellia.c: Replace by new LGPL version and adjusted
 	camellia.h.
 
 2007-05-09  Marcus Brinkmann  <marcus@g10code.de>
 
 	* ac.c (_gcry_ac_io_init_va, _gcry_ac_io_write, _gcry_ac_io_read):
 	Adjust users of gcry_ac_io_t because union is not anonymous
 	anymore.
 
 2007-05-02  Werner Koch  <wk@g10code.com>
 
 	* camellia-glue.c (camellia_setkey, camellia_encrypt)
 	(camellia_decrypt): Recalculated used stack size in called
 	functions.
 	* camellia.h: Redefine external symbols.
 
 2007-05-02  David Shaw  <dshaw@jabberwocky.com>
 
 	* Makefile.am, cipher.c: Add Camellia.
 
 	* camellia-glue.c: New.  The necessary glue to interface libgcrypt
 	to the stock NTT Camellia distribution.
 
 	* camellia.h, camellia.c: The stock NTT Camellia distribution
 	(GPL).
 
 2007-04-30  David Shaw  <dshaw@jabberwocky.com>
 
 	* cipher.c: Use #if instead of #ifdef as configure defines the
 	USE_cipher defines as 0 for disabled.
 
 2007-04-30  Werner Koch  <wk@g10code.com>
 
 	* rndegd.c (_gcry_rndegd_set_socket_name): New.
 
 2007-04-30  Marcus Brinkmann  <marcus@g10code.de>
 
 	* ecc.c (ec2os): Fix relocation of short numbers.
 
 	* ecc.c (generate_key): Do not allocate D, which will be allocated
 	by GEN_K.  Remove G.  Fix test if g_x, g_y resp. q_x, q_y are
 	requested.
 	(_gcry_ecc_generate): Release unneeded members of SK.
 	* pubkey.c (sexp_to_key): Release NAME.
 
 2007-04-28  Marcus Brinkmann  <marcus@g10code.de>
 
 	* ac.c (gcry_ac_mpi): Remove member NAME_PROVIDED.
 	(ac_data_mpi_copy, _gcry_ac_data_set, _gcry_ac_data_get_name)
 	(_gcry_ac_data_get_index, ac_data_construct): Adjust handling of
 	NAME accordingly.
 
 2007-04-20  Werner Koch  <wk@g10code.com>
 
 	* ecc.c (domain_parms): Add standard brainpool curves.
 
 2007-04-18  Werner Koch  <wk@g10code.com>
 
 	* ecc.c (generate_curve): Implement alias mechanism.
 
 	* pubkey.c (sexp_elements_extract_ecc): New.
 	(sexp_to_key): Add special case for ecc.
 	(sexp_to_key, sexp_to_sig, sexp_to_enc, gcry_pk_genkey): Replace
 	name_terminated stuff by a call to _gcry_sexp_nth_string.
 	(gcry_pk_get_keygrip): Ditto.
 
 2007-04-16  Werner Koch  <wk@g10code.com>
 
 	* ecc.c (_gcry_ecc_generate): Renamed DUMMY to CURVE and use it.
 
 2007-04-13  Marcus Brinkmann  <marcus@g10code.de>
 
 	* ac.c (ac_data_construct): Cast const away to suppress compiler
 	warning.
 
 	* ecc.c (ecc_generate): Avoid compiler warning for unused argument
 	DUMMY.
 	(ecc_verify): Avoid compiler warning for unused arguments CMP and
 	OPAQUEV.
 
 2007-04-06  Werner Koch  <wk@g10code.com>
 
 	* sha1.c (oid_spec_sha1): Add another oid from X9.62.
 
 2007-03-28  Werner Koch  <wk@g10code.com>
 
 	* pubkey.c (gcry_pk_genkey): Do not issue misc-key-info if it is
 	empty.
 	(gcry_pk_genkey): New parameter "curve".
 
 	* ecc.c: Entirely rewritten with only a few traces of the old
 	code left.
 	(_gcry_ecc_generate): New.
 	(generate_key) New arg NAME.
 	(generate_curve): Ditto.  Return actual number of NBITS.
 
 2007-03-26  Werner Koch  <wk@g10code.com>
 
 	* pubkey.c (gcry_pk_genkey): Increase size of SKEY array and add a
 	runtime bounds check.
 
 2007-03-23  Werner Koch  <wk@g10code.com>
 
 	* ecc.c (ecc_ctx_init, ecc_ctx_free, ecc_mod, ecc_mulm): New.
 	(duplicate_point, sum_points, escalar_mult): Don't use a
 	copy of base->p.  Replaced all mpi_mulm by ecc_mulm so that we can
 	experiment with different algorithms.
 	(generate_key, check_secret_key, sign, verify): Initialize a
 	computation context for use by ecc_mulm.
 
 2007-03-22  Werner Koch  <wk@g10code.com>
 
 	* pubkey.c (pubkey_table): Initialize ECC.
 	* Makefile.am (EXTRA_libcipher_la_SOURCES): Add ecc.c.
 	* ecc.c: New. Heavily reformatted and changed for use in libgcrypt.
 	(point_init): New.
 	(escalar_mult): Make arg R the first arg to be similar to the mpi
 	functions.
 	(duplicate_point): Ditto
 	(sum_points): Ditto
 	(sign, verify): Remove unneeded copy operations.
 	(sum_points): Removed memory leaks and optimized some compares.
 	(verify): Simplified input check.
 
 2007-03-14  Werner Koch  <wk@g10code.com>
 
 	* random.c (MASK_LEVEL): Removed macro as it was used only at one
 	place.  Open coded it there.
 	(gcry_randomize, _gcry_update_random_seed_file)
 	(_gcry_fast_random_poll): Factor lock code out to ..
 	(lock_pool, unlock_pool): .. new.
 	(initialize): Look the pool while allocating. 
 	(read_random_source, do_fast_random_poll): Moved intialization to ...
 	(initialize): .. here.
 	(_gcry_enable_quick_random_gen): No more need for initialization.
 	(is_initialized):  Moved this global flag to ..
 	(initialize): .. here and changed all users to unconditionally call
 	initialize.
 	(add_randomness): Remove initalization here.  It simply can't
 	happen. 
 
 	* random.c (enum random_origins): Moved to ..
 	* rand-internal.h: .. here.
 	* rndunix.c (_gcry_rndunix_gather_random): Use enum in prototype
 	for ORIGIN and renamed REQUESTOR to ORIGIN.
 	* rndegd.c (_gcry_rndegd_gather_random): Ditto.
 	* rndlinux.c (_gcry_rndlinux_gather_random): Ditto.
 	* rndw32.c (_gcry_rndw32_gather_random): Ditto.
 	(_gcry_rndw32_gather_random_fast): Ditto.
 
 2007-03-13  Werner Koch  <wk@g10code.com>
 
 	* random.c (enum random_origins): New.
 	(add_randomness): Renamed arg SOURCE to ORIGIN.
 	(read_random_source): Renamed arg REQUESTOR to ORIGIN.
 	(getfnc_gather_random): Removed static variable because this
 	function is only called one and thus we don't need this
 	optimization.
 	(_gcry_quick_random_gen): Removed and replaced by..
 	(_gcry_enable_quick_random_gen): .. this.  It is onlyu used to
 	enable it and it does not make sense to disable it later. Changed
 	the only one caller too.
 	(get_random_bytes): Removed.
 	(gcry_random_bytes, gcry_random_bytes_secure): Implement in terms
 	of gcry_randomize.
 	* random-daemon.c (_gcry_daemon_get_random_bytes): Removed.
 
 2007-02-23  Werner Koch  <wk@g10code.com>
 
 	* elgamal.c (generate): Removed unused variable TEMP.
 	(test_keys): New arg NODIE.
 	(generate_using_x, _gcry_elg_generate_using_x): New.
 	* pubkey.c (pubkey_generate): New arg XVALUE and direct call to
 	the new elgamal generate fucntion.
 	(gcry_pk_genkey): Parse the new "xvalue" tag.
 
 2007-02-22  Werner Koch  <wk@g10code.com>
 
 	* pubkey.c (sexp_data_to_mpi): Handle dynamically allocated
 	algorithms.  Suggested by Neil Dunbar.  Fixes bug#596.
 
 	* rndw32.c (_gcry_rndw32_gather_random_fast): Make it return void.
 
 	* cipher.c (gcry_cipher_algo_name): Simplified.
 
 	* random.c: Use the daemon only if compiled with USE_RANDOM_DAEMON. 
 
 	* Makefile.am (libcipher_la_SOURCES): Build random-daemon support
 	only if requested.
 
 2007-02-21  Werner Koch  <wk@g10code.com>
 
 	* random.c (rndpool, keypool): Make unsigned.
 	(mix_pool): Change char* variables to unsigned char*.
 	(gcry_randomize): Make arg BUFFER a void*.
 	(gcry_create_nonce): Ditto.
 
 	* rmd160.c (gcry_rmd160_mixblock): Make BUFFER a void*.
 	(_gcry_rmd160_hash_buffer): Make OUTBUF and BUFFER void*.
 	* sha1.c (_gcry_sha1_hash_buffer): Ditto.
 
 	* cipher.c (gcry_cipher_encrypt, cry_cipher_decrypt): Change
 	buffer args to void*.
 	(gcry_cipher_register): Make ALGORITHM_ID a int *.
 
 	* md.c (md_start_debug): Make SUFFIX a const char*.  Use snprintf.
 	(gcry_md_debug): New.
 	(gcry_md_ctl): Changed arg BUFFER from unsigned char*.
 
 	* md.c (md_write): Make INBUF a const void*.
 	(gcry_md_write): Remove needless cast.
 	* crc.c (crc32_write): Make INBUF a const void*
 	(update_crc32, crc24rfc2440_write): Ditto.
 	* sha512.c (sha512_write, transform): Ditto.
 	* sha256.c (sha256_write, transform): Ditto.
 	* rmd160.c (rmd160_write, transform): Ditto.
 	* md5.c (md5_write, transform): Ditto.
 	* md4.c (md4_write, transform): Ditto.
 	* sha1.c (sha1_write, transform): Ditto.
 
 	* tiger.c (tiger_write, transform): Ditto.
 	* whirlpool.c (whirlpool_write, whirlpool_add, transform): Ditto.
 
 	* elgamal.c (elg_names): Change to a const*.
 	* dsa.c (dsa_names): Ditto.
 	* rsa.c (rsa_names): Ditto.
 	* pubkey.c (gcry_pk_lookup_func_name): Make ALIASES a const.
 
 2007-02-20  Werner Koch  <wk@g10code.com>
 
 	* rndlinux.c (open_device): Remove unsused arg MINOR.
 
 2007-01-30  Werner Koch  <wk@g10code.com>
 
 	* sha256.c (oid_spec_sha256): Add alias from pkcs#1.
 	* sha512.c (oid_spec_sha512): Ditto.
 	(oid_spec_sha384): Ditto.
 
 2006-12-18  Werner Koch  <wk@g10code.com>
 
 	* rndlinux.c (set_cloexec_flag): New.
 	(open_device): Set close-on-exit flags.  Suggested by Max
 	Kellermann.  Fixes Debian#403613.
 
 	* Makefile.am (AM_CPPFLAGS, AM_CFLAGS): Splitted and merged
 	Moritz' changes.
 	(INCLUDES): Removed.
 
 2006-11-30  Werner Koch  <wk@g10code.com>
 
 	* serpent.c (byte_swap_32): Remove trailing semicolon.
 
 2006-11-15  Werner Koch  <wk@g10code.com>
 
 	* Makefile.am (INCLUDES): Include ../src/
 
 2006-11-03  Werner Koch  <wk@g10code.com>
 
 	* random.c [HAVE_GETTIMEOFDAY]: Included sys/time.h and not
 	sys/times.h.  Reported by Rafaël Carré.
 
 2006-11-05  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am (AM_CFLAGS): Added -I$(top_builddir)/src so that the
 	new gcrypt.h is used, not the one installed in the system.
 
 2006-10-25  Werner Koch  <wk@g10code.com>
 
 	* primegen.c (prime_generate_internal): Tweaked use of secure
 	memory and entropy use. Safe unused primes from the pool. Allocate
 	at least a pool of 30.
 	(save_pool_prime, get_pool_prime): New.
 
 2006-10-23  Werner Koch  <wk@g10code.com>
 
 	* ac.c (_gcry_ac_data_from_sexp): Reset sexp_tmp for failsafe
 	means.  Release sexp_cur if needed.  Reported by Dirk Stoecker.
 
 	* pubkey.c (pubkeys_registered_lock): Intialized it.  It is not
 	 realy needed because this is a mere initialization to 0 anyway.
 	 Noted by Victor Stinner.
 
 2006-10-17  Werner Koch  <wk@g10code.com>
 
 	* dsa.c (_gcry_dsa_generate2): New.
 	(generate): New arg QBITS.  Add sanity checks for reasonable qbits
 	and nbits.
 	* pubkey.c (gcry_pk_genkey): Parse an qbits element.
 	(pubkey_generate): New arg QBITS.  Pass it to the DSA generation.
 
 2006-10-05  Werner Koch  <wk@g10code.com>
 
 	* md.c (gcry_md_algo_info) <get_asnoid>: Check that the algo is
 	available.
 
 2006-10-04  David Shaw  <dshaw@jabberwocky.com>  (wk)
  
 	* tiger.c (round): Rename to tiger_round as gcc 4 has a built-in
 	round function that this conflicts with.
  
 2006-09-11  Werner Koch  <wk@g10code.com>
 
 	* rndw32.c (slow_gatherer_windowsNT): While adding data use the
 	size of the diskPerformance and not its address. Has been fixed in
 	GnuPG more than a year ago.  Noted by Lee Fisher.
 
 2006-08-30  Werner Koch  <wk@g10code.com>
 
 	* pubkey.c (sexp_data_to_mpi): Need to allow "ripemd160" here as
 	this is the canonical name.
 
 2006-08-29  Hye-Shik Chang <perky@FreeBSD.org>  (wk)
 
 	* seed.c: New.
 
 2006-08-03  Werner Koch  <wk@g10code.com>
 
 	* random-daemon.c (_gcry_daemon_initialize_basics): Don't
 	initialize the socket.  Remove arg SOCKETNAME.
 	(connect_to_socket): Make sure that daemon is set to -1 on error.
 	(call_daemon): Initialize the socket on the first call.
 	(_gcry_daemon_randomize, _gcry_daemon_get_random_bytes) 
 	(_gcry_daemon_create_nonce): New arg SOCKETNAME.
 	* random.c (initialize): Call new daemon initializator.
 	(get_random_bytes, gcry_randomize, gcry_create_nonce): Pass socket
 	name to daemon call and reset allow_daemon on failure.
 
 2006-07-26  Werner Koch  <wk@g10code.com>
 
 	* rmd160.c (_gcry_rmd160_mixblock): Add cast to transform call.
 
 	* blowfish.c (selftest): Cast string to usnigned char*.
 
 	* primegen.c (prime_generate_internal): Cast unsigned/char*
 	mismatch in calling m_out_of_n.
 	(is_prime): Changed COUNT to unsigned int *.
 
 	* ac.c (_gcry_ac_data_copy): Initialize DATA_MPIS.
 
 	* random.c (gcry_create_nonce): Update the pid after a fork.
 	Reported by Uoti Urpala.
 
 2006-07-04  Marcus Brinkmann  <marcus@g10code.de>
 
 	* sha512.c: Fix typo in copyright notice.
 
 2006-06-21  Werner Koch  <wk@g10code.com>
 
 	* rsa.c (_gcry_rsa_generate): Replace xcalloc by calloc.
 	* pubkey.c (gcry_pk_encrypt, gcry_pk_sign): Ditto.
 	(sexp_to_key, sexp_to_sig, sexp_to_enc, gcry_pk_encrypt) 
 	(gcry_pk_sign, gcry_pk_genkey, gcry_pk_get_keygrip): Ditto. 
 	* md.c (md_copy): Ditto.
 	
 2006-04-22  Moritz Schulte  <moritz@g10code.com>
 
 	* random-daemon.c (_gcry_daemon_initialize_basics): New argument:
 	SOCKETNAME.  Passing on to connect_to_socket() if non-NULL.
 	(connect_to_socket, writen, readn, call_daemon): New functions.
 	(_gcry_daemon_randomize, _gcry_daemon_get_random_bytes) 
 	(_gcry_daemon_create_nonce): Call call_daemon().
 	(RANDOM_DAEMON_SOCKET): New symbol.
 	(daemon_socket): New static variable.
 
 	* random.h (_gcry_daemon_initialize_basics): New parameter:
 	SOCKETNAME.
 	(_gcry_set_random_daemon_socket): New declaration.
 
 	* random.c (initialize_basics): Pass DAEMON_SOCKET_NAME to
 	_gcry_daemon_initialize_basics.
 	(_gcry_set_random_daemon_socket): New function, setting
 	DAEMON_SOCKET_NAME.
 
 2006-04-01  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c (eme_pkcs_v1_5_encode): Use KEY_SIZE directly, no need to
 	call gcry_ac_key_get_nbits.
 	(eme_pkcs_v1_5_decode): Likewise.
 	(ac_es_dencode_prepare_pkcs_v1_5): Fill options_em structure with
 	key_size.
 	(_gcry_ac_data_dump, gcry_ac_data_dump): New functions.
 	(_gcry_ac_data_to_sexp, _gcry_ac_data_from_sexp): More or less
 	rewritten; changed S-Expression format so that it matches the one
 	used in pubkey.c.
 
 2006-03-15  Werner Koch  <wk@g10code.com>
 
 	* random-daemon.c: New.
 	* random.c (_gcry_use_random_daemon): New.
 	(get_random_bytes, gcry_randomize, gcry_create_nonce): Try
 	diverting to the daemon functions.
 
 2006-03-14  Werner Koch  <wk@g10code.com>
 
 	* random.c (lock_seed_file): New.
 	(read_seed_file, _gcry_update_random_seed_file): Use it.
 
 	* random.c (gcry_create_nonce):  Detect a fork and re-seed.
 	(read_pool): Fixed the fork detection; it used to work only for
 	multi-threaded processes.
 
 2006-03-12  Brad Hards  <bradh@frogmouth.net>  (wk)
 
 	* md.c (md_open): Use new variable macpads_Bsize instead of
 	hardwiring the block size.  Changed at all places.
 
 2006-03-10  Brad Hards  <bradh@frogmouth.net>  (wk, patch 2005-04-22)
 
 	* md.c, sha256.c:  Add support for SHA-224.
 	(sha224_init): New.
 	
 2006-01-18  Brad Hards  <bradh@frogmouth.net>  (wk 2006-03-07)
 
 	* cipher.c (cipher_encrypt, cipher_decrypt, do_ofb_encrypt)
 	(do_ofb_decrypt, gcry_cipher_open): Implement Output Feedback Mode.
 
 2005-11-02  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (gcry_pk_algo_name): Return "?" instead of NULL for
 	unknown algorithm IDs.
 	* cipher.c (cipher_algo_to_string): Likewise.
 
 2005-11-01  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (gcry_pk_algo_info): Don't forget to break after switch
 	case.
 
 2005-09-19  Werner Koch  <wk@g10code.com>
 
 	* dsa.c (generate): Add preliminary support for 2 and 4 keys.
 	Return an error code if the key size is not supported.
 	(_gcry_dsa_generate): Return an error.
 
 2005-08-22  Werner Koch  <wk@g10code.com>
 
 	* primegen.c (check_prime): New arg RM_ROUNDS.
 	(prime_generate_internal): Call it here with 5 rounds as used
 	before.
 	(gcry_prime_check): But here with 64 rounds.
 	(is_prime): Make sure never to use less than 5 rounds.
 
 2005-04-16  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c (_gcry_ac_init): New function.
 
 2005-04-12  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c (_gcry_ac_io_write, _gcry_ac_io_read): Initialize err to
 	make the compiler happy.
 	Always use errno, now that gcry_malloc() is guaranteed to set
 	errno on failure.
 	(_gcry_ac_data_to_sexp): Don't forget to goto out after error in
 	loop.
 	(_gcry_ac_data_to_sexp): Remove unused variable: mpi_list;
 	(_gcry_ac_data_to_sexp): Always deallocate sexp_buffer.
 	(_gcry_ac_data_from_sexp): Don't forget to initialize data_set_new.
 	(_gcry_ac_data_from_sexp): Handle special case, which is
 	necessary, since gcry_sexp_nth() does not distinguish between
 	"element does not exist" and "element is the empty list".
 	(_gcry_ac_io_init_va): Use assert to make sure that mode and type
 	are correct.
 	Use gcry_error_t types where gcry_err_code_t types have been used
 	before.
 
 2005-04-11  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c (_gcry_ac_data_sign_scheme): Don't forget to initialize
 	buffer.
 
 	* whirlpool.c: New file.
 	* md.c (digest_table): Add whirlpool.
 	* Makefile.am (EXTRA_libcipher_la_SOURCES): Added: whirlpool.c.
 
 2005-03-30  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c (_gcry_ac_data_from_sexp): Use length of SEXP_CUR, not
 	length of SEXP; do not forget to set SEXP_TMP to NULL after it has
 	been released.
 
 	(struct gcry_ac_mpi): New member: name_provided.
 	(_gcry_ac_data_set): Rename variable `name_final' to `name_cp';
 	remove const qualifier; change code to not cast away const
 	qualifiers; use name_provided member as well.
 	(_gcry_ac_data_set, _gcry_ac_data_get_name): Use name_provided
 	member of named mpi structure.
 
 	(gcry_ac_name_to_id): Do not forget to initialize err.
 	(_gcry_ac_data_get_index): Do not forget to initialize mpi_return;
 	use gcry_free() instead of free(); remove unnecessary cast; rename
 	mpi_return and name_return to mpi_cp and name_cp; adjust code.
 	(ac_data_mpi_copy): Do not cast away const qualifier.
 	(ac_data_values_destroy): Likewise.
 	(ac_data_construct): Likewise.
 
 	(ac_data_mpi_copy): Initialize flags to GCRY_AC_FLAG_DEALLOC.
 	(ac_data_extract): Use GCRY_AC_FLAG_DEALLOC instead of
 	GCRY_AC_FLAG_COPY.
 
 	(_gcry_ac_io_init_va, _gcry_ac_io_init, gcry_ac_io_init)
 	(gcry_ac_io_init_va, _gcry_ac_io_write, _gcry_ac_io_read)
 	(_gcry_ac_io_read_all, _gcry_ac_io_process): New functions.
 	(gry_ac_em_dencode_t): Use gcry_ac_io_t in prototype instead of
 	memroy strings directly; adjust encode/decode functions to use io
 	objects.
 	(emsa_pkcs_v1_5_encode_data_cb): New function ...
 	(emsa_pkcs_v1_5_encode): ... use it here.
 	(ac_data_dencode): Use io objects.
 	(_gcry_ac_data_encode, _gcry_ac_data_decode, gcry_ac_data_encode)
 	(gcry_ac_data_decode): Likewise.
 	(_gcry_ac_data_encrypt_scheme, gcry_ac_data_encrypt_scheme)
 	(_gcry_ac_data_decrypt_scheme, gcry_ac_data_decrypt_scheme)
 	(_gcry_ac_data_sign_scheme, gcry_ac_data_sign_scheme)
 	(_gcry_ac_data_verify_scheme, gcry_ac_data_verify_scheme):
 	Likewise.
 
 2005-03-23  Werner Koch  <wk@g10code.com>
 
 	* rndw32.c (_gcry_rndw32_gather_random_fast): While adding data
 	use the size of the object and not the one of its address.  Bug
 	reported by Sascha Kiefer.
 
 2005-03-19  Moritz Schulte  <moritz@g10code.com>
 
 	* cipher.c (do_cbc_encrypt): Be careful to not overwrite data,
 	which is to be used later on.  This happend, in case CTS is
 	enabled and OUTBUF is equal to INBUF.
 
 2005-02-25  Werner Koch  <wk@g10code.com>
 
 	* pubkey.c (gcry_pk_get_keygrip): Allow for shadowed-private-key.
 
 2005-02-13  Moritz Schulte  <moritz@g10code.com>
 
 	* serpent.c: Updated from 1.2 branch:
 
 	s/u32_t/u32/ and s/byte_t/byte/.  Too match what we have always
 	used and are using in all other files too
 	(serpent_test): Moved prototype out of a fucntion.
 
 2005-02-07  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c: Major parts rewritten.
 	* pubkey.c (_gcry_pk_get_elements): New function.
 
 2004-12-09  Werner Koch  <wk@g10code.com>
 
 	* serpent.c (serpent_setkey): Moved prototype of serpent_test to
 	outer scope.
 
 2004-09-11  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (pubkey_table): Added an alias entry for GCRY_PK_ELG_E.
 
 2004-08-23  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c: Do not include <assert.h>.
 	* rndegd.c: Likewise.
 	* sha1.c: Likewise.
 	* rndunix.c: Likewise.
 	* rndlinux.c: Likewise.
 	* rmd160.c: Likewise.
 	* md5.c: Likewise.
 	* md4.c: Likewise.
 	* cipher.c: Likewise.
 	* crc.c: Likewise.
 	* blowfish.c: Likewise.
 
 	* pubkey.c (dummy_generate, dummy_check_secret_key)
 	(dummy_encrypt, dummy_decrypt, dummy_sign, dummy_verify): Return
 	err code GPG_ERR_NOT_IMPLEMENTED instead of aborting through
 	log_bug().
 	(dummy_get_nbits): Return 0 instead of aborting though log_bug().
 
 2004-08-19  Werner Koch  <wk@g10code.de>
 
 	* pubkey.c (sexp_data_to_mpi): Changed the zero random byte
 	substituting code to actually do clever things.  Thanks to
 	Matthias Urlichs for noting the implementation problem.
 
 2004-08-09  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (gcry_pk_sign): Fixed memory leak; fix provided by
 	Modestas Vainius.
 
 2004-07-16  Werner Koch  <wk@gnupg.org>
 
 	* rijndael.c (do_encrypt): Fix alignment problem.  Bugs found by
 	Matthias Urlichs.
 	(do_decrypt): Ditto.
 	(keySched, keySched2): Use 2 macros along with unions in the key
 	schedule context.
 
 2004-07-14  Moritz Schulte  <moritz@g10code.com>
 
 	* rsa.c (_gcry_rsa_decrypt): Don't forget to free "a".  Thanks to
 	Nikos Mavroyanopoulos.
 
 2004-05-09  Werner Koch  <wk@gnupg.org>
 
 	* random.c (read_pool): Mix the PID in to better protect after a
 	fork.
 
 2004-07-04  Moritz Schulte  <moritz@g10code.com>
 
 	* serpent.c: Use "u32_t" instead of "unsigned long", do not
 	declare S-Box variables as "register".  Fixes failure on
 	OpenBSD/sparc64, reported by Nikolay Sturm.
 
 2004-05-07  Werner Koch  <wk@gnupg.org>
 
 	* random.c (initialize): Factored out some code to ..
 	(initialize_basics): .. new function.
 	(_gcry_random_initialize): Just call initialize_basics unless the
 	new arg FULL is set to TRUE.
 	(_gcry_fast_random_poll): Don't do anything unless the random
 	system has been really initialized.
 
 2004-05-07  Moritz Schulte  <moritz@g10code.de>
 
 	* ac.c (gcry_ac_open): Do not dereference NULL pointer.  Reported
 	by Umberto Salsi.
 
 2004-02-20  Werner Koch  <wk@gnupg.org>
 
 	* primegen.c (check_prime): New args CB_FUNC and CB_ARG; call them
 	at different stages.  Pass these arguments through all callers.
 
 2004-02-06  Werner Koch  <wk@gnupg.org>
 
 	* des.c: Add a new OID as used by pkcs#12.
 
 	* rfc2268.c: New. Taken from libgcrypt. 
 	* cipher.c: Setup the rfc2268 algorithm.
 
 2004-01-25  Moritz Schulte  <mo@g10code.com>
 
 	* primegen.c (prime_generate_internal): Do not forget to free
 	`q_factor'; fixed by Brieuc Jeunhomme.
 	(prime_generate_internal): Do not forget to free `prime'.
 
 2004-01-14  Moritz Schulte  <mo@g10code.com>
 
 	* ac.c (gcry_ac_data_set): New argument: flags; slightly
 	rewritten.
 	(gcry_ac_data_get_name, gcry_ac_data_get_index): Likewise.
 	(gcry_ac_key_pair_generate): New argument: misc_data; modified
 	order of arguments.
 	(gcry_ac_key_test): New argument: handle.
 	(gcry_ac_key_get_nbits, gcry_ac_key_get_grip): Likewise.
 	Use GCRY_AC_FLAG_NO_BLINDING instead of
 	GCRY_AC_DATA_FLAG_NO_BLINDING.
 	(gcry_ac_mpi): New member: flags.
 	(gcry_ac_data_search, gcry_ac_data_add): Removed functions.
 
 2003-12-22  Werner Koch  <wk@gnupg.org>
 
 	* primegen.c (is_prime): Release A2.
 
 2003-12-19  Werner Koch  <wk@gnupg.org>
 
 	* md.c: Moved a couple of functions down below the data structure
 	definitions.
 	(struct gcry_md_context): New field ACTUAL_HANDLE_SIZE.
 	(md_open): Set it here.
 	(strcut gcry_md_list): New field ACTUAL_STRUCT_SIZE.
 	(md_enable): Set it here.
 	(md_close): Wipe the context memory.
 	secure memory.
 	* cipher.c (struct gcry_cipher_handle): New field ACTUAL_HANDLE_SIZE.
 	(gcry_cipher_open): Set it here.
 	(gcry_cipher_close): Use it to always wipe out the handle data.
 
 	* ac.c (gcry_ac_open): Make sure HANDLE gets initialized even when
 	the function is not successful.
 	(gcry_ac_close): Allow a NULL handle.
 	(gcry_ac_key_destroy, gcry_ac_key_pair_destroy): Ditto.
 	(gcry_ac_key_get_grip): Return INV_OBJ on error.
 
 	* primegen.c (prime_generate_internal): Fixed error code for
 	failed malloc.  Replaced the !err if chain by gotos.
 	(gcry_prime_group_generator): Remove the extra sanity check.
 
 	* md.c: Minor code and comment cleanups.
 
 2003-12-16  Werner Koch  <wk@gnupg.org>
 
 	* primegen.c (gen_prime): Doc fix.  Thanks to Newton Hammet.
 
 2003-12-11  Werner Koch  <wk@gnupg.org>
 
 	* rndunix.c (slow_poll): Don't use #warning but #error.
 
 	* rndegd.c: Changed indentation.
 	(my_make_filename): Removd the var_arg cruft becuase we
 	don't need it here.  Changed caller.  
 
 	* rndlinux.c: Changed indentation.
 	(open_device): Remove the superfluous stat call and clarify
 	comment.
 
 	* rsa.c: Changed indentation.
 	(secret): Use the standard algorithm if p, q and u are not
 	available.
 	(rsa_blind, rsa_unblind): Renamed from _gcry_rsa_blind,
 	_gcry_rsa_unblind and moved more to the top.
 
 	* md4.c: Changed indentation.  Removed unnecessary casts.
 	* md5.c, rmd160.c, sha1.c, tiger.c: Ditto.
 	* rijndael.c, twofish.c: Ditto.
 	* serpent.c: Removed unnecessary casts.
 	* sha256.c, sha512.c: Ditto.
 
 2003-12-09  Werner Koch  <wk@gnupg.org>
 
 	* dsa.c: Unified indentation style.
 	* elgamal.c: Ditto. 
 	* des.c (des_key_schedule): Code beautifications.
 	* blowfish.c: Changed indentation style.
 	* cast5.c (do_cast_setkey): Ditto.
 
 	* pubkey.c (gcry_pk_encrypt): Replaced the chain of if(!err) tests
 	by straightforward gotos. Other cleanups.
 	(gcry_pk_decrypt): Ditto.
 	(gcry_pk_sign): Ditto.
 	(gcry_pk_verify): Ditto.
 	(gcry_pk_genkey): Ditto.  Use strtoul instead of strtol.
 	(gcry_pk_ctl): Use GPG_ERR_INV_ARG to indicate bad arguments.
 
 2003-12-07  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c (gcry_pk_register_default): Undef the helper macro.
 	(gcry_pk_map_name): Allow NULL for string.
 	(sexp_to_key): Use memcpy and not strncpy.  Use gcry_free and not
 	free.
 	(sexp_to_sig): Ditto.
 	(sexp_to_enc): Ditto.  Replaced the chain of if(!err) tests by
 	straightforward gotos.
 
 2003-12-05  Werner Koch  <wk@gnupg.org>
 
 	* cipher.c: Documentation cleanups.
 	(gcry_cipher_mode_from_oid): Allow NULL for STRING.
 
 2003-12-03  Werner Koch  <wk@gnupg.org>
 
 	* elgamal.c (sign, do_encrypt, gen_k): Make sure that a small K is
 	only used for encryption.
 
 2003-11-18  Werner Koch  <wk@gnupg.org>
 
 	* random.h (rndw32_set_dll_name): Removed unused prototype.
 
 	* Makefile.am (EXTRA_DIST): Added Manifest.
 
 2003-11-11  Werner Koch  <wk@gnupg.org>
 
 	* Manifest: New.
 
 2003-11-04  Werner Koch  <wk@gnupg.org>
 
 	* md.c (gcry_md_hash_buffer): Use shortcut for SHA1
 	* sha1.c (_gcry_sha1_hash_buffer): New.
 
 	* random.c: Reformatted most functions.
 	(mix_pool): Moved the failsafe_digest from global
 	scope to here.
 	(do_fast_random_poll): Use the generic fucntions even if a fast
 	gathering function has been used.
 	(read_pool): Detect a fork and retry.
 	(gcry_randomize, get_random_bytes): Don't distinguish anymore
 	between weak and strong random.
 	(gcry_create_nonce): New.
 
 2003-10-31  Werner Koch  <wk@gnupg.org>
 
 	* rndw32.c (slow_gatherer_windowsNT): Use a plain buffer for the
 	disk performance values and not the W32 API structure.
 
 	* dsa.c (verify): s/exp/ex/ due to shadowing of a builtin.
 	* elgamal.c (verify): Ditto.
 
 	* ac.c (gcry_ac_data_get_index): s/index/idx/
 	(gcry_ac_data_copy_internal): Remove the cast in _gcry_malloc.
 	(gcry_ac_data_add): Must use gcry_realloc instead of realloc.
 	* pubkey.c (sexp_elements_extract): s/index/idx/ as tribute to the
 	forehackers.
 	(gcry_pk_encrypt): Removed shadowed definition of I. Reordered
 	arguments to malloc for clarity.
 	(gcry_pk_sign, gcry_pk_genkey): Ditto.
 	* primegen.c (prime_generate_internal): s/random/randomlevel/.
 
 2003-10-27  Moritz Schulte  <mo@g10code.com>
 
 	* pubkey.c (gcry_pk_encrypt): Don't forget to deallocate pkey.
 
 2003-10-27  Werner Koch  <wk@gnupg.org>
 
 	* random.c (gcry_random_add_bytes): Return if buflen is zero to
 	avoid gcc warning about unsed parameter.
 	(MASK_LEVEL): Simplified; does now work for signed and unsigned
 	w/o warnings.
 
 	* md.c (md_start_debug): Removed the const from SUFFIX, because
 	this function is called from the control fucntion which does not
 	require const.
 
 	Prefixed all (pubkey,digest,cipher}_spec_* globale variables with
 	_gcry_.
 
 	* ac.c (ac_key_identifiers): Made static.
 
 	* random.c (getfnc_gather_random,getfnc_fast_random_poll): Move
 	prototypes to ..
 	* rand-internal.h: .. here 
 	* random.c (getfnc_gather_random): Include rndw32 gatherer.
 	* rndunix.c, rndw32.c, rndegd.c: Include them here.
 	* rndlinux.c (_gcry_rndlinux_gather_random): Prepend the _gcry_
 	prefix.  Changed all callers.
 	* rndegd.c (_gcry_rndegd_gather_random): Likewise.
 	(_gcry_rndegd_connect_socket): Likewise.
 	* rndunix.c (_gcry_rndunix_gather_random): Likewise.
 	(waitpid): Made static.
 	* rndw32.c: Removed the old and unused winseed.dll cruft.
 	(_gcry_rndw32_gather_random_fast): Renamed from
 	gather_random_fast.
 	(_gcry_rndw32_gather_random): Renamed from gather_random.  Note,
 	that the changes 2003-04-08 somehow got lost.
 
 	* sha512.c (sha512_init, sha384_init): Made static.
 
 	* cipher.c (do_ctr_decrypt): Removed "return" from this void
 	function.
 
 2003-10-24  Moritz Schulte  <mo@g10code.com>
 
 	* serpent.c: Fix an issue on big-endian systems.
 
 	* rndw32.c: Removed IS_MODULE -cruft.
 	* rndlinux.c (rndlinux_gather_random): Likewise.
 
 2003-10-10  Werner Koch  <wk@gnupg.org>
 
 	* primegen.c (gen_prime): Bail out if NBITS is less than 16.
 	(prime_generate_internal): Initialize prime variable to suppress
 	compiler warning.  Check pbits, initialize qbits when passed as
 	zero.
 
 	* primegen.c (prime_generate_internal): New arg
 	ALL_FACTORS. Changed all callers.
 	(gcry_prime_generate): Make the factors arg optional. Request
 	all_factors.  Make sure PRIME is set to NULL even on error.
 	(gcry_prime_group_generator): New.
 	(gcry_prime_release_factors): New.
 
 2003-10-06  Werner Koch  <wk@gnupg.org>
 
 	* primegen.c (gen_prime): Assert that NBITS is never zero, it
 	would cause a segv.
 
 2003-09-28  Moritz Schulte  <mo@g10code.com>
 
 	* ac.c: Include "cipher.h".
 
 2003-09-27  Moritz Schulte  <mo@g10code.com>
 
 	* rndegd.c (do_read): Return nread instead of nbytes; thanks to
 	Michael Caerwyn.
 
 2003-09-04  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c (_gcry_pk_aliased_algo_name): New.
 	* ac.c (gcry_ac_open): Use it here.
 
 	* Makefile.am (EXTRA_libcipher_la_SOURCES): Add serpent.c
 
 2003-09-02  Moritz Schulte  <mo@g10code.com>
 
 	* primegen.c (gcry_prime_check, gcry_prime_generate): New
 	functions.
 	(prime_generate_internal): New function, based on
 	_gcry_generate_elg_prime.
 	(_gcry_generate_elg_prime): Rewritten as a wrapper for
 	prime_generate_internal.
 
 2003-08-28  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c (gcry_pk_encrypt): Don't include the flags list in the
 	return value.  This does not make sense and breaks any programs
 	parsing the output strictly (e.g. current gpgsm).
 	(gcry_pk_encrypt): If aliases for the algorithm name exists, take
 	the first one instead of the regular name to adhere to SPKI
 	conventions.
 	(gcry_pk_genkey): Ditto.
 	(gcry_pk_sign): Ditto. Removed unused KEY_ALGO_NAME.
 
 2003-08-19  Moritz Schulte  <mo@g10code.com>
 
 	* cipher.c: Add support for Serpent
 	* serpent.c: New file.
 
 2003-08-10  Moritz Schulte  <moritz@g10code.com>
 
 	* rsa.c (_gcry_rsa_blind, _gcry_rsa_unblind): Declare static.
 
 2003-08-09  Timo Schulz  <twoaday@freakmail.de>
 
 	* random.c (getfnc_gather_random): Don't check NAME_OF_DEV_RANDOM
 	two times, but also the NAME_OF_DEV_URANDOM device.
 	
 2003-08-08  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (sexp_to_enc): Fixed extraction of S-Expression: do not
 	fail if no `flags' sub S-Expression is found.
 
 2003-07-27  Werner Koch  <wk@gnupg.org>
 
 	* md.c (gcry_md_lookup_func_oid): Allow for empty OID lists.
 
 2003-07-23  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c (gcry_ac_data_construct): New argument: include_flags, only
 	include `flags' S-expression, if include_flags is true.  Adjust
 	callers.  Thanks for triggering a bug caused by `flags'
 	sub-S-expression where they are not expected to Ralf Schneider.
 
 2003-07-21  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (gcry_pk_lookup_func_name): Use new member name
 	`aliases' instead of `sexp_names'.
 
 	* ac.c (gcry_ac_key_data_get): New function.
 
 	* cipher.c (gcry_cipher_lookup_func_name): Fix return value.
 
 2003-07-20  Moritz Schulte  <moritz@g10code.com>
 
 	* blowfish.c: Adjusted for new gcry_cipher_spec_t structure.
 	* cast5.c: Likewise.
 	* twofish.c: Likewise.
 	* arcfour.c: Likewise.
 	* rijndael.c (rijndael_oids, rijndael192_oids, rijndael256_oids):
 	New variables, adjust for new gcry_cipher_spec_t structure.
 	* des.c (oids_tripledes): New variable, adjust for new
 	gcry_cipher_spec_t structure.
 
 	* md.c (oid_table): Removed.
 
 	* tiger.c (oid_spec_tiger): New variable.
 	(digest_spec_tiger): Adjusted for new gry_md_spec_t structure.
 
 	* sha512.c (oid_spec_sha512): New variable.
 	(digest_spec_sha512): Adjusted for new gry_md_spec_t structure.
 
 	* sha512.c (oid_spec_sha384): New variable.
 	(digest_spec_sha384): Adjusted for new gry_md_spec_t structure.
 
 	* sha256.c (oid_spec_sha256): New variable.
 	(digest_spec_sha256): Adjusted for new gry_md_spec_t structure.
 
 	* sha1.c (oid_spec_sha1): New variable.
 	(digest_spec_sha1): Adjusted for new gry_md_spec_t structure.
 
 	* rmd160.c (oid_spec_rmd160): New variable.
 	(digest_spec_rnd160): Adjusted for new gry_md_spec_t structure.
 
 	* md5.c (oid_spec_md5): New variable.
 	(digest_spec_md5): Adjusted for new gry_md_spec_t structure.
 
 	* md4.c (oid_spec_md4): New variable.
 	(digest_spec_md4): Adjusted for new gry_md_spec_t structure.
 
 	* crc.c (digest_spec_crc32, digest_spec_crc32_rfc1510,
 	digest_spec_crc32_rfc2440): Adjusted for new gry_md_spec_t
 	structure.
 
 2003-07-19  Moritz Schulte  <moritz@g10code.com>
 
 	* md.c (gcry_md_lookup_func_oid): New function.
 	(search_oid): New function, copied from cipher.c.
 	(gcry_md_map_name): Adjust for new search_oid_interface.
 
 	* cipher.c (oid_table): Removed table.
 	(gcry_cipher_lookup_func_oid): New function.
 	(search_oid): Rewritten to use the module functions.
 	(gcry_cipher_map_name): Adjust for new search_oid interface.
 	(gcry_cipher_mode_from_oid): Likewise.
 
 2003-07-18  Werner Koch  <wk@gnupg.org>
 
 	* md.c (gcry_md_hash_buffer): Convert ERR to gpg_error_t in
 	gpg_strerror.
 
 2003-07-14  Moritz Schulte  <moritz@g10code.com>
 
 	* cipher.c (gcry_cipher_lookup_func_name): Also check the cipher
 	name aliases, not just the primary name.
 	(gcry_cipher_map_name): Remove kludge for aliasing Rijndael to
 	AES.
 
 	* arcfour.c, blowfish.c, cast5.c, des.c, twofish.c: Adjust cipher
 	specification structures.
 
 	* rijndael.c (rijndael_names, rijndael192_names,
 	rijndael256_names): New variables, use them in the cipher
 	specifications.
 
 	* rmd160test.c: Removed file.
 
 	* ac.c, arcfour.c, blowfish.c, cast5.c, cipher.c, des.c, dsa.c,
 	elgamal.c, md.c, pubkey.c, random.c, rijndael.c, rsa.c, twofish.c:
 	Used gcry_err* wrappers for libgpg symbols.
 
 	* primegen.c (gen_prime): Correct the order arguments to
 	extra_check.
 
 2003-07-12  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c: Replaced all public occurences of gpg_error_t with
 	gcry_error_t.
 	* cipher.c: Likewise.
 	* md.c: Likewise.
 	* pubkey.c: Likewise.
 	* random.c: Likewise.
 
 	* cipher.c: Added support for TWOFISH128.
 
 2003-07-08  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c (gcry_ac_data_copy_internal): New function, based on
 	gcry_ac_data_copy.
 	(gcry_ac_data_copy): Made public, use gcry_ac_data_copy_internal.
 	(gcry_ac_key_init): Use gcry_ac_data_copy_internal.
 
 2003-07-07  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c (gcry_ac_data_set): Only release old MPI value if it is
 	different from the new value.  Bug reported by Simon Josefsson
 	<jas@extundo.com>.
 
 	* pubkey.c (gcry_pk_list): New function.
 	* md.c (gcry_md_list): New function.
 
 	* ac.c (gcry_ac_key_pair_generate): Fix calculation of format
 	string size.
 
 2003-07-05  Moritz Schulte  <moritz@g10code.com>
 
 	* md.c: Named struct of digest_table `digest_table_entry'.
 	(digest_table_entry): New member: algorithm; filled in.
 	(digest_table_entry): Removed unused member: flags.
 	(gcry_md_register): New argument: algorithm_id, filled in.
 	(gcry_md_register_default): Used algorithm ID from module
 	structure.
 	(gcry_md_map_name): Likewise.
 	(md_enable): Likewise.
 	(md_read): Likewise.
 	(gcry_md_info): Likewise.
 
 	* pubkey.c: Named truct for pubkey_table `pubkey_table_entry'.
 	(pubkey_table_entry): New member: algorithm; filled in.
 	(gcry_pk_register_default): Used algorithm ID from pubkey_table.
 	(gcry_pk_register): New argument: algorithm_id, filled in.
 	(gcry_pk_map_name): Used algorithm ID from module structure.
 	(gcry_pk_decrypt): Likewise.
 	(gcry_pk_encrypt): Likewise.
 	(gcry_pk_verify): Likewise.
 	(gcry_pk_sign): Likewise.
 	(gcry_pk_testkey): Likewise.
 	(gcry_pk_genkey): Likewise.
 	(gcry_pk_get_nbits): Likewise.
 	(sexp_to_key): Removed unused variable: algo.
 	(sexp_to_sig): Likewise.
 
 	* cipher.c: Named struct for cipher_table `cipher_table_entry'.
 	(cipher_table_entry): New member: algorithm; filled in.
 	(gcry_cipher_register_default): Used algorithm ID from
 	cipher_table.
 	(gcry_cipher_register): New argument: algorithm_id, filled in.
 	(gcry_cipher_map_name): Used algorithm ID from module structure.
 
 	* arcfour.c (cipher_spec_arcfour): Removed algorithm ID.
 	* blowfish.c (cipher_spec_blowfish): Likewise.
 	* cast5.c (cipher_spec_cast5): Likewise.
 	* crc.c (digest_spec_crc32): Likewise.
 	* crc.c (digest_spec_crc32_rfc1510): Likewise.
 	* crc.c (digest_spec_crc32_rfc2440): Likewise.
 	* des.c (cipher_spec_des): Likewise.
 	* des.c (cipher_spec_tripledes): Likewise.
 	* dsa.c (pubkey_spec_dsa): Likewise.
 	* elgamal.c (pubkey_spec_elg): Likewise.
 	* md4.c (digest_spec_md4): Likewise.
 	* md5.c (digest_spec_md5): Likewise.
 	* aes.c (cipher_spec_aes): Likewise.
 	* aes.c (cipher_spec_aes192): Likewise.
 	* aes.c (cipher_spec_aes256): Likewise.
 	* rsa.c (pubkey_spec_rsa): Likewise.
 	* sha1.c (digest_spec_sha1): Likewise.
 	* sha256.c (digest_spec_sha256): Likewise.
 	* sha512.c (digest_spec_sha512): Likewise.
 	* tiger.c (digest_spec_tiger): Likewise.
 	* twofish.c (cipher_spec_twofish): Likewise.
 	* twofish.c (cipher_spec_twofish128): Likewise.
 
 	* Makefile.am (EXTRA_libcipher_la_SOURCES): Fix list of source
 	files; reported by Simon Josefsson <jas@extundo.com>.
 
 	* pubkey.c: Replaced all occurences of `id' with `algorithm',
 	since `id' is a keyword in obj-c.
 	* md.c: Likewise.
 	* cipher.c: Likewise.
 
 	* crc.c, md4.c, md5.c, rmd160.c, sha1.c, sha256.c, tiger.c:
 	Replaced all occurences of gcry_digest_spec_t with gcry_md_spec_t.
 
 	* dsa.c, rsa.c, elgamal.c: Replaced all occurencens of
 	gcry_pubkey_spec_t with gcry_pk_spec_t.
 
 	* md.c: Replaced all occurences of gcry_digest_spec_t with
 	gcry_md_spec_t.
 	(gcry_digest_register_default): Renamed to ...
 	(gcry_md_register_default): ... this; adjusted callers.
 	(gcry_digest_lookup_func_name): Renamed to ...
 	(gcry_md_lookup_func_name): ... this; adjusted callers.
 	(gcry_digest_lookup_name): Renamed to ...
 	(gcry_md_lookup_name): ... this; adjusted callers.
 	(gcry_digest_register): Renamed to ...
 	(gcry_md_register): ... this.
 	(gcry_digest_unregister): Renamed to ...
 	(gcry_md_unregister): ... this.
 
 	* pubkey.c (gcry_pubkey_register): Renamed to ...
 	(gcry_pk_register): ... this.
 	(gcry_pubkey_unregister): Renamed to ...
 	(gcry_pk_unregister): ... this.
 	Replaced all occurences of gcry_pubkey_spec_t with gcry_pk_spec_t.
 	(gcry_pubkey_register_default): Renamed to ...
 	(gcry_pk_register_default): ... this; adjusted callers.
 	(gcry_pubkey_lookup_func_name): Renamed to ...
 	(gcry_pk_lookup_func_name): ... this; adjusted callers.
 	(gcry_pubkey_lookup_name): Renamed to ...
 	(gcry_pk_lookup_name): ... this; adjusted callers.
 
 	* md.c (gcry_md_hash_buffer): Fix error checking.  Thanks to Simon
 	Josefsson <jas@extunde.com>.
 
 2003-07-04  Moritz Schulte  <moritz@g10code.com>
 
 	* cipher.c (gcry_cipher_list): New function.
 
 2003-07-01  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (sexp_to_sig): Accept a `flags' S-expression to be more
 	consistent with sexp_to_enc.
 
 2003-06-30  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am (libcipher_la_SOURCES): Added: ac.c.
 
 	* pubkey.c (_gcry_pk_module_lookup): New function.
 	(_gcry_pk_module_release): New function.
 
 2003-06-29  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c: New file.
 
 2003-06-26  Werner Koch  <wk@gnupg.org>
 
 	* md.c (gcry_md_hash_buffer): Trigger BUG correcly with new API.
 
 2003-06-19  Werner Koch  <wk@gnupg.org>
 
 	* md.c (gcry_md_is_enabled): Fixed. 
 
 2003-06-18  Werner Koch  <wk@gnupg.org>
 
 	* cipher.c (gcry_cipher_get_algo_keylen): New.
 	(gcry_cipher_get_algo_blklen): New.
 
 2003-06-18  Moritz Schulte  <moritz@g10code.com>
 
 	* arcfour.c, cipher.c, blowfish.c, md.c, cast5.c, pubkey.c, crc.c,
 	des.c, dsa.c, elgamal.c, md4.c, md5.c, random.c, rijndael.c,
 	rmd160.c, rsa.c, sha1.c, sha256.c, sha512.c, tiger.c, twofish.c:
 	Replaced older types GcryDigestSpec, GcryCipherSpec and
 	GcryPubkeySpec with newer types: gcry_digest_spec_t,
 	gcry_cipher_spec_t and gcry_pubkey_spec_t.
 
 	* md.c (gcry_digest_id_new): Removed function.
 	(gcry_digest_register): Removed code for generating a new module
 	ID.
 
 	* pubkey.c (gcry_pubkey_id_new): Removed function.
 	(gcry_pubkey_register): Removed code for generating a new module
 	ID.
 
 	* cipher.c, md.c, pubkey.c: Replace old type GcryModule with newer
 	one: gcry_module_t.
 	(gcry_cipher_id_new): Removed function.
 	(gcry_cipher_register): Removed code for generating a new module
 	ID.
 
 	* cipher.c (gcry_cipher_register): Adjust call to
 	_gcry_module_add.
 	(gcry_cipher_register_default): Likewise.
 	* pubkey.c (gcry_pubkey_register_default): Likewise.
 	(gcry_pubkey_register): Likewise.
 	* md.c (gcry_digest_register_default): Likewise.
 	(gcry_digest_register): Likewise.
 
 	* md.c (gcry_digest_lookup_func_id): Removed function.
 	(gcry_digest_lookup_id): Likewise.
 	(gcry_digest_id_new): Use _gcry_module_lookup_id instead of
 	gcry_digest_lookup_id.
 	(digest_algo_to_string): Likewise.
 	(check_digest_algo): Likewise.
 	(md_enable): Likewise.
 	(md_digest_length): Likewise.
 	(md_asn_oid): Likewise.
 
 	* pubkey.c (gcry_pubkey_lookup_id): Removed function.
 	(gcry_pubkey_lookup_func_id): Likewise.
 	(gcry_pubkey_id_new): Use _gcry_module_lookup_id instead of
 	gcry_pubkey_id_new.
 	(gcry_pk_algo_name): Likewise.
 	(disable_pubkey_algo): Likewise.
 	(check_pubkey_algo): Likewise.
 	(pubkey_get_npkey): Likewise.
 	(pubkey_get_nskey): Likewise.
 	(pubkey_get_nsig): Likewise.
 	(pubkey_get_nenc): Likewise.
 	(pubkey_generate): Likewise.
 	(pubkey_check_secret_key): Likewise.
 	(pubkey_encrypt): Likewise.
 	(pubkey_decrypt): Likewise.
 	(pubkey_sign): Likewise.
 	(pubkey_verify): Likewise.
 	(gcry_pk_algo_info): Likewise.
 
 	* cipher.c (gcry_cipher_lookup_func_id): Removed function.
 	(gcry_cipher_lookup_id): Likewise.
 	(cipher_algo_to_string): use _gcry_module_lookup_id instead of
 	gcry_cipher_lookup_id.
 	(disable_cipher_algo): Likewise.
 	(check_cipher_algo): Likewise.
 	(cipher_get_blocksize): Likewise.
 	(gcry_cipher_open): Likewise.
 	(gcry_cipher_id_new): Likewise.
 
 2003-06-17  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am (GCRYPT_MODULES): Set to @GCRYPT_CIPHERS@,
 	@GCRYPT_PUBKEY_CIPHERS@, @GCRYPT_DIGESTS@ and @GCRYPT_RANDOM@.
 	(libcipher_la_DEPENDENCIES): Set to $(GCRYPT_MODULES).
 	(libcipher_la_LIBADD): Likewise.
 	(AM_CFLAGS): Added: @GPG_ERROR_CFLAGS@.
 	(EXTRA_libcipher_la_SOURCES): Added all conditional sources.
 
 	* md.c (md_open): Use _gcry_fast_random_poll instead of
 	fast_random_poll.
 	* cipher.c (gcry_cipher_open): Likewise.
 
 	* random.h (fast_random_poll): Removed macro.
 
 	* blowfish.c, md4.c, md5.c, rmd160.c, sha1.c, sha256.c, sha512.c,
 	tiger.c: Use Autoconf's WORDS_BIGENDIAN instead of our own
 	BIG_ENDIAN_HOST.
 
 2003-06-16  Moritz Schulte  <moritz@g10code.com>
 
 	* random.c (getfnc_gather_random): Do not special-case
 	USE_ALL_RANDOM_MODULES, make it the default.
 
 	* dsa.c: Replace last occurences of old type names with newer
 	names (i.e. replace MPI with gcry_mpi_t).
 	* elgamal.c: Likewise.
 	* primegen.c: Likewise.
 	* pubkey.c: Likewise.
 	* rsa.c: Likewise.
 
 2003-06-14  Moritz Schulte  <moritz@g10code.com>
 
 	* des.c (des_setkey): Add selftest check.
 	(tripledes_set3keys): Likewise.
 	(do_tripledes_setkey): Remove selftest check.
 	(do_des_setkey): Likewise.
 
 2003-06-11  Moritz Schulte  <moritz@g10code.com>
 
 	* md.c (_gcry_md_init): New function.
 	* cipher.c (_gcry_cipher_init): New function.
 	* pubkey.c (_gcry_pk_init): New function.
 
 2003-06-13  Werner Koch  <wk@gnupg.org>
 
 	* md.c (gcry_md_get_algo): Reverted to old API.  This is a
 	convenience function anyway and error checking is not approriate.
 	(gcry_md_is_secure): New.
 	(gcry_md_is_enabled): New.
 
 2003-06-12  Werner Koch  <wk@gnupg.org>
 
 	* cipher.c (gcry_cipher_open): Make sure HANDLE is set to NULL on
 	error.
 
 2003-06-11  Werner Koch  <wk@gnupg.org>
 
 	* md.c (gcry_md_open): Make sure H receives either NULL or an
 	valid handle.
 	(gcry_md_copy): Swapped arguments so that it is more in lione with
 	md_open and most other API fucntions like memcpy (destination
 	comes first).  Make sure HANDLE is set to NULL on error.
 	
 	* rijndael.c (do_encrypt): Hack to force correct alignment.  It
 	seems not to be	not sufficient, though.  We should rework this
 	fucntions and remove all these ugly casts.  Let the compiler
 	optimize or have an assembler implementation.
 
 2003-06-09  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am: Removed rules serpent, since that is not commited
 	yet.
 
 2003-06-08  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (gcry_pk_encrypt): Improve calculation for size of the
 	format string.
 
 2003-06-07  Moritz Schulte  <moritz@g10code.com>
 
 	* arcfour.c, bithelp.h, blowfish.c, cast5.c, cipher.c, crc.c,
 	des.c, dsa.c, elgamal.c, md4.c, md5.c, md.c, primegen.c, pubkey.c,
 	rand-internal.h, random.c, random.h, rijndael.c, rmd160.c,
 	rmd160test.c, rmd.h, rndeged.c, rndlinux.c, rndunix.c, rndw32.c,
 	rsa.c, sha1.c, sha256.c, sha512.c, tiger.c, twofish.c: Edited all
 	preprocessor instructions to remove whitespace before the '#'.
 	This is not required by C89, but there are some compilers out
 	there that don't like it.  Replaced any occurence of the now
 	deprecated type names with the new ones.
 	
 2003-06-04  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (gcry_pk_encrypt): Construct an arg_list and use
 	gcry_sexp_build_array instead of gcry_sexp_build.
 	(gcry_pk_sign): Likewise.
 	(gcry_pk_genkey): Likewise.
 
 2003-06-01  Moritz Schulte  <moritz@g10code.com>
 
 	* dsa.c (_gcry_dsa_generate): Do not check wether the algorithm ID
 	does indeed belong to DSA.
 	(_gcry_dsa_sign): Likewise.
 	(_gcry_dsa_verify): Likewise.
 	(_gcry_dsa_get_nbits): Likewise.
 
 	* elgamal.c (_gcry_elg_check_secret_key): Do not check wether the
 	algorithm ID does indeed belong to ElGamal.
 	(_gcry_elg_encrypt): Likewise.
 	(_gcry_elg_decrypt): Likewise.
 	(_gcry_elg_sign): Likewise.
 	(_gcry_elg_verify): Likewise.
 	(_gcry_elg_get_nbits): Likewise.
 	(_gcry_elg_generate): Likewise.
 
 	* rsa.c (_gcry_rsa_generate): Do not check wether the algorithm ID
 	does indeed belong to RSA.
 	(_gcry_rsa_encrypt): Likewise.
 	(_gcry_rsa_decrypt): Likewise.
 	(_gcry_rsa_sign): Likewise.
 	(_gcry_rsa_verify): Likewise.
 	(_gcry_rsa_get_nbits): Likewise.
 
 2003-05-30  Moritz Schulte  <moritz@g10code.com>
 
 	* md.c (md_get_algo): Return zero in case to algorithm is enabled.
 
 	* md.c (gcry_md_info): Adjusted for new no-errno-API.
 	(md_final): Likewise.
 	(gcry_md_get_algo): Likewise.
 	* pubkey.c (gcry_pk_get_keygrip): Likewise.
 	(gcry_pk_ctl): Likewise.
 	(gcry_pk_algo_info): Likewise.
 	* des.c (selftest): Likewise.
 
 2003-05-29  Moritz Schulte  <moritz@g10code.com>
 
 	* md.c (md_enable): Do not forget to release module on error.
 	(gcry_md_open): Adjusted for new no-errno-API.
 	(md_open): Likewise.
 	(md_copy): Likewise.
 	(gcry_md_copy): Likewise.
 	(gcry_md_setkey): Likewise.
 	(gcry_md_algo_info): Likewise.
 
 	* cipher.c (gcry_cipher_open): Adjusted for new no-errno-API and
 	also fixed a locking bug.
 	(gcry_cipher_encrypt): Adjusted for new no-errno-API.
 	(gcry_cipher_decrypt): Likewise.
 	(gcry_cipher_ctl): Likewise.
 	(gcry_cipher_info): Likewise.
 	(gcry_cipher_algo_info): Likewise.
 
 2003-05-28  Moritz Schulte  <moritz@g10code.com>
 
 	* md.c (md_enable): Adjusted for libgpg-error.
 	(gcry_md_enable): Likewise.
 	(gcry_digest_register_default): Likewise.
 	(gcry_digest_register): Likewise.
 	(check_digest_algo): Likewise.
 	(prepare_macpads): Likewise.
 	(gcry_md_setkey): Likewise.
 	(gcry_md_ctl): Likewise.
 	(gcry_md_get): Likewise.
 	(gcry_md_algo_info): Likewise.
 	(gcry_md_info): Likewise.
 	* dsa.c (_gcry_dsa_generate): Likewise.
 	(_gcry_dsa_check_secret_key): Likewise.
 	(_gcry_dsa_sign): Likewie.
 	(_gcry_dsa_verify): Likewise.
 	* twofish.c (do_twofish_setkey): Likewise.
 	(twofish_setkey): Likewise.
 	* cipher.c (gcry_cipher_register): Likewise.
 
 2003-05-25  Moritz Schulte  <moritz@g10code.com>
 
 	* rijndael.c (do_setkey): Adjusted for libgpg-error.
 	(rijndael_setkey): Likewise.
 	* random.c (gcry_random_add_bytes): Likewise.
 	* elgamal.c (_gcry_elg_generate): Likewise.
 	(_gcry_elg_check_secret_key): Likewise.
 	(_gcry_elg_encrypt): Likewise.
 	(_gcry_elg_decrypt): Likewise.
 	(_gcry_elg_sign): Likewise.
 	(_gcry_elg_verify): Likewise.
 	* rsa.c (_gcry_rsa_generate): Likewise.
 	(_gcry_rsa_check_secret_key): Likewise.
 	(_gcry_rsa_encrypt): Likewise.
 	(_gcry_rsa_decrypt): Likewise.
 	(_gcry_rsa_sign): Likewise.
 	(_gcry_rsa_verify): Likewise.
 	* pubkey.c (dummy_generate, dummy_check_secret_key, dummy_encrypt,
 	dummy_decrypt, dummy_sign, dummy_verify): Likewise.
 	(gcry_pubkey_register): Likewise.
 	(check_pubkey_algo): Likewise.
 	(pubkey_generate): Likewise.
 	(pubkey_check_secret_key): Likewise.
 	(pubkey_encrypt): Likewise.
 	(pubkey_decrypt): Likewise.
 	(pubkey_sign): Likewise.
 	(pubkey_verify): Likewise.
 	(sexp_elements_extract): Likewise.
 	(sexp_to_key): Likewise.
 	(sexp_to_sig): Likewise.
 	(sexp_to_enc): Likewise.
 	(sexp_data_to_mpi): Likewise.
 	(gcry_pk_encrypt): Likewise.
 	(gcry_pk_decrypt): Likewise.
 	(gcry_pk_sign): Likewise.
 	(gcry_pk_verify): Likewise.
 	(gcry_pk_testkey): Likewise.
 	(gcry_pk_genkey): Likewise.
 	(gcry_pk_ctl): Likewise.
 	* cipher.c (dummy_setkey): Likewise.
 	(check_cipher_algo): Likewise.
 	(gcry_cipher_open): Likewise.
 	(cipher_setkey): Likewise.
 	(gcry_cipher_ctl): Likewise.
 	(cipher_encrypt): Likewise.
 	(gcry_cipher_encrypt): Likewise.
 	(cipher_decrypt): Likewise.
 	(gcry_cipher_decrypt): Likewise.
 	(gcry_cipher_info): Likewise.
 	(gcry_cipher_algo_info): Likewise.
 	* cast5.c (cast_setkey): Likewise.
 	(do_cast_setkey): Likewise.
 	* arcfour.c (arcfour_setkey): Likewise.
 	(do_arcfour_setkey): Likewise.
 	* blowfish.c (do_bf_setkey): Likewise.
 	(bf_setkey): Likewise.
 	* des.c (do_des_setkey): Likewise.
 	(do_tripledes_setkey): Likewise.
 
 2003-05-22  Moritz Schulte  <moritz@g10code.com>
 
 	* tiger.c: Merged code ussing the U64_C macro from GnuPG.
 
 	* sha512.c: Likewise.
 
 2003-05-17  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (gcry_pk_genkey): Fix type: acquire a lock, instead of
 	releasing it.
 
 2003-05-11  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (gcry_pk_testkey): Call REGISTER_DEFAULT_CIPHERS.
 	(gcry_pk_ctl): Likewise.
 
 2003-04-27  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (gcry_pk_genkey): Release sexp after extracted data has
 	been used.
 
 	* md.c (gcry_md_get_algo_dlen): Simplified, simply call
 	md_digest_length to do the job.
 
 	* des.c (do_des_setkey): Check for selftest failure not only
 	during initialization.
 	(do_tripledes_setkey): Include check for selftest failure.
 
 	* pubkey.c (gcry_pubkey_register_default): New macro
 	`pubkey_use_dummy', use it.
 
 	* elgamal.c (elg_names): New variable.
 	(pubkey_spec_elg): Include elg_names.
 
 	* dsa.c (dsa_names): New variable.
 	(pubkey_spec_dsa): Include dsa_names.
 
 	* rsa.c (rsa_names): New variable.
 	(pubkey_spec_rsa): Include rsa_names.
 
 	* pubkey.c (gcry_pubkey_lookup_func_name): Compare name also with
 	the names listed in `sexp_names'.
 
 2003-04-24  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (sexp_to_key): New variables: module, pubkey.  Adjusted
 	to new module interface.
 	(sexp_to_key): Changend type of argument `retalgo' from `int *' to
 	`GcryModule **'.  Adjusted all callers.  Removed argument:
 	r_algotblidx.
 	(sexp_to_sig): Changend type of argument `retalgo' from `int *' to
 	`GcryModule **'.  Adjusted all callers.
 	(sexp_to_enc): Likewise.
 
 	(pubkey_get_npkey, pubkey_get_nskey, pubkey_get_nsig,
 	pubkey_get_nenc): Use strlen to find out the number.
 
 	* rsa.c: Adjust pubkey_spec_rsa to new internal interface.
 	* dsa.c: Likewise.
 	* elgamal.c: Likewise.
 
 2003-04-17  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c (sexp_elements_extract): New function.
 	* pubkey.c (sexp_to_key): Removed variable `idx', added `err', use
 	sexp_elements_extract.
 	(sexp_to_sig): Likewise.
 	(sexp_to_enc): Likewise.
 
 	* pubkey.c: Terminate list correctly.
 	* md.c: Include sha512/sha384 in digest_table.
 
 2003-04-16  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am: Include support for sha512.c.
 
 	* sha512.c: New file, merged from GnuPG, with few modifications
 	for libgcrypt.
 
 	* rand-internal.h: Removed declarations for constructor functions.
 
 	* md.c (md_copy): Call _gcry_module_use for incrementing the usage
 	counter of the digest modules.
 
 	* rsa.c: Do not include "rsa.h".
 	* dsa.c: Do not include "dsa.h".
 	* elgamal.c: Do not include "elgamal.h".
 	* des.c: Do not include "des.h".
 	* cast5.c: Do not include "cast5.h".
 	* blowfish.c: Do not include "blowfish.h".
 	* arcfour.c: Do not include "arcfour.h".
 
 	* Makefile.am (libcipher_la_DEPENDENCIES): Removed.
 	(libcipher_la_LIBADD): Removed.
 	Use Automake conditionals for conditional compilation.
 
 2003-04-13  Moritz Schulte  <moritz@g10code.com>
 
 	* cipher.c (gcry_cipher_open): Call REGISTER_DEFAULT_CIPHERS.
 
 	* md.c (gcry_md_list): New member: module.
 	(md_enable): New variable: module, changed use of module and
 	digest.
 	(md_enable): Initialize member: module.
 	(md_close): Call _gcry_module_release.
 
 	* cipher.c (gcry_cipher_open): New variable: module, changed use of
 	module and cipher.
 	(struct gcry_cipher_handle): New member: module.
 	(gcry_cipher_open): Initialize member: module.
 	(gcry_cipher_close): Call _gcry_module_release.
 
 2003-04-09  Moritz Schulte  <moritz@g10code.com>
 	
 	* cipher.c: Include "ath.h".
 	* md.c: Likewise.
 	* pubkey.c: Likewise.
 
 	* cipher.c (ciphers_registered_lock): New variable.
 	* md.c (digests_registered_lock): New variable.
 	* pubkey.c (pubkeys_registered_lock): New variable.
 
 	* rndlinux.c (gnupgext_version, func_table): Removed definitions.
 	(gnupgext_enum_func): Removed function.
 	(_gcry_rndlinux_constructor): Removed function.
 
 	* rndegd.c (gnupgext_version, func_table): Removed definitions.
 	(gnupgext_enum_func): Removed function.
 	(_gcry_rndegd_constructor): Removed function.
 
 	* rndunix.c (gnupgext_version, func_table): Removed definitions.
 	(gnupgext_enum_func): Removed function.
 	(_gcry_rndunix_constructor): Removed function.
 
 	* rndw32.c (gnupgext_version, func_table): Removed definitions.
 	(gnupgext_enum_func): Removed function.
 	(_gcry_rndw32_constructor): Removed function.
 
 	* rndegd.c (rndegd_connect_socket): Simplify code for creating the
 	egd socket address.
 	(rndegd_connect_socket): Call log_fatal use instead of
 	g10_log_fatal.
 	(egd_gather_random): Renamed to ...
 	(rndegd_gather_random): ... here.
 
 2003-04-08  Moritz Schulte  <moritz@g10code.com>
 
 	* rndlinux.c: Do not include "dynload.h".
 	* rndunix.c: Likewise.
 	* rndw32.c: Likewise.
 
 	* rndegd.c (rndegd_connect_socket): Factored out from ...
 	(egd_gather_random): here; call it.
 	(egd_socket): New variable.
 	(egd_gather_random): Initialize fd with egd_socket, do not declare
 	fd static.
 	(do_read): Merged few changes from GnuPG. FIXME - not finished?
 	Do not include "dynload.h".
 
 	* rndw32.c (gather_random): Renamed to rndw32_gather_random, do
 	not declare static.
 	(gather_random_fast): Renamed to rndw32_gather_random_fast, do not
 	declare static.
 
 	* rndunix.c (gather_random): Renamed to rndunix_gather_random, do
 	not declare static.
 	* rndegd.c (gather_random): Renamed to rndegd_gather_random, do
 	not declare static.
 	* rndlinux.c (gather_random): Renamed to rndlinux_gather_random,
 	do not declare static.
 
 2003-04-07  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am (libcipher_la_SOURCES): Removed construct.c.
 	(libcipher_la_SOURCES): Added sha1.c, sha256.c, rmd160.c, md4.c,
 	md5.c, tiger.c and crc.c
 	(EXTRA_PROGRAMS): Removed sha1, sha256, rmd160, md4, md5, tiger
 	and crc.  Removed definitions: EXTRA_md4_SOURCES,
 	EXTRA_md5_SOURCES, EXTRA_rmd160_SOURCES, EXTRA_sha1_SOURCES,
 	EXTRA_sha256_SOURCES, EXTRA_tiger_SOURCES and EXTRA_crc_SOURCES,
 	BUILT_SOURCES, DISTCLEANFILES.
 
 	* pubkey.c: Do not include "elgamal.h", "dsa.h" and "rsa.h".
 
 	* Makefile.am (libcipher_la_SOURCES): Removed rsa.h, elgamal.h,
 	dsa.h, des.h, cast5.h, arcfour.h and blowfish.h.
 
 	* rsa.h: Removed file.
 	* elgamal.h: Removed file.
 	* dsa.h: Removed file.
 	* des.h: Removed file.
 	* cast5.h: Removed file.
 	* arcfour.h: Removed file.
 	* blowfish.h: Removed file.
 
 	* Makefile.am (libcipher_la_SOURCES): Removed dynload.c and
 	dynload.h.
 
 	* rsa.c (pubkey_spec_rsa): New variable.
 	* dsa.c (pubkey_spec_rsa): New variable.
 	* elgamal.c (pubkey_spec_elg): New variable.
 	
 	* rsa.c (_gcry_rsa_get_info): Removed function.
 	* elgamal.c (_gcry_elg_get_info): Removed function.
 	* dsa.c (_gcry_dsa_get_info): Removed function.
 
 	* tiger.c (tiger_get_info): Removed function.
 	(gnupgext_version, func_table): Removed definitions.
 	(gnupgext_enum_func): Removed function.
 	(_gcry_tiger_constructor): Removed function.
 	
 	* sha1.c (sha1_get_info): Removed function.
 	(gnupgext_version, func_table): Removed definitions.
 	(gnupgext_enum_func): Removed function.
 	(_gcry_sha1_constructor): Removed function.
 
 	* sha256.c (sha256_get_info): Removed function.
 	(gnupgext_version, func_table): Removed definitions.
 	(gnupgext_enum_func): Removed function.
 	(_gcry_sha256_constructor): Removed function.
 
 	* rmd160.c (rmd160_get_info): Removed function.
 	(gnupgext_version, func_table): Removed definitions.
 	(gnupgext_enum_func): Removed function.
 	(_gcry_rmd160_constructor): Removed function.
 
 	* md5.c (md5_get_info): Removed function.
 	(gnupgext_version, func_table): Removed definitions.
 	(gnupgext_enum_func): Removed function.
 	(_gcry_md5_constructor): Removed function.
 
 	* md4.c (md4_get_info): Removed function.
 	(gnupgext_version, func_table): Removed definitions.
 	(gnupgext_enum_func): Removed function.
 	(_gcry_md4_constructor): Removed function.
 
 	* crc.c (crc_get_info): Removed function.
 
 	* arcfour.c (do_arcfour_setkey): Changed type of context argument
 	to `void *', added local variable for cast, adjusted callers.
 	(arcfour_setkey): Likewise.
 	(encrypt_stream): Likewise.
 	* cast5.c (cast_setkey): Likewise.
 	(encrypt_block): Likewise.
 	* rijndael.c (rijndael_setkey): Likewise.
 	(rijndael_encrypt): Likewise.
 	(rijndael_decrypt): Likewise.
 	* twofish.c (twofish_setkey): Likewise.
 	(twofish_encrypt): Likewise.
 	(twofish_decrypt): Likewise.
 	* des.c (do_des_setkey): Likewise.
 	(do_des_encrypt): Likewise.
 	(do_des_encrypt): Likewise.
 	(do_tripledes_encrypt): Likewise.
 	(do_tripledes_encrypt): Likewise.
 	* blowfish.c (bf_setkey: Likewise.
 	(encrypt_block): Likewise.
 	(decrypt_block): Likewise.
 	
 	* arcfour.c (encrypt_stream): Likewise.
 
 	* rijndael.c (gnupgext_version, func_table): Removed definitions.
 	(gnupgext_enum_func) Removed function.	
 	
 	* twofish.c (gnupgext_version, func_table): Removed definitions.
 	(gnupgext_enum_func) Removed function.	
 
 	* cast5.c (CIPHER_ALGO_CAST5): Removed.
 
 	* blowfish.c (FNCCAST_SETKEY, FNCCAST_CRYPT): Removed macros.
 	(CIPHER_ALGO_BLOWFISH): Removed symbol.
 	* cast5.c (FNCCAST_SETKEY, FNCCAST_CRYPT): Likewise.
 	* des.c (selftest_failed): Removed.
 	(initialized): New variable.
 	(do_des_setkey): Run selftest, if not yet done.
 	(FNCCAST_SETKEY, FNCCAST_CRYPT): Removed macros.
 
 	* arcfour.c (_gcry_arcfour_get_info): Removed function.
 	* blowfish.c (_gcry_blowfish_get_info): Removed function.
 	* cast5.c (_gcry_cast5_get_info): Removed function.
 	* des.c (_gcry_des_get_info): Removed function.
 	* rijndael.c (_gcry_rijndael_get_info): Removed function.
 	* twofish.c (_gcry_twofish_get_info): Removed function.
 
 	* arcfour.c (cipher_spec_arcfour): New variable.
 	* twofish.c (cipher_spec_twofish, cipher_spec_twofish128): New
 	variables.
 	* rijndael.c (cipher_spec_aes, cipher_spec_aes192,
 	cipher_spec256): New variables.
 	* des.c (cipher_spec_des, cipher_spec_tripledes): New variables.
 	* cast5.c (cipher_spec_cast5): New variable.
 	* blowfish.c (cipher_spec_blowfish): Likewise.
 	
 	* twofish.c: Do not include "dynload.h".
 	* rijndael.c: Likewise.
 	* des.c: Likewise.
 	* cast5.c: Likewise.
 	* blowfish.c: Likewise.
 	* cipher.c: Likewise.
 	* crc.c: Likewise.
 	* md4.c: Likewise.
 	* md5.c: Likewise.
 	* md.c: Likewise.
 	* pubkey.c: Likewise.
 	* rijndael.c: Likewise.
 	* sha1.c: Likewise.
 	* sha256.c: Likewise.
 
 	* arcfour.c: Include "cipher.h".
 	* twofish.c: Likewise.
 	* rijndael.c: Likewise.
 	* des.c: Likewise.
 	* cast5.c: Likewise.
 	* blowfish.c: Likewise.
 
 	* twofish.c (twofish_setkey): Declared argument `key' const.
 	(twofish_encrypt): Declared argument `inbuf' const.
 	(twofish_decrypt): Likewise.
 
 	* rijndael.c (rijndael_setkey): Declared argument `key' const.
 	(rijndael_encrypt): Declared argument `inbuf' const.
 	(rijndael_decrypt): Likewise.
 
 	* des.c (do_des_setkey): Declared argument `key' const.
 	(do_tripledes_setkey): Likewise.
 	(do_des_encrypt): Declared argument `inbuf' const.
 	(do_des_decrypt): Likewise.
 	(do_tripledes_encrypt): Likewise.
 	(do_tripledes_decrypt): Likewise.
 
 	* cast5.c (encrypt_block): Declared argument `inbuf' const.
 	(decrypt_block): Likewise.
 	(cast_setkey): Declared argument `key' const.
 
 	* blowfish.c (do_bf_setkey): Declared argument `key' const.
 	(encrypt_block): Declared argument `inbuf' const.
 	(encrypt_block): Likewise.
 
 	
 
 	* cipher.c: Remove CIPHER_ALGO_DUMMY related code.
 	Removed struct cipher_table_s.
 	Changed definition of cipher_table.
 	Removed definition of disabled_algos.
 	(ciphers_registered, default_ciphers_registered): New variables.
 	(REGISTER_DEFAULT_CIPHERS): New macro.
 	(dummy_setkey): Declared argument `key' const.
 	(dummy_encrypt_block): Declared argument `inbuf' const.
 	(dummy_encrypt_block): Likewise.
 	(dummy_encrypt_stream): Likewise.
 	(dummy_encrypt_stream): Likewise.
 	(dummy_setkey): Use `unsigned char' instead of `byte'.
 	(dummy_encrypt_block): Likewise.
 	(dummy_decrypt_block): Likewise.
 	(dummy_encrypt_stream): Likewise.
 	(dummy_decrypt_stream): Likewise.
 	(gcry_cipher_register_default): New function.
 	(gcry_cipher_lookup_func_id): New function.
 	(gcry_cipher_lookup_func_name): New function.
 	(gcry_cipher_lookup_id): New function.
 	(gcry_cipher_lookup_name): New function.
 	(gcry_cipher_id_new): New function.
 	(gcry_cipher_register): New function.
 	(gcry_cipher_unregister): New function.
 	(setup_cipher_table): Removed function.
 	(load_cipher_modules): Removed function.
 	(gcry_cipher_map_name): Adjusted to use new module management.
 	(cipher_algo_to_string): Likewise.
 	(disable_cipher_algo): Likewise.
 	(check_cipher_algo): Likewise.
 	(cipher_get_keylen): Likewise.
 	(cipher_get_blocksize): Likewise.
 	(gcry_cipher_open): Likewise.
 	(struct gcry_cipher_handle): Replaced members algo, algo_index,
 	blocksize, setkey, encrypt, decrypt, stencrypt, stdecrypt with one
 	member: cipher.
 	(gcry_cipher_open): Adjusted code for new handle structure.
 	(cipher_setkey): Likewise.
 	(cipher_setiv): Likewise.
 	(cipher_reset): Likewise.
 	(do_ecb_encrypt): Likewise.
 	(do_ecb_decrypt): Likewise.
 	(do_cbc_encrypt): Likewise.
 	(do_cbc_decrypt): Likewise.
 	(do_cfb_encrypt): Likewise.
 	(do_cfb_decrypt): Likewise.
 	(do_ctr_encrypt): Likewise.
 	(cipher_encrypt): Likewise.
 	(gcry_cipher_encrypt): Likewise.
 	(cipher_decrypt): Likewise.
 	(gcry_cipher_decrypt): Likewise.
 	(cipher_sync): Likewise.
 	(gcry_cipher_ctl): Likewise.
 
 	* pubkey.c: Removed struct pubkey_table_s.
 	Changed definition of pubkey_table.
 	Removed definition of disabled_algos.
 	(pubkeys_registered, default_pubkeys_registered): New variables.
 	(REGISTER_DEFAULT_PUBKEYS): New macro.
 	(setup_pubkey_table): Removed function.
 	(load_pubkey_modules): Removed function.
 	(gcry_pubkey_register_default): New function.
 	(gcry_pubkey_lookup_func_id): New function.
 	(gcry_pubkey_lookup_func_name): New function.
 	(gcry_pubkey_lookup_id): New function.
 	(gcry_pubkey_lookup_name): New function.
 	(gcry_pubkey_id_new): New function.
 	(gcry_pubkey_register): New function.
 	(gcry_pubkey_unregister): New function.
 	(gcry_pk_map_name): Adjusted to use new module management.
 	(gcry_pk_algo_name): Likewise.
 	(disable_pubkey_algo): Likewise.
 	(check_pubkey_algo): Likewise.
 	(pubkey_get_npkey): Likewise.
 	(pubkey_get_nskey): Likewise.
 	(pubkey_get_nsig): Likewise.
 	(pubkey_get_nenc): Likewise.
 	(pubkey_generate): Likewise.
 	(pubkey_check_secret_key): Likewise.
 	(pubkey_encrypt): Likewise.
 	(pubkey_decrypt): Likewise.
 	(pubkey_sign): Likewise.
 	(pubkey_verify): Likewise.
 	(gcry_pk_get_nbits): Likewise.
 	(gcry_pk_algo_info): Likewise.
 
 	* md.c: Removed struct md_digest_list_s.
 	(digest_list): Changed definition.
 	(digests_registered, default_digests_registered): New variables.
 	(REGISTER_DEFAULT_DIGESTS): New macro.
 	(new_list_item): Removed function.
 	(setup_md_table): Removed function.
 	(load_digest_module): Removed function.
 	(gcry_digest_register_default): New function.
 	(gcry_digest_lookup_func_id): New function.
 	(gcry_digest_lookup_func_name): New function.
 	(gcry_digest_lookup_id): New function.
 	(gcry_digest_lookup_name): New function.
 	(gcry_digest_id_new): New function.
 	(gcry_digest_register): New function.
 	(gcry_digest_unregister): New function.
 	(GcryDigestEntry): New type.
 	(struct gcry_md_context): Adjusted type of `list'.
 	(gcry_md_map_name): Adjusted to use new module management.
 	(digest_algo_to_string): Likewise.
 	(check_digest_algo): Likewise.
 	(md_enable): Likewise.
 	(md_digest_length): Likewise.
 	(md_asn_oid): Likewise.
 
 2003-04-07  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c: Replaced PUBKEY_ALGO_DSA with GCRY_PK_DSA,
 	PUBKEY_ALGO_RSA with GCRY_PK_RSA and PUBKEY_ALGO_ELGAMAL with
 	GCRY_PK_ELG.
 
 	* dsa.c: Replaced PUBKEY_ALGO_DSA with GCRY_PK_DSA.
 
 2003-04-01  Moritz Schulte  <moritz@g10code.com>
 
 	* des.c: Removed checks for GCRY_CIPHER_3DES and GCRY_CIPHER_DES.
 
 2003-03-31  Moritz Schulte  <moritz@g10code.com>
 
 	* tiger.c (tiger_get_info): Do not declare static.
 	* sha256.c (sha256_get_info): Likewise.
 	* sha1.c (sha1_get_info): Likewise.
 	* rmd160.c (rmd160_get_info): Likewise.
 	* md5.c (md5_get_info): Likewise.
 	* md4.c (md4_get_info): Likewise.
 	* crc.c (crc_get_info): Likewise.
 
 	* md.c (load_digest_module): Call setup_md_table during
 	initialization.
 	(new_list_item): Link new element into digest_list.
 
 	* cipher.c (do_ctr_decrypt): Made do_ctr_encrypt act as a wrapper
 	for do_ctr_encrypt, since these functions are identical.
 
 2003-03-30  Simon Josefsson  <jas@extundo.com>
 
 	* cipher.c (struct gcry_cipher_handle): Add counter field.
 	(gcry_cipher_open): Add CTR.
 	(cipher_reset): Clear counter field.
 	(do_ctr_encrypt, do_ctr_decrypt): New functions.
 	(cipher_encrypt, cipher_decrypt): Call CTR functions.
 	(gcry_cipher_ctl): Add SET_CTR to set counter.
 
 2003-03-30  Moritz Schulte  <moritz@g10code.com>
 
 	* rsa.c (_gcry_rsa_blind): New function.
 	(_gcry_rsa_unblind): New function.
 	(_gcry_rsa_decrypt): Use _gcry_rsa_blind and _gcry_rsa_decrypt.
 
 2003-03-26  Moritz Schulte  <moritz@g10code.com>
 
 	* dynload.c (_gcry_enum_gnupgext_pubkeys): Adjust `encrypt' and
 	`decrypt' function arguments.
 	(_gcry_enum_gnupgext_pubkeys): Likewise.
 	* dynload.h: Likewise.
 	
 	* pubkey.c (dummy_decrypt): Add argument: int flags.
 	(dummy_encrypt): Likewise.
 
 	* elgamal.c (_gcry_elg_encrypt): Add argument: int flags.
 	(_gcry_elg_decrypt): Likewise.
 
 	* rsa.c (_gcry_rsa_encrypt): Add argument: int flags.
 	(_gcry_rsa_decrypt): Likewise.
 
 	* pubkey.c: Add `flags' argument to members `encrypt' and
 	`decrypt' of struct `pubkey_table_s'.
 
 	* rsa.h: Add `flags' argument to function declarations.
 	* elgamal.h: Likewise.
 
 	* pubkey.c (sexp_data_to_mpi): New variable: int parsed_flags.
 	(sexp_data_to_mpi): Set `parsed_flags'.
 	(sexp_data_to_mpi): New argument: int *flags.
 	(gcry_pk_encrypt): New variable: int flags.
 	(gcry_pk_encrypt): Pass `flags' to pubkey_encrypt.
 	(pubkey_encrypt): New variable: int flags.
 	(pubkey_encrypt): Pass `flags' to pubkey encrypt function.
 	(pubkey_decrypt): Likewise.
 	(pubkey_decrypt): Pass `flags' to pubkey encrypt function.
 	(gcry_pk_encrypt): Include `flags' s-exp in return list.
 	(sexp_to_enc): New argument: int *flags.
 	(gcry_pk_decrypt): New variable: int flags.
 	(gcry_pk_decrypt): Pass `flags' to pubkey_decrypt.
 	(sexp_to_enc): New variable: int parsed_flags.
 	(sexp_to_enc): Set `parsed_flags'.
 
 2003-03-22  Simon Josefsson  <jas@extundo.com>
 
 	* cipher.c (gcry_cipher_open, do_cbc_encrypt)
 	(gcry_cipher_encrypt): Support GCRY_CIPHER_CBC_MAC.
 	(gcry_cipher_ctl): Support GCRYCTL_SET_CBC_MAC.
 
 2003-03-19  Werner Koch  <wk@gnupg.org>
 
 	* primegen.c (gen_prime): New args EXTRA_CHECK and EXTRA_CHECK_ARG
 	to allow for a user callback.  Changed all callers.
 	(_gcry_generate_secret_prime)
 	(_gcry_generate_public_prime): Ditto, pass them to gen_prime.
 	* rsa.c (check_exponent): New.
 	(generate): Use a callback to ensure that a given exponent is
 	actually generated.
 
 2003-03-12  Moritz Schulte  <moritz@g10code.com>
 
 	* primegen.c: Initialize `no_of_small_prime_numbers' statically.
 	(gen_prime): Remove calculation of `no_of_small_prime_numbers'.
 
 2003-03-03  Moritz Schulte  <moritz@g10code.com>
 
 	* md.c (gcry_md_ctl): Rewritten to use same style like the other
 	functions dispatchers.
 
 2003-03-02  Moritz Schulte  <moritz@g10code.com>
 
 	* cipher.c (struct gcry_cipher_handle): New member: algo_index.
 	(gcry_cipher_open): Allocate memory for two cipher contexts.
 	Initialize algo_index.
 	(cipher_setkey): Duplicate context into reserved memory.
 	(cipher_reset): New function, which resets the context and clear
 	the IV.
 	(gcry_cipher_ctl): Call cipher_reset.
 
 2003-02-23  Moritz Schulte  <moritz@g10code.com>
 
 	* cipher.c: Remove (bogus) `digitp' macro definition.
 	* md.c: Likewise.
 
 	* blowfish.c (burn_stack): Removed.
 	* arcfour.c (burn_stack): Likewise.
 	* cast5.c (burn_stack): Likewise.
 	* des.c (burn_stack): Likewise.
 	* md4.c (burn_stack): Likewise.
 	* md5.c (burn_stack): Likewise.
 	* random.c (burn_stack): Likewise.
 	* rijndael.c (burn_stack): Likewise.
 	* rmd160.c (burn_stack): Likewise.
 	* sha1.c (burn_stack): Likewise.
 	* sha256.c (burn_stack): Likewise.
 	* tiger.c (burn_stack): Likewise.
 	* twofish.c (burn_stack): Likewise.
 
 	* blowfish.c: Changed all occurences of burn_stack to
 	_gcry_burn_stack.
 	* arcfour.c: Likewise.
 	* cast5.c: Likewise.
 	* des.c: Likewise.
 	* md4.c: Likewise.
 	* md5.c: Likewise.
 	* random.c: Likewise.
 	* rijndael.c: Likewise.
 	* rmd160.c: Likewise.
 	* sha1.c: Likewise.
 	* sha256.c: Likewise.
 	* tiger.c: Likewise.
 	* twofish.c: Likewise.
 
 	* arcfour.c (_gcry_arcfour_get_info): Use GCRY_CIPHER_ARCFOUR
 	instead of hard-coded value `301'.
 
 2003-01-24  Werner Koch  <wk@gnupg.org>
 
 	* random.c (_gcry_register_random_progress): New.
 	(_gcry_random_progress): New.
 
 	* rndlinux.c (gather_random): Call the random progress function. 
 
 2003-01-23  Werner Koch  <wk@gnupg.org>
 
 	* rsa.c (generate): New arg USE_E to request a specific public
 	exponent.
 	(_gcry_rsa_generate): Ditto.
 	* elgamal.c (_gcry_elg_generate): Must add an dummy argument
 	instead of USE_E.
 	* dsa.c (_gcry_dsa_generate): Ditto.
 	* pubkey.c (dummy_generate): Ditto.
 	(pubkey_generate): Add USE_E arg and pass it down.
 	(gcry_pk_genkey): Detect "rsa-use-e" parameter and pass it to generate.
 
 	* pubkey.c (sexp_to_enc): New arg RET_MODERN.
 	(gcry_pk_decrypt): Make use of it to return a real S-expression.
 	Return better error codes.
 	(gcry_pk_verify): Return better error codes.
 
 2003-01-21  Werner Koch  <wk@gnupg.org>
 
 	* random.c (gcry_random_add_bytes): Add QUALITY argument, let
 	function return an error code and disable its core for now.
 
 2003-01-21  Timo Schulz  <twoaday@freakmail.de>
 
 	* random.c (gcry_random_add_bytes): New. Function to add external
 	random to the pool.
 	
 2003-01-20  Simon Josefsson  <jas@extundo.com>
 
 	* crc.c: New.
 	* Makefile.am (EXTRA_PROGRAMS, EXTRA_crc_SOURCES): Add crc.c.
 	* md.c (gcry_md_get_algo_dlen): Add values for CRC.
 
 2003-01-20  Werner Koch  <wk@gnupg.org>
 
 	* sha256.c: New.
 	* bithelp.h (ror): New.
 	* Makfile.am: Add sha256.c.
 	* md.c (oid_table): Add values for SHA256 et al.
 	(gcry_md_get_algo_dlen): Likewise
 
 2003-01-20  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c (gcry_pk_get_keygrip): Implemented keygrips for DSA
 	and ElGamal.
 
 2003-01-17  Werner Koch  <wk@gnupg.org>
 
 	* cipher.c (gcry_cipher_encrypt): Reworked so that the output will
 	never contain the plaintext even if the caller did not checked the
 	return value.
 
 	* md.c (gcry_md_get_algo): Changed error code to GCRYERR_GENERAL
 	because we don't have an invalid md algo but no algorithm enabled.
 
 	* pubkey.c (gcry_pk_genkey): Changed error code for bounds check
 	of table parameters to GCRYERR_INTERNAL.
 
 	* md.c (gcry_md_open): Partly reverted Timo's change from
 	2002-10-10 by removing the check for the algorithm.  An algorithm
 	of 0 is allowed and anyway we should not double check it or check
 	it using a different function.  Also fixed the flags check.
 
 	* pubkey.c (gcry_pk_encrypt): Make sure that R_CIPH points to NULL
 	on error.
 	(gcry_pk_decrypt): Ditto for R_PLAIN.
 	(gcry_pk_sign): Ditto for R_SIG.
 	(gcry_pk_genkey): Ditto for R_KEY.
 
 2003-01-16  Werner Koch  <wk@gnupg.org>
 
 	* md.c (gcry_md_write): Changed 2nd argument type to void*.
 	(gcry_md_hash_buffer): Changed type of boths buffers to void*.
 	(gcry_md_setkey): Changed 2nd argument type to void*.
 
 2003-01-15  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c (sexp_data_to_mpi): New.  This handles pkcs1 padding.
 	(gcry_pk_sign, gcry_pk_verify): Use it here.
 	(gcry_pk_encrypt): And here.
 	(pubkey_verify): Add debug code.
 	(sexp_to_enc): Handle flags in the input and return the pkcs1 flag
 	in a new parameter.
 	(gcry_pk_decrypt): Prepare for future pkcs1 handling.
 
 2002-12-19  Werner Koch  <wk@gnupg.org>
 
 	* random.c (_gcry_random_initialize): New.
 
 2002-12-16  Werner Koch  <wk@gnupg.org>
 
 	* cipher.c: Added a Teletrust specific OID for 3DES.
 
 2002-12-12  Werner Koch  <wk@gnupg.org>
 
 	* md.c: Added another oddball OIW OID (sha-1WithRSAEncryption).
 
 2002-11-23  Werner Koch  <wk@gnupg.org>
 
 	* md.c (load_digest_module): Enlarged checked_algos bitmap.
 	* md4.c (func_table):  Fixed entry for md4. 
 	Both by Simon Josephson.
 	(transform): Copy data to get the alignment straight. Tested only
 	on i386.
 
 2002-11-10  Simon Josefsson  <jas@extundo.com>
 
 	* cipher.c (gcry_cipher_open): Don't reject CTS flag.
 	(do_cbc_encrypt, do_cbc_decrypt, cipher_encrypt) 
 	(gcry_cipher_encrypt, cipher_decrypt)
 	(gcry_cipher_decrypt): Support CTS flag.
 	(gcry_cipher_ctl): Toggle CTS flag.
 
 2002-11-10  Werner Koch  <wk@gnupg.org>
 
 	* md4.c: New. By Simon Josefsson.
 	* Makefile.am (EXTRA_PROGRAMS): Add md4.c. 
 	* md.c (oid_table,gcry_md_get_algo_dlen): MD4 support. 
 
 2002-10-14  Werner Koch  <wk@gnupg.org>
 
 	* arcfour.c (do_encrypt_stream): Don't use increment op when
 	assigning to the same variable.
 
 2002-10-10  Timo Schulz  <ts@winpt.org>
 
 	* pubkey.c (gcry_pk_genkey): Check boundaries.
 	
 	* md.c (gcry_md_open): Check that algo is available and only
 	valid flag values are used.
 	(gcry_md_get_algo): Add error handling.
 	
 2002-09-26  Werner Koch  <wk@gnupg.org>
 
 	* md.c: Include an OID for TIGER.
 	* tiger.c (tiger_get_info): Use a regular OID.
 
 2002-09-17  Werner Koch  <wk@gnupg.org>
 
 	* random.c: Replaced mutex.h by the new ath.h.  Changed all calls.
 
 2002-09-16  Werner Koch  <wk@gnupg.org>
 
 	* arcfour.c (do_encrypt_stream): Use register modifier and modulo.
 	According to Nikos Mavroyanopoulos this increases perfromace on
 	i386 system noticable.  And I always tought gcc is clever enough.
 	* md5.c (transform): Use register modifier.
 	* rmd160.c (transform): Ditto.
 	* sha1.c (transform): Ditto.  We hope that there are 6 free registers.
 	* random.c (gcry_randomize): Rewrote to avoid malloc calls.
 
 	* rndlinux.c (gather_random): Replaced remaining fprintfs by log_*.
 	* arcfour.c (do_arcfour_setkey): Ditto.
 	* twofish.c (do_twofish_setkey): Ditto.
 	* rndegd.c (gather_random): Ditto.
 	* rijndael.c (do_setkey): Ditto.
 	* random.c (_gcry_random_dump_stats): Ditto. 
 	* primegen.c (_gcry_generate_elg_prime): Ditto.
 	* des.c (_gcry_des_get_info): Ditto.
 	* cast5.c (do_cast_setkey): Ditto.
 	* blowfish.c (do_bf_setkey): Ditto.
 
 2002-08-26  Werner Koch  <wk@gnupg.org>
 
 	* des.c (weak_keys): Fixed one entry in the table and compared
 	all entries against the literature.
 	(selftest): Checksum the weak key table.
 
 2002-08-21  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c: Enable keygrip calculation for "openpgp-rsa".
 
 2002-08-17  Werner Koch  <wk@gnupg.org>
 
 	* cipher.c (setup_cipher_table): Don't overwrite the DES entry
 	with the entry for DUMMY.
 
 2002-08-14  Werner Koch  <wk@gnupg.org>
 
 	* des.c (do_des_setkey,do_des_encrypt, do_des_decrypt): New.
 	(_gcry_des_get_info): Support plain old DES.
 	* cipher.c (setup_cipher_table): Put DES into the table.
 
 2002-07-25  Werner Koch  <wk@gnupg.org>
 
 	* rndunix.c (_gcry_rndunix_constructor): Prefixed with _gcry_.
 	Noted by Stephan Austermuehle.
 
 2002-07-08  Timo Schulz  <ts@winpt.org>
 
 	* rndw32.c: Replaced the m_ memory functions with the real 
 	gcry_ functions. Renamed all g10_ prefixed functions to log_.
 	
 2002-06-12  Werner Koch  <wk@gnupg.org>
 
 	* rsa.c (generate): Use e = 65537 for now.
 
 2002-06-11  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c (gcry_pk_get_keygrip): Allow a "protected-private-key".
 
 2002-06-05  Timo Schulz  <ts@winpt.org>
 
 	* cipher.c (gcry_cipher_encrypt, gcry_cipher_decrypt):
 	Check that the input size is a multiple of the blocksize.
 	
 2002-05-23  Werner Koch  <wk@gnupg.org>
 
 	* md.c (oid_table): Add an rsadsi OID for MD5.
 
 2002-05-21  Werner Koch  <wk@gnupg.org>
 
 	* primegen.c, elgamal.c, dsa.c (progress): Do not print anything
 	by default.  Pass an extra identifying string to the callback and
 	reserved 2 argumenst for current and total counters.  Changed the
 	register function prototype.
 
 2002-05-17  Werner Koch  <wk@gnupg.org>
 
 	* rndegd.c (rndegd_constructor): Fixed name of register function
 	and prefixed the function name with _gcry_.
 	* rndw32.c (rndw32_constructor): Ditto.
 	* tiger.c (tiger_constructor): Ditto.
 
 	* Makefile.am: Removed all dynamic loading stuff.
 	* dynload.c: Ditto. Now only used for the constructor system.
 
 2002-05-15  Werner Koch  <wk@gnupg.org>
 
 	* random.c (gcry_random_bytes,gcry_random_bytes_secure)
 	(gcry_randomize): Make sure we are initialized.
 
 2002-05-14  Werner Koch  <wk@gnupg.org>
 
 	Changed license of most files to the LGPL.
 
 2002-05-02  Werner Koch  <wk@gnupg.org>
 
 	* random.c (_gcry_fast_random_poll): Initialize the module so the
 	mutex can be used.
 
 	* primegen.c (small_prime_numbers): Moved table from smallprime.c
 	* smallprime.c: File removed.
 
 	* des.c (leftkey_swap, rightkey_swap, working_memcmp): Made static.
 
 	* cipher.c (gcry_cipher_map_name): Map "RIJNDAEL" to "AES".
 	* rijndael.c (rijndael_get_info): We do only support a 128 bit
 	blocksize so it makes sense to change the algorithm strings to
 	AES.
 
 	* tiger.c (tiger_final): Removed superfluous token pasting operators.
 	* md5.c (md5_final): Ditto.
 
 2002-04-30  Werner Koch  <wk@gnupg.org>
 
 	* cipher.c: Fixed list of copyright years.
 
 2002-03-18  Werner Koch  <wk@gnupg.org>
 
 	* random.c (initialize): Initialize the new pool lock mutex.
 	(_gcry_fast_random_poll): Add locking and moved main
 	code out to...
 	(do_fast_random_poll): new function.
 	(read_pool): Use the new function here.
 	(get_random_bytes): Add locking.
 	(_gcry_update_random_seed_file): Ditto.
 
 2002-03-11  Werner Koch  <wk@gnupg.org>
 
 	* md.c: Add rsaSignatureWithripemd160 to OID table.
 
 2002-02-20  Werner Koch  <wk@gnupg.org>
 
 	* sha1.c: Removed a left over comment note.  The code has been
 	rewritten from scratch in 1998.  Thanks to Niels Möller for
 	reporting this misleading comment.
 
 2002-02-18  Werner Koch  <wk@gnupg.org>
 
 	* rndunix.c (rndunix_constructor): Use the the new prefixed
 	function name.  Reported by Jordi Mallach.
 
 2002-02-10  Werner Koch  <wk@gnupg.org>
 
 	* random.c (mix_pool): Carry an extra failsafe_digest buffer
 	around to make the function more robust.
 
 2002-02-08  Werner Koch  <wk@gnupg.org>
 
 	* random.c (add_randomness): Xor new data into the pool and not
 	just copy it.  This avoids any choosen input attacks which are not
 	serious in our setting because an outsider won't be able to mix
 	data in and even then we keep going with a PRNG.  Thanks to Stefan
 	Keller for pointing this out.
 
 2002-01-04  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c (gcry_pk_genkey): Do not release skey - it is static.
 
 	* primegen.c (gen_prime): Of course we should use set_bit
 	and not set_highbit to set the second high bit.
 
 2001-12-18  Werner Koch  <wk@gnupg.org>
 
 	* rsa.c (generate): Loop until we find the exact modulus size.
 	Changed the exponent to 41.
 	(rsa_get_info): s/usage/r_usage/ to avoid shadow warnings.
 	* primegen.c (gen_prime): Set 2 high order bits for secret primes.
 
 	* Makefile.am (DISTCLEANFILES): Include construct.c.
 
 2001-12-17  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c (gcry_pk_get_keygrip): New - experimental.
 
 2001-12-11  Werner Koch  <wk@gnupg.org>
 
 	* cipher.c: Added OIDs for AES.
 	(gcry_cipher_mode_from_oid): New.
 	(gcry_cipher_map_name): Moved OID search code to ..
 	(search_oid): .. new function.
 
 2001-12-10  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c (gcry_pk_encrypt): Find the signature algorithm by name
 	and not by number.
 	
 	* pubkey.c (gcry_pk_encrypt,gcry_pk_decrypt,gcry_pk_sign)
 	(gcry_pk_verify,gcry_pk_testkey, gcry_pk_genkey)
 	(gcry_pk_get_nbits): Release the arrays.  Noted by Nikos
 	Mavroyanopoulos.
 
 2001-12-06  Werner Koch  <wk@gnupg.org>
 
 	* cipher.c (gcry_cipher_map_name): Look also for OIDs prefixed
 	with "oid."  or "OID.".
 
 2001-12-05  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c (algo_info_table): Fixed entry for openpgp-rsa. 
 
 2001-11-24  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c: Added the rsaEncryption OID to the tables.
 	(sexp_to_key): Add an arg to return the index of the algorithm,
 	changed all callers.
 	(gcry_pk_sign): Find the signature algorithm by name and not by
 	number.
 	(gcry_pk_get_nbits): Fixed so that we can now really pass a secret
 	key to get the result.
 	
 	* md.c (gcry_md_map_name): Look also for OIDs prefixed with "oid."
 	or "OID." so that an OID string can be used as an S-Exp token.
 
 2001-11-20  Werner Koch  <wk@gnupg.org>
 
 	* md.c (gcry_md_map_name): Lookup by OID if the the name begins
 	with a digit.
 	(oid_table): New.
 	
 2001-11-16  Werner Koch  <wk@gnupg.org>
 
 	* md.c (gcry_md_info): New operator GCRYCTL_IS_ALGO_ENABLED.
 
 2001-11-07  Werner Koch  <wk@gnupg.org>
 
 	* md.c (gcry_md_hash_buffer): Close the handle which was left open
 	for algorithms other than rmd160.
 
 2001-08-08  Werner Koch  <wk@gnupg.org>
 
 	* rndw32.c (gather_random): Use toolhelp in addition to the NT
 	gatherer for Windows2000.  Suggested by Sami Tolvanen.
 
 	* random.c (read_pool): Fixed length check, this used to be one
 	byte to strict.  Made an assert out of it because the caller has
 	already made sure that only poolsize bytes are requested.
 	Reported by Marcus Brinkmann.
 
 2001-08-03  Werner Koch  <wk@gnupg.org>
 
 	* cipher.c (cipher_encrypt, cipher_decrypt): Prepare to return
 	errors. We have to change the interface to all ciphers to make
 	this really work but we should do so to prepare for hardware
 	encryption modules.
 	(gcry_cipher_encrypt, gcry_cipher_decrypt): Return the error and
 	set lasterr. 
 	(gcry_cipher_ctl): Make sure that errors from setkey are returned.
 
 2001-08-02  Werner Koch  <wk@gnupg.org>
 
 	* rndlinux.c (gather_random): casted a size_t arg to int so that
 	the format string is correct.  Casting is okay here and avoids
 	translation changes. 
 
 	* random.c (fast_random_poll): Do not check the return code of
 	getrusage.
 
 	* rndunix.c: Add a signal.h header to avoid warnings on Solaris 7
 	and 8.
 
 	* tiger.c (print_abc,print_data): Removed.
 
 	* rijndael.c, des.c, blowfish.c, twofish.c, cast5.c, arcfour.c
 	(burn_stack): New.  Add wrappers for most functions to be able to
 	call burn_stack after the function invocation. This methods seems
 	to be the most portable way to zeroise the stack used. It does
 	only work on stack frame based machines but it is highly portable
 	and has no side effects.  Just setting the automatic variables at
 	the end of a function to zero does not work well because the
 	compiler will optimize them away - marking them as volatile would
 	be bad for performance.
 	* md5.c, sha1.c, rmd160.c, tiger.c (burn_stack): Likewise.
 	* random.c (burn_stack): New.
 	(mix_pool): Use it here to burn the stack of the mixblock function.
 
 	* primegen.c (_gcry_generate_elg_prime): Freed q at 3 places.
 	Thanks to Tommi Komulainen.
 
 	* arcfour.c (arcfour_setkey): Check the minimim keylength against
 	bytes and not bits.
 	(selftest): Must reset the key before decryption. 
 
 2001-05-31  Werner Koch  <wk@gnupg.org>
 
 	* sha1.c (sha1_init): Made static.
 
         Changed all g10_ prefixed function names as well as some mpi_
 	function names to cope with the introduced naming changes.
 	
 	* md.c (prepare_macpads): Made key const.
 
 2001-05-28  Werner Koch  <wk@gnupg.org>
 
 	* rndegd.c (gather_random): Removed the use of tty_printf.
 
 2001-03-29  Werner Koch  <wk@gnupg.org>
 
 	* md5.c (md5_final): Fixed calculation of hashed length.  Thanks
 	to disastry@saiknes.lv for pointing out that it was horrible wrong
 	for more than 512MB of input.
 	* sha1.c (sha1_final): Ditto.
 	* rmd160.c (rmd160_final): Ditto.
 	* tiger.c (tiger_final): Ditto.
 
 	* blowfish.c (encrypt,do_encrypt): Changed name to do_encrypt to
 	avoid name clashes with an encrypt function in stdlib.h of
 	Dynix/PIX.  Thanks to Gene Carter.
 	* elgamal.c (encrypt,do_encrypt): Ditto.
 
 	* twofish.c (gnupgext_enum_func): Use only when when compiled as a
 	module.
 	* rijndael.c (gnupgext_enum_func): Ditto.
 
 	* tiger.c (tiger_get_info): Return "TIGER192" and not just
 	"TIGER".  By Edwin Woudt.
 	
 	* random.c: Always include time.h - standard requirement.  Thanks
 	to James Troup.
 
 	* rndw32.c: Fixes to the macros.
 
 2001-01-11  Werner Koch  <wk@gnupg.org>
 
 	* cipher.c (cipher_encrypt,gcry_cipher_encrypt): Use blocksize and
 	not 8.
 
 2000-12-19  Werner Koch  <wk@gnupg.org>
 
  	Major change:
 	Removed all GnuPG stuff and renamed this piece of software
 	to gcrypt. 
 
 2000-11-14  Werner Koch  <wk@gnupg.org>
 
 	* dsa.c (test_keys): Replaced mpi_alloc by gcry_mpi_new and
 	mpi_free by gcry_mpi_release.
 	* elgamal.c (test_keys,generate): Ditto, also for mpi_alloc_secure.
 	* rsa.c (test_keys,generate,rsa_verify): Ditto.
 	* primegen.c (generate_elg_prime): Ditto.
 	(gen_prime): Ditto and removed nlimbs.
 
 	* rsa.c (generate): Allocate 2 more vars in secure memory.
 
 	* Makefile.am (OMIT_DEPENDENCIES): Hack to work around dependency
 	problems.
 
 2000-10-09  Werner Koch  <wk@gnupg.org>
 
 	* arcfour.c, arcfour.h: New.
 	* cipher.c (cipher_encrypt, cipher_decrypt): Add stream mode.
 	(setup_cipher_table): Add Arcfour.
 	(gcry_cipher_open): Kludge to allow stream mode.
 
 Wed Oct  4 13:16:18 CEST 2000  Werner Koch  <wk@openit.de>
 
         * sha1.c (transform): Use rol() macro.  Actually this is not needed
         for a newer gcc but there are still aoter compilers.
 
         * rsa.c (test_keys): Use new random function. 
 
         * md.c (gcry_md_setkey): New function to overcome problems with
         const conflics.  
         (gcry_md_ctl): Pass set key to the new functions.
 
         * rijndael.c: New.
         * cipher.c: Add Rijndael support.
 
 Mon Sep 18 16:35:45 CEST 2000  Werner Koch  <wk@openit.de>
 
         * rndlinux.c (open_device): Loose random device checking.
         By Nils Ellmenreich.
 
         * random.c (fast_random_poll): Check ENOSYS for getrusage.
         * rndunix.c:  Add 2 sources for QNX. By Sam Roberts.
 
         * pubkey.c (gcry_pk_algo_info): Add GCRYCTL_GET_ALGO_USAGE.
 
         * rsa.c: Changed the comment about the patent.
         (secret): Speed up by using the CRT.  For a 2k keys this
         is about 3 times faster.
         (stronger_key_check): New but unused code to check the secret key.
         * Makefile.am: Included rsa.[ch].
         * pubkey.c: Enabled RSA support.
         (pubkey_get_npkey): Removed RSA workaround.
 
 Mon Jul 31 10:04:47 CEST 2000  Werner Koch  <wk@openit.de>
 
   * pubkey.c: Replaced all gcry_sexp_{car,cdr}_{data,mpi} by the new
   gcry_sexp_nth_{data,mpi} functions.
 
 Tue Jul 25 17:44:15 CEST 2000  Werner Koch  <wk@openit.de>
 
   * pubkey.c (exp_to_key,sexp_to_sig,sexp_to_enc,gcry_pk_encrypt,
     gcry_pk_decrypt,gcry_pk_sign,gcry_pk_genkey): Changed to work with
     the new S-Exp interface.
 
 Mon Jul 17 16:35:47 CEST 2000  Werner Koch  <wk@>
 
   * random.c (gather_faked): Replaced make_timestamp by time(2) again.
 
 Fri Jul 14 19:38:23 CEST 2000  Werner Koch  <wk@>
 
   * md.c (gcry_md_ctl): Support GCRYCTL_{START,STOP}_DUMP.
 
   * Makefile.am: Never compile mingw32 as module.
 
   * Makefile.am: Tweaked module build and removed libtool
 
   * Makefile.am:  Replaced -O1 by -O. Suggested by Alec Habig.
 
   * elgamal.c (sign): Removed inactive code.
 
   * rsa.c, rsa.h: New based on the old module version (only in CVS for now).
   * pubkey.c (setup_pubkey_table): Added commented support for RSA.
 
   * rndunix.c (waitpid): New. For UTS 2.1.  All by Dave Dykstra.
   (my_popen): Do the FD_CLOEXEC only if it is available
   (start_gatherer): Cope with missing _SC_OPEN_MAX
 
   * rndunix.c: Add some more headers for QNX. By Sam Roberts.
 
   * rndegd.c (gather_random): Shortcut level 0.
   * rndunix.c (gather_random): Ditto.
   * rndw32.c (gather_random): Ditto.
 
   * rndw32.c: Replaced with code from Cryptlib and commented the old stuff.
   * rndw32.c: Add some debuging code enabled by an environment variable.
 
   * random.c (read_seed_file): Binary open for DOSish system
   (update_random_seed_file): Ditto.
   * random.c [MINGW32]: Include process.h for getpid.
   * random.c (fast_random_poll): Add clock_gettime() as fallback for
   system which support this POSIX.4 fucntion. By Sam Roberts.
 
   * random.c (read_seed_file): Removed the S_ISLNK test becuase it
   is already covered by !S_ISREG and is not defined in Unixware.
   Reported by Dave Dykstra.
   (update_random_seed_file): Silently ignore update request when pool
   is not filled.
 
   * random.c (read_seed_file): New.
   (set_random_seed_file): New.
   (read_pool): Try to read the seeding file.
   (update_random_seed_file): New.
 
   (read_pool): Do an initial extra seeding when level 2 quality random
   is requested the first time.	This requestes at least POOLSIZE/2 bytes
   of entropy.  Compined with the seeding file this should make normal
   random bytes cheaper and increase the quality of the random bytes
   used for key generation.
 
   * random.c (read_pool): Print a more friendly error message in
   cases when too much random is requested in one call.
 
   * random.c (fast_random_poll): Check whether RUSAGE_SELF is defined;
   this is not the case for some ESIX and Unixware, although they have
   getrusage().
 
   * primegen.c (generate_elg_prime): All primes are now generated with
   the lowest random quality level.  Because they are public anyway we
   don't need stronger random and by this we do not drain the systems
   entropy so much.
 
   * primegen.c (register_primegen_progress): New.
   * dsa.c (register_pk_dsa_progress): New.
   * elgamal.c (register_pk_elg_progress): New.
 
   * elgamal.c (wiener_map): New.
   (gen_k): Use a much smaller k.
   (generate): Calculate the qbits using the wiener map and
   choose an x at a size comparable to the one choosen in gen_k
 
   * rmd160.c (rmd160_get_info): Moved casting to the left side due to a
   problem with UTS4.3.	Suggested by Dave Dykstra.
   * sha1.c (sha1_get_info): Ditto.
   * tiger.c (tiger_get_info): Ditto.
   * md5.c (md5_get_info): Ditto
   * des.c (des_get_info): Ditto.
   * blowfish.c (blowfish_get_info): Ditto.
   * cast5.c (cast5_get_info): Ditto.
   * twofish.c (twofish_get_info): Ditto.
 
 Fri Mar 24 11:25:45 CET 2000  Werner Koch  <wk@openit.de>
 
 	* md.c (md_open): Add hmac arg and allocate space for the pads.
 	(md_finalize): Add HMAC support.
 	(md_copy): Ditto.
 	(md_close): Ditto.
 	(gcry_md_reset): Ditto.
 	(gcry_md_ctl): Ditto.
 	(prepare_macpdas): New.
 
 Mon Mar 13 19:22:46 CET 2000  Werner Koch  <wk@openit.de>
 
 	* md.c (gcry_md_hash_buffer): Add support for the other algorithms.
 
 Mon Jan 31 16:37:34 CET 2000  Werner Koch  <wk@gnupg.de>
 
 	* genprime.c (generate_elg_prime): Fixed returned factors which never
 	worked for non-DSA keys.
 
 Thu Jan 27 18:00:44 CET 2000  Werner Koch  <wk@gnupg.de>
 
 	* pubkey.c (sexp_to_key): Fixed mem leaks in case of errors.
 
 Mon Jan 24 22:24:38 CET 2000  Werner Koch  <wk@gnupg.de>
 
 	* pubkey.c (gcry_pk_decrypt): Implemented.
 	(gcry_pk_encrypt): Implemented.
 	(gcry_pk_testkey): New.
 	(gcry_pk_genkey): New.
 	(pubkey_decrypt): Made static.
 	(pubkey_encrypt): Ditto.
 	(pubkey_check_secret_key): Ditto.
 	(pubkey_generate): Ditto.
 
 Mon Jan 24 13:04:28 CET 2000  Werner Koch  <wk@gnupg.de>
 
 	* pubkey.c (pubkey_nbits): Removed and replaced by ...
 	(gcry_pk_get_nbits): this new one.
 
 Wed Dec  8 21:58:32 CET 1999  Werner Koch  <wk@gnupg.de>
 
 	* dsa.c: s/mpi_powm/gcry_mpi_powm/g
 	* elgamal.c: Ditto.
 	* primegen.c: Ditto.
 
 	* : Replaced g10_opt_verbose by g10_log_verbosity().
 
 	* Makefile.am (INCLUDES): removed intl, add ../gcrypt
 
 Fri Nov 19 17:15:20 CET 1999  Werner Koch  <wk@gnupg.de>
 
 	* dynload.c (cmp_filenames): New to replaced compare_filename() in
 	module.
 	(register_cipher_extension): Removed the tilde expansion stuff.
 	* rndeg.c (my_make_filename): New.
 
 	* : Replaced header util.h by g10lib.h
 
 	* random.c (gather_faked): Replaced make_timestamp by time(2).
 	Disabled wrning printed with tty_printf.
 	* rndlinux.c (gather_random): Always use fprintf instead of tty_xxx;
 	this should be replaced by a callback function.
 
 	* primegen.c (gen_prime): Use gcry_mpi_randomize.
 	(is_prime): Ditto.
 	* elgamal.c (test_keys): Ditto.
 	* dsa.c (test_keys): Ditto.
 
 	* cipher.c (gcry_cipher_close): Die on invalid handle.
 
 Mon Nov 15 21:36:02 CET 1999  Werner Koch  <wk@gnupg.de>
 
 	* elgamal.c (gen_k): Use the new random API.
 	(generate): Ditto.
 	* dsa.c (gen_k): Ditto.
 	(generate): Ditto.
 
 Sat Nov 13 17:44:23 CET 1999  Werner Koch  <wk@gnupg.de>
 
 	* pubkey.c (disable_pubkey_algo): Made static.
 	(gcry_pk_ctl): New.
 
 	* random.c (get_random_bits): Renamed to ...
 	(get_random_bytes): ... this and made static.
 	(gcry_random_bytes): New.
 	(gcry_random_bytes_secure): New.
 	(randomize_buffer): Renamed to ...
 	(gcry_randomize): ...this.
 
 	* md.c (gcry_md_hash_buffer): New.
 
 	* pubkey.c (gcry_pk_algo_info): 4 new commands.
 	(pubkey_get_npkey): Made static.
 	(pubkey_get_nskey): Made static.
 	(pubkey_get_nsig): Made static.
 	(pubkey_get_nenc): Made static.
 
 	* pubkey.c: Removed all G10ERR_xxx.
 	* cipher.c: Changed all GCRYERR_INV_ALGO to GCRYERR_INV_CIPHER_ALGO.
 	* md.c: Changed all GCRYERR_INV_ALGO to GCRYERR_INV_MD_ALGO.
 	* cast5.c (cast_setkey): Changed errocodes to GCRYERR_xxx.
 	* blowfish.c: Ditto.
 	* des.c: Ditto.
 	* twofish.c: Ditto.
 	* dsa.c: Ditto.
 	* elgamal.c: Ditto.
 
 	* g10c.c: Removed
 
 	* cipher.c (gcry_cipher_open): Replaced alloc functions and return NULL
 	if we are out of core.
 	* dynload.c: Replaced all memory allocation functions.
 	* md.c: Ditto.
 	* primegen.c: Ditto.
 	* pubkey.c: Ditto.
 	* random.c: Ditto.
 	* rndw32.c: Ditto.
 	* elgamal.c: Ditto.
 	* dsa.c: Ditto.
 
 Tue Oct 26 14:10:21 CEST 1999  Werner Koch  <wk@gnupg.de>
 
 	* elgamal.c (sign): Hugh found strange code here. Replaced by BUG().
 
 	* cipher.c: Merged with gcrypt/symapi.c.
 
 	* pubkey.c (string_to_pubkey_algo): Renamed function to ...
 	(gcry_pk_map_name): ... this.
 	(pubkey_algo_to_string): Renamed function to ...
 	(gcry_pk_algo_name): ... this.
 	(gcry_pk_algo_info): New.
 	* pubkey.c: Merged with gcrypt/pkapi.c.
 
 	* md.c (md_reset): Clear finalized; thanks to Ulf Moeller for
 	fixing this bug.
 
 	* md.c: Merged with gcrypt/mdapi.c
 
 Wed Sep 15 14:39:59 CEST 1999  Michael Roth <mroth@nessie.de>
 
 	* des.c: Various speed improvements: One bit pre rotation
 	  trick after initial permutation (Richard Outerbridge).
 	  Finished test of SSLeay Tripple-DES patterns.
 
 Wed Sep 15 16:22:17 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* rndw32.c: New.
 
 Mon Sep 13 10:51:29 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* bithelp.h: New.
 	* rmd160.h, sha1.h, md5.h: Use the rol macro from bithelp.h
 
 Tue Sep  7 16:23:36 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* Makefile.am: Fixed seds for latest egcc. By Ollivier Robert.
 
 Mon Sep  6 19:59:08 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* des.c (selftest): Add some testpattern
 
 Mon Aug 30 20:38:33 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* cipher.c (do_cbc_encrypt): Fixed serious bug occuring when not using
 	in place encryption. Pointed out by Frank Stajano.
 
 Mon Jul 26 09:34:46 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* md5.c (md5_final): Fix for a SCO cpp bug.
 
 Thu Jul 15 10:15:35 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* elgamal.c (elg_check_secret_key,elg_encrypt
 	elg_decrypt,elg_sign,elg_verify): Sanity check on the args.
 	* dsa.c (dsa_check_secret_key,dsa_sign,dsa_verify): Ditto.
 
 	* pubkey.c (disable_pubkey_algo): New.
 	(check_pubkey_algo2): Look at disabled algo table.
 	* cipher.c (disable_cipher_algo): New.
 	(check_cipher_algo): Look at disabled algo table.
 
 Wed Jul  7 13:08:40 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* Makefile.am: Support for libtool.
 
 Fri Jul  2 11:45:54 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* dsa.c (gen_k): Changed algorithm to consume less random bytes
 	* elgamal.c (gen_k): Ditto.
 
 	* random.c (random_dump_stats): New.
 
 Thu Jul  1 12:47:31 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* primegen.c, elgamal.c, dsa.c (progess): New and replaced all
 	fputc with a call to this function.
 
 Sat Jun 26 12:15:59 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* rndegd.c (do_write): s/ssize_t/int/ due to SunOS 4.1 probs.
 
 	* cipher.c (do_cbc_encrypt, do_cbc_decrypt): New.
 
 	* dynload.c (HAVE_DL_SHL_LOAD): Map hpux API to dlopen (Dave Dykstra).
 	* Makefile.am (install-exec-hook): Removed.
 
 Sun May 23 14:20:22 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* cipher.c (setup_cipher_table): Enable Twofish
 
 	* random.c (fast_random_poll): Disable use of times() for mingw32.
 
 Mon May 17 21:54:43 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* dynload.c (register_internal_cipher_extension): Minor init fix.
 
 Tue May  4 15:47:53 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* primegen.c (gen_prime): Readded the Fermat test. Fixed the bug
 	that we didn't correct for step when passing the prime to the
 	Rabin-Miller test which led to bad performance (Stefan Keller).
 	(check_prime): Add a first Fermat test.
 
 Sun Apr 18 10:11:28 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* cipher.c (cipher_setiv): Add ivlen arg, changed all callers.
 
 	* random.c (randomize_buffer): alway use secure memory because
 	we can't use m_is_secure() on a statically allocated buffer.
 
 	* twofish.c: Replaced some macros by a loop to reduce text size.
 	* Makefile.am (twofish): No more need for sed editing.
 
 Fri Apr  9 12:26:25 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* cipher.c (cipher_open): Reversed the changes for AUTO_CFB.
 
 	* blowfish.c: Dropped the Blowfish 160 mode.
 	* cipher.c (cipher_open): Ditto.
 	(setup_cipher_table): Ditto.  And removed support of twofish128
 
 Wed Apr  7 20:51:39 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* random.c (get_random_bits): Can now handle requests > POOLSIZE
 
 	* cipher.c (cipher_open): Now uses standard CFB for automode if
 	the blocksize is gt 8 (according to rfc2440).
 
 	* twofish.c: Applied Matthew Skala's patches for 256 bit key.
 
 Tue Apr  6 19:58:12 CEST 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* random.c (get_random_bits): Can now handle requests > POOLSIZE
 
 	* cipher.c (cipher_open): Now uses standard CFB for automode if
 	the blocksize is gt 8 (according to rfc2440).
 
 Sat Mar 20 11:44:21 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* rndlinux.c (tty_printf) [IS_MODULE]: Removed.
 
 	* rndegd.c (gather_random): Some fixes.
 
 Wed Mar 17 13:09:03 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* rndegd.c (do_read): New.
 	(gather_random): Changed the implementation.
 
 Mon Mar  8 20:47:17 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* dynload.c (DLSYM_NEEDS_UNDERSCORE): Renamed.
 
 Fri Feb 26 17:55:41 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* md.c: Nearly a total rewrote.
 
 Wed Feb 24 11:07:27 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* cipher.c (context): Fixed alignment
 	* md.c: Ditto.
 
 	* rndegd.c: New
 
 Mon Feb 22 20:04:00 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* rndegd.c: New.
 
 Wed Feb 10 17:15:39 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* Makefile.am: Modules are now figured out by configure
 	* construct.c: New. Generated by configure. Changed all modules
 	to work with that.
 	* sha1.h: Removed.
 	* md5.h: Removed.
 
 	* twofish.c: Changed interface to allow Twofish/256
 
 	* rndunix.c (start_gatherer): Die on SIGPIPE.
 
 Wed Jan 20 18:59:49 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* rndunix.c (gather_random): Fix to avoid infinite loop.
 
 Sun Jan 17 11:04:33 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* des.c (is_weak_key): Replace system memcmp due to bugs
 	in SunOS's memcmp.
 	(des_get_info): Return error on failed selftest.
 	* twofish.c (twofish_setkey): Return error on failed selftest or
 	invalid keylength.
 	* cast5.c (cast_setkey): Ditto.
 	* blowfish.c (bf_setkey): Return error on failed selftest.
 
 Tue Jan 12 11:17:18 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* random.c (random_is_faked): New.
 
 	* tiger.c: Only compile if we have the u64 type
 
 Sat Jan  9 16:02:23 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* rndunix.c (gather_random): check for setuid.
 
 	* Makefile.am: Add a way to staically link random modules
 
 Thu Jan  7 18:00:58 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* md.c (md_stop_debug): Do a flush first.
 	(md_open): size of buffer now depends on the secure parameter
 
 Sun Jan  3 15:28:44 CET 1999  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* rndunix.c (start_gatherer): Fixed stupid ==/= bug
 
 1998-12-31  Geoff Keating  <geoffk@ozemail.com.au>
 
 	* des.c (is_weak_key): Rewrite loop end condition.
 
 Tue Dec 29 14:41:47 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* random.c: add unistd.h for getpid().
 	(RAND_MAX): Fallback value for Sun.
 
 Wed Dec 23 17:12:24 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* md.c (md_copy): Reset debug.
 
 Mon Dec 14 21:18:49 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* random.c (read_random_source): Changed the interface to the
 	random gathering function.
 	(gather_faked): Use new interface.
 	* dynload.c (dynload_getfnc_fast_random_poll): Ditto.
 	(dynload_getfnc_gather_random): Ditto.
 	* rndlinux.c (gather_random): Ditto.
 	* rndunix.c (gather_random): Ditto.
 
 Sat Dec 12 18:40:32 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* dynload.c (SYMBOL_VERSION): New to cope with system which needs
 	underscores.
 
 	* rndunix.c: Rewrote large parts
 
 Thu Dec 10 20:15:36 CET 1998  Werner Koch  <wk@isil.d.shuttle.de>
 
 	* dynload.c (load_extension): increased needed verbosity level.
 
 	* random.c (fast_random_poll): Fallback to a default fast random
 	poll function.
 	(read_random_source): Always use the faked entroy gatherer if no
 	gather module is available.
 	* rndlinux.c (fast_poll): Removed.
 	* rndunix.c (fast_poll): Removed.
 
 
 Wed Nov 25 12:33:41 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* rand-*.c: Removed.
 	* rndlinux.c : New.
 	* rndunix.c : New.
 	* random.c : Restructured the interface to the gather modules.
 	(intialize): Call constructor functions
 	(read_radnom_source): Moved to here.
 	* dynload.c (dynload_getfnc_gather_random): New.
 	(dynload_getfnc_fast_random_poll): New.
 	(register_internal_cipher_extension): New.
 	(register_cipher_extension): Support of internal modules.
 
 Sun Nov  8 17:44:36 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* rand-unix.c (read_random_source): Removed the assert.
 
 Mon Oct 19 18:34:30 1998  me,,,  (wk@tobold)
 
 	* pubkey.c: Hack to allow us to give some info about RSA keys back.
 
 Thu Oct 15 11:47:57 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* dynload.c: Support for DLD
 
 Wed Oct 14 12:13:07 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* rand-unix.c: Now uses names from configure for /dev/random.
 
 1998-10-10  SL Baur  <steve@altair.xemacs.org>
 
 	* Makefile.am: fix sed -O substitutions to catch -O6, etc.
 
 Tue Oct  6 10:06:32 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* rand-unix.c (HAVE_GETTIMEOFDAY): Fixed (was ..GETTIMEOFTIME :-)
 	* rand-dummy.c (HAVE_GETTIMEOFDAY): Ditto.
 
 Mon Sep 28 13:23:09 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* md.c (md_digest): New.
 	(md_reset): New.
 
 Wed Sep 23 12:27:02 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* tiger.c (TIGER_CONTEXT): moved "buf", so that it is 64 bit aligned.
 
 Mon Sep 21 06:22:53 1998  Werner Koch  (wk@(none))
 
 	* des.c: Some patches from Michael.
 
 Thu Sep 17 19:00:06 1998  Werner Koch  (wk@(none))
 
 	* des.c : New file from Michael Roth <mroth@nessie.de>
 
 Mon Sep 14 11:10:55 1998  Werner Koch  (wk@(none))
 
 	* blowfish.c (bf_setkey): Niklas Hernaeus patch to detect weak keys.
 
 Mon Sep 14 09:19:25 1998  Werner Koch  (wk@(none))
 
 	* dynload.c (RTLD_NOW): Now defined to 1 if it is undefined.
 
 Mon Sep  7 17:04:33 1998  Werner Koch  (wk@(none))
 
 	* Makefile.am: Fixes to allow a different build directory
 
 Thu Aug  6 17:25:38 1998  Werner Koch,mobil,,,	(wk@tobold)
 
 	* random.c (get_random_byte): Removed and changed all callers
 	to use get_random_bits()
 
 Mon Jul 27 10:30:22 1998  Werner Koch  (wk@(none))
 
 	* cipher.c : Support for other blocksizes
 	(cipher_get_blocksize): New.
 	* twofish.c: New.
 	* Makefile.am: Add twofish module.
 
 Mon Jul 13 21:30:52 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* random.c (read_pool): Simple alloc if secure_alloc is not set.
 	(get_random_bits): Ditto.
 
 Thu Jul  9 13:01:14 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* dynload.c (load_extension): Function now nbails out if
 	the program is run setuid.
 
 Wed Jul  8 18:58:23 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* rmd160.c (rmd160_hash_buffer): New.
 
 Thu Jul  2 10:50:30 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* cipher.c (cipher_open): algos >=100 use standard CFB
 
 Thu Jun 25 11:18:25 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* Makefile.am: Support for extensions
 
 Thu Jun 18 12:09:38 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* random.c (mix_pool): simpler handling for level 0
 
 Mon Jun 15 14:40:48 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* tiger.c: Removed from dist, will reappear as dynload module
 
 Sat Jun 13 14:16:57 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* pubkey.c: Major changes to allow extensions. Changed the inteface
 	of all public key ciphers and added the ability to load extensions
 	on demand.
 
 	* misc.c: Removed.
 
 Wed Jun 10 07:52:08 1998  Werner Koch,mobil,,,	(wk@tobold)
 
 	* dynload.c: New.
 	* cipher.c: Major changes to allow extensions.
 
 Mon Jun  8 22:43:00 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* cipher.c: Major internal chnages to support extensions.
 	* blowfish.c (blowfish_get_info): New and made all internal
 	functions static, changed heder.
 	* cast5.c (cast5_get_info): Likewise.
 
 Mon Jun  8 12:27:52 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* tiger.c (transform): Fix for big endian
 
 	* cipher.c (do_cfb_decrypt): Big endian fix.
 
 Fri May 22 07:30:39 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* md.c (md_get_oid): Add a new one for TIGER.
 
 Thu May 21 13:24:52 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* cipher.c: Add support for a dummy cipher
 
 Thu May 14 15:40:36 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* rmd160.c (transform): fixed sigbus - I should better
 	add Christian von Roques's new implemenation of rmd160_write.
 
 Fri May  8 18:07:44 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* rand-internal.h, rand-unix.c, rand-w32.c, rand_dummy.c: New
 	* random.c: Moved system specific functions to rand-****.c
 
 Fri May  8 14:01:17 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* random.c (fast_random_poll): add call to gethrtime.
 
 Tue May  5 21:28:55 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* elgamal.c (elg_generate): choosing x was not correct, could
 	yield 6 bytes which are not from the random pool, tsss, tsss..
 
 Tue May  5 14:09:06 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* primegen.c (generate_elg_prime): Add arg mode, changed all
 	callers and implemented mode 1.
 
 Mon Apr 27 14:41:58 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* cipher.c (cipher_get_keylen): New.
 
 Sun Apr 26 14:44:52 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* tiger.c, tiger.h: New.
 
 Wed Apr  8 14:57:11 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* misc.c (check_pubkey_algo2): New.
 
 Tue Apr  7 18:46:49 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* cipher.c: New
 	* misc.c (check_cipher_algo): Moved to cipher.c
 	* cast5.c: Moved many functions to cipher.c
 	* blowfish.c: Likewise.
 
 Sat Apr  4 19:52:08 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* cast5.c: Implemented and tested.
 
 Wed Apr  1 16:38:27 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* elgamal.c (elg_generate): Faster generation of x in some cases.
 
 Thu Mar 19 13:54:48 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* blowfish.c (blowfish_decode_cfb): changed XOR operation
 	(blowfish_encode_cfb): Ditto.
 
 Thu Mar 12 14:04:05 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* sha1.c (transform): Rewrote
 
 	* blowfish.c (encrypt): Unrolled for rounds == 16
 	(decrypt): Ditto.
 
 Tue Mar 10 16:32:08 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* rmd160.c (transform): Unrolled the loop.
 
 Tue Mar 10 13:05:14 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* random.c (read_pool): Add pool_balance stuff.
 	(get_random_bits): New.
 
 	* elgamal.c (elg_generate): Now uses get_random_bits to generate x.
 
 
 Tue Mar 10 11:33:51 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* md.c (md_digest_length): New.
 
 Tue Mar 10 11:27:41 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* dsa.c (dsa_verify): Works.
 
 Mon Mar  9 12:59:08 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* dsa.c, dsa.h: Removed some unused code.
 
 Wed Mar  4 10:39:22 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* md.c (md_open): Add call to fast_random_poll.
 	blowfish.c (blowfish_setkey): Ditto.
 
 Tue Mar  3 13:32:54 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* rmd160.c (rmd160_mixblock): New.
 	* random.c: Restructured to start with a new RNG implementation.
 	* random.h: New.
 
 Mon Mar  2 19:21:46 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* gost.c, gost.h: Removed because they did only contain trash.
 
 Sun Mar  1 16:42:29 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* random.c (fill_buffer): removed error message if n == -1.
 
 Fri Feb 27 16:39:34 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* md.c (md_enable): No init if called twice.
 
 Thu Feb 26 07:57:02 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* primegen.c (generate_elg_prime): Changed the progress printing.
 	(gen_prime): Ditto.
 
 Tue Feb 24 12:28:42 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* md5.c, md.5 : Replaced by a modified version of md5.c from
 	GNU textutils 1.22.
 
 Wed Feb 18 14:08:30 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* md.c, md.h : New debugging support
 
 Mon Feb 16 10:08:47 1998  Werner Koch  (wk@isil.d.shuttle.de)
 
 	* misc.c (cipher_algo_to_string): New
 	(pubkey_algo_to_string): New.
 	(digest_algo_to_string): New.
 
 
  Copyright 1998,1999,2000,2001,2002,2003,2004,2005,2006
 	   2007, 2008 Free Software Foundation, Inc.
 
  This file is free software; as a special exception the author gives
  unlimited permission to copy and/or distribute it, with or without
  modifications, as long as this notice is preserved.
 
  This file is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/cipher/Makefile.am b/cipher/Makefile.am
index f1c313cc..f49c6a74 100644
--- a/cipher/Makefile.am
+++ b/cipher/Makefile.am
@@ -1,75 +1,76 @@
 # Makefile for cipher modules
 # Copyright (C) 1998, 1999, 2000, 2001, 2002,
 #               2003 Free Software Foundation, Inc.
 #
 # This file is part of Libgcrypt.
 #
 # Libgcrypt 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.
 #
 # Libgcrypt 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 program; if not, see <http://www.gnu.org/licenses/>.
 
 # Process this file with automake to produce Makefile.in
 
 EXTRA_DIST = Manifest
 
 # Need to include ../src in addition to top_srcdir because gcrypt.h is
 # a built header.
 AM_CPPFLAGS = -I../src -I$(top_srcdir)/src 
 AM_CFLAGS = $(GPG_ERROR_CFLAGS)
 
 
 noinst_LTLIBRARIES = libcipher.la
 
 GCRYPT_MODULES = @GCRYPT_CIPHERS@ @GCRYPT_PUBKEY_CIPHERS@ @GCRYPT_DIGESTS@
 
 libcipher_la_DEPENDENCIES = $(GCRYPT_MODULES)
 libcipher_la_LIBADD = $(GCRYPT_MODULES)
 
 libcipher_la_SOURCES = \
 cipher.c pubkey.c ac.c md.c \
 hmac-tests.c \
 bithelp.h  \
 primegen.c  \
+hash-common.c hash-common.h \
 rmd.h
 
 EXTRA_libcipher_la_SOURCES = \
 arcfour.c \
 blowfish.c \
 cast5.c \
 crc.c \
 des.c \
 dsa.c \
 elgamal.c \
 ecc.c \
 md4.c \
 md5.c \
 rijndael.c rijndael-tables.h \
 rmd160.c \
 rsa.c \
 seed.c \
 serpent.c \
 sha1.c \
 sha256.c \
 sha512.c \
 tiger.c \
 whirlpool.c \
 twofish.c \
 rfc2268.c \
 camellia.c camellia.h camellia-glue.c
 
 
 # We need to lower the optimization for this module.
 tiger.o: $(srcdir)/tiger.c
 	`echo $(COMPILE) -c $(srcdir)/tiger.c | sed -e 's/-O[2-9s]*/-O1/g' `
 
 tiger.lo: $(srcdir)/tiger.c
 	`echo $(LTCOMPILE) -c $(srcdir)/tiger.c | sed -e 's/-O[2-9s]*/-O1/g' `
diff --git a/cipher/des.c b/cipher/des.c
index dcc4a6bf..32c085a2 100644
--- a/cipher/des.c
+++ b/cipher/des.c
@@ -1,1160 +1,1163 @@
 /* des.c - DES and Triple-DES encryption/decryption Algorithm
  * Copyright (C) 1998, 1999, 2001, 2002, 2003 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
  * Libgcrypt 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.
  *
  * Libgcrypt 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 program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
  *
  * For a description of triple encryption, see:
  *   Bruce Schneier: Applied Cryptography. Second Edition.
  *   John Wiley & Sons, 1996. ISBN 0-471-12845-7. Pages 358 ff.
  * This implementation is according to the definition of DES in FIPS
  * PUB 46-2 from December 1993. 
  */
 
 
 /*
  * Written by Michael Roth <mroth@nessie.de>, September 1998
  */
 
 
 /*
  *  U S A G E
  * ===========
  *
  * For DES or Triple-DES encryption/decryption you must initialize a proper
  * encryption context with a key.
  *
  * A DES key is 64bit wide but only 56bits of the key are used. The remaining
  * bits are parity bits and they will _not_ checked in this implementation, but
  * simply ignored.
  *
  * For Triple-DES you could use either two 64bit keys or three 64bit keys.
  * The parity bits will _not_ checked, too.
  *
  * After initializing a context with a key you could use this context to
  * encrypt or decrypt data in 64bit blocks in Electronic Codebook Mode.
  *
  * (In the examples below the slashes at the beginning and ending of comments
  * are omited.)
  *
  * DES Example
  * -----------
  *     unsigned char key[8];
  *     unsigned char plaintext[8];
  *     unsigned char ciphertext[8];
  *     unsigned char recoverd[8];
  *     des_ctx context;
  *
  *     * Fill 'key' and 'plaintext' with some data *
  *     ....
  *
  *     * Set up the DES encryption context *
  *     des_setkey(context, key);
  *
  *     * Encrypt the plaintext *
  *     des_ecb_encrypt(context, plaintext, ciphertext);
  *
  *     * To recover the orginal plaintext from ciphertext use: *
  *     des_ecb_decrypt(context, ciphertext, recoverd);
  *
  *
  * Triple-DES Example
  * ------------------
  *     unsigned char key1[8];
  *     unsigned char key2[8];
  *     unsigned char key3[8];
  *     unsigned char plaintext[8];
  *     unsigned char ciphertext[8];
  *     unsigned char recoverd[8];
  *     tripledes_ctx context;
  *
  *     * If you would like to use two 64bit keys, fill 'key1' and'key2'
  *	 then setup the encryption context: *
  *     tripledes_set2keys(context, key1, key2);
  *
  *     * To use three 64bit keys with Triple-DES use: *
  *     tripledes_set3keys(context, key1, key2, key3);
  *
  *     * Encrypting plaintext with Triple-DES *
  *     tripledes_ecb_encrypt(context, plaintext, ciphertext);
  *
  *     * Decrypting ciphertext to recover the plaintext with Triple-DES *
  *     tripledes_ecb_decrypt(context, ciphertext, recoverd);
  *
  *
  * Selftest
  * --------
  *     char *error_msg;
  *
  *     * To perform a selftest of this DES/Triple-DES implementation use the
  *	 function selftest(). It will return an error string if there are
  *	 some problems with this library. *
  *
  *     if ( (error_msg = selftest()) )
  *     {
  *	   fprintf(stderr, "An error in the DES/Tripple-DES implementation occured: %s\n", error_msg);
  *	   abort();
  *     }
  */
 
 
 #include <config.h>
 #include <stdio.h>
 #include <string.h>	       /* memcpy, memcmp */
 #include "types.h"             /* for byte and u32 typedefs */
 #include "g10lib.h"
 #include "cipher.h"
 
 #if defined(__GNUC__) && defined(__GNU_LIBRARY__)
 #define working_memcmp memcmp
 #else
 /*
  * According to the SunOS man page, memcmp returns indeterminate sign
  * depending on whether characters are signed or not.
  */
 static int
 working_memcmp( const char *a, const char *b, size_t n )
 {
     for( ; n; n--, a++, b++ )
 	if( *a != *b )
 	    return (int)(*(byte*)a) - (int)(*(byte*)b);
     return 0;
 }
 #endif
 
 /*
  * Encryption/Decryption context of DES
  */
 typedef struct _des_ctx
   {
     u32 encrypt_subkeys[32];
     u32 decrypt_subkeys[32];
   }
 des_ctx[1];
 
 /*
  * Encryption/Decryption context of Triple-DES
  */
 typedef struct _tripledes_ctx
   {
     u32 encrypt_subkeys[96];
     u32 decrypt_subkeys[96];
   }
 tripledes_ctx[1];
 
 static void des_key_schedule (const byte *, u32 *);
 static int des_setkey (struct _des_ctx *, const byte *);
 static int des_ecb_crypt (struct _des_ctx *, const byte *, byte *, int);
 static int tripledes_set2keys (struct _tripledes_ctx *,
                                const byte *, const byte *);
 static int tripledes_set3keys (struct _tripledes_ctx *,
                                const byte *, const byte *, const byte *);
 static int tripledes_ecb_crypt (struct _tripledes_ctx *,
                                 const byte *, byte *, int);
 static int is_weak_key ( const byte *key );
 static const char *selftest (void);
 
 static int initialized;
 
 
 
 
 /*
  * The s-box values are permuted according to the 'primitive function P'
  * and are rotated one bit to the left.
  */
 static u32 sbox1[64] =
 {
   0x01010400, 0x00000000, 0x00010000, 0x01010404, 0x01010004, 0x00010404, 0x00000004, 0x00010000,
   0x00000400, 0x01010400, 0x01010404, 0x00000400, 0x01000404, 0x01010004, 0x01000000, 0x00000004,
   0x00000404, 0x01000400, 0x01000400, 0x00010400, 0x00010400, 0x01010000, 0x01010000, 0x01000404,
   0x00010004, 0x01000004, 0x01000004, 0x00010004, 0x00000000, 0x00000404, 0x00010404, 0x01000000,
   0x00010000, 0x01010404, 0x00000004, 0x01010000, 0x01010400, 0x01000000, 0x01000000, 0x00000400,
   0x01010004, 0x00010000, 0x00010400, 0x01000004, 0x00000400, 0x00000004, 0x01000404, 0x00010404,
   0x01010404, 0x00010004, 0x01010000, 0x01000404, 0x01000004, 0x00000404, 0x00010404, 0x01010400,
   0x00000404, 0x01000400, 0x01000400, 0x00000000, 0x00010004, 0x00010400, 0x00000000, 0x01010004
 };
 
 static u32 sbox2[64] =
 {
   0x80108020, 0x80008000, 0x00008000, 0x00108020, 0x00100000, 0x00000020, 0x80100020, 0x80008020,
   0x80000020, 0x80108020, 0x80108000, 0x80000000, 0x80008000, 0x00100000, 0x00000020, 0x80100020,
   0x00108000, 0x00100020, 0x80008020, 0x00000000, 0x80000000, 0x00008000, 0x00108020, 0x80100000,
   0x00100020, 0x80000020, 0x00000000, 0x00108000, 0x00008020, 0x80108000, 0x80100000, 0x00008020,
   0x00000000, 0x00108020, 0x80100020, 0x00100000, 0x80008020, 0x80100000, 0x80108000, 0x00008000,
   0x80100000, 0x80008000, 0x00000020, 0x80108020, 0x00108020, 0x00000020, 0x00008000, 0x80000000,
   0x00008020, 0x80108000, 0x00100000, 0x80000020, 0x00100020, 0x80008020, 0x80000020, 0x00100020,
   0x00108000, 0x00000000, 0x80008000, 0x00008020, 0x80000000, 0x80100020, 0x80108020, 0x00108000
 };
 
 static u32 sbox3[64] =
 {
   0x00000208, 0x08020200, 0x00000000, 0x08020008, 0x08000200, 0x00000000, 0x00020208, 0x08000200,
   0x00020008, 0x08000008, 0x08000008, 0x00020000, 0x08020208, 0x00020008, 0x08020000, 0x00000208,
   0x08000000, 0x00000008, 0x08020200, 0x00000200, 0x00020200, 0x08020000, 0x08020008, 0x00020208,
   0x08000208, 0x00020200, 0x00020000, 0x08000208, 0x00000008, 0x08020208, 0x00000200, 0x08000000,
   0x08020200, 0x08000000, 0x00020008, 0x00000208, 0x00020000, 0x08020200, 0x08000200, 0x00000000,
   0x00000200, 0x00020008, 0x08020208, 0x08000200, 0x08000008, 0x00000200, 0x00000000, 0x08020008,
   0x08000208, 0x00020000, 0x08000000, 0x08020208, 0x00000008, 0x00020208, 0x00020200, 0x08000008,
   0x08020000, 0x08000208, 0x00000208, 0x08020000, 0x00020208, 0x00000008, 0x08020008, 0x00020200
 };
 
 static u32 sbox4[64] =
 {
   0x00802001, 0x00002081, 0x00002081, 0x00000080, 0x00802080, 0x00800081, 0x00800001, 0x00002001,
   0x00000000, 0x00802000, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00800080, 0x00800001,
   0x00000001, 0x00002000, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002001, 0x00002080,
   0x00800081, 0x00000001, 0x00002080, 0x00800080, 0x00002000, 0x00802080, 0x00802081, 0x00000081,
   0x00800080, 0x00800001, 0x00802000, 0x00802081, 0x00000081, 0x00000000, 0x00000000, 0x00802000,
   0x00002080, 0x00800080, 0x00800081, 0x00000001, 0x00802001, 0x00002081, 0x00002081, 0x00000080,
   0x00802081, 0x00000081, 0x00000001, 0x00002000, 0x00800001, 0x00002001, 0x00802080, 0x00800081,
   0x00002001, 0x00002080, 0x00800000, 0x00802001, 0x00000080, 0x00800000, 0x00002000, 0x00802080
 };
 
 static u32 sbox5[64] =
 {
   0x00000100, 0x02080100, 0x02080000, 0x42000100, 0x00080000, 0x00000100, 0x40000000, 0x02080000,
   0x40080100, 0x00080000, 0x02000100, 0x40080100, 0x42000100, 0x42080000, 0x00080100, 0x40000000,
   0x02000000, 0x40080000, 0x40080000, 0x00000000, 0x40000100, 0x42080100, 0x42080100, 0x02000100,
   0x42080000, 0x40000100, 0x00000000, 0x42000000, 0x02080100, 0x02000000, 0x42000000, 0x00080100,
   0x00080000, 0x42000100, 0x00000100, 0x02000000, 0x40000000, 0x02080000, 0x42000100, 0x40080100,
   0x02000100, 0x40000000, 0x42080000, 0x02080100, 0x40080100, 0x00000100, 0x02000000, 0x42080000,
   0x42080100, 0x00080100, 0x42000000, 0x42080100, 0x02080000, 0x00000000, 0x40080000, 0x42000000,
   0x00080100, 0x02000100, 0x40000100, 0x00080000, 0x00000000, 0x40080000, 0x02080100, 0x40000100
 };
 
 static u32 sbox6[64] =
 {
   0x20000010, 0x20400000, 0x00004000, 0x20404010, 0x20400000, 0x00000010, 0x20404010, 0x00400000,
   0x20004000, 0x00404010, 0x00400000, 0x20000010, 0x00400010, 0x20004000, 0x20000000, 0x00004010,
   0x00000000, 0x00400010, 0x20004010, 0x00004000, 0x00404000, 0x20004010, 0x00000010, 0x20400010,
   0x20400010, 0x00000000, 0x00404010, 0x20404000, 0x00004010, 0x00404000, 0x20404000, 0x20000000,
   0x20004000, 0x00000010, 0x20400010, 0x00404000, 0x20404010, 0x00400000, 0x00004010, 0x20000010,
   0x00400000, 0x20004000, 0x20000000, 0x00004010, 0x20000010, 0x20404010, 0x00404000, 0x20400000,
   0x00404010, 0x20404000, 0x00000000, 0x20400010, 0x00000010, 0x00004000, 0x20400000, 0x00404010,
   0x00004000, 0x00400010, 0x20004010, 0x00000000, 0x20404000, 0x20000000, 0x00400010, 0x20004010
 };
 
 static u32 sbox7[64] =
 {
   0x00200000, 0x04200002, 0x04000802, 0x00000000, 0x00000800, 0x04000802, 0x00200802, 0x04200800,
   0x04200802, 0x00200000, 0x00000000, 0x04000002, 0x00000002, 0x04000000, 0x04200002, 0x00000802,
   0x04000800, 0x00200802, 0x00200002, 0x04000800, 0x04000002, 0x04200000, 0x04200800, 0x00200002,
   0x04200000, 0x00000800, 0x00000802, 0x04200802, 0x00200800, 0x00000002, 0x04000000, 0x00200800,
   0x04000000, 0x00200800, 0x00200000, 0x04000802, 0x04000802, 0x04200002, 0x04200002, 0x00000002,
   0x00200002, 0x04000000, 0x04000800, 0x00200000, 0x04200800, 0x00000802, 0x00200802, 0x04200800,
   0x00000802, 0x04000002, 0x04200802, 0x04200000, 0x00200800, 0x00000000, 0x00000002, 0x04200802,
   0x00000000, 0x00200802, 0x04200000, 0x00000800, 0x04000002, 0x04000800, 0x00000800, 0x00200002
 };
 
 static u32 sbox8[64] =
 {
   0x10001040, 0x00001000, 0x00040000, 0x10041040, 0x10000000, 0x10001040, 0x00000040, 0x10000000,
   0x00040040, 0x10040000, 0x10041040, 0x00041000, 0x10041000, 0x00041040, 0x00001000, 0x00000040,
   0x10040000, 0x10000040, 0x10001000, 0x00001040, 0x00041000, 0x00040040, 0x10040040, 0x10041000,
   0x00001040, 0x00000000, 0x00000000, 0x10040040, 0x10000040, 0x10001000, 0x00041040, 0x00040000,
   0x00041040, 0x00040000, 0x10041000, 0x00001000, 0x00000040, 0x10040040, 0x00001000, 0x00041040,
   0x10001000, 0x00000040, 0x10000040, 0x10040000, 0x10040040, 0x10000000, 0x00040000, 0x10001040,
   0x00000000, 0x10041040, 0x00040040, 0x10000040, 0x10040000, 0x10001000, 0x10001040, 0x00000000,
   0x10041040, 0x00041000, 0x00041000, 0x00001040, 0x00001040, 0x00040040, 0x10000000, 0x10041000
 };
 
 
 /*
  * These two tables are part of the 'permuted choice 1' function.
  * In this implementation several speed improvements are done.
  */
 static u32 leftkey_swap[16] =
 {
   0x00000000, 0x00000001, 0x00000100, 0x00000101,
   0x00010000, 0x00010001, 0x00010100, 0x00010101,
   0x01000000, 0x01000001, 0x01000100, 0x01000101,
   0x01010000, 0x01010001, 0x01010100, 0x01010101
 };
 
 static u32 rightkey_swap[16] =
 {
   0x00000000, 0x01000000, 0x00010000, 0x01010000,
   0x00000100, 0x01000100, 0x00010100, 0x01010100,
   0x00000001, 0x01000001, 0x00010001, 0x01010001,
   0x00000101, 0x01000101, 0x00010101, 0x01010101,
 };
 
 
 
 /*
  * Numbers of left shifts per round for encryption subkeys.
  * To calculate the decryption subkeys we just reverse the
  * ordering of the calculated encryption subkeys. So their
  * is no need for a decryption rotate tab.
  */
 static byte encrypt_rotate_tab[16] =
 {
   1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1
 };
 
 
 
 /*
  * Table with weak DES keys sorted in ascending order.
  * In DES their are 64 known keys which are weak. They are weak
  * because they produce only one, two or four different
  * subkeys in the subkey scheduling process.
  * The keys in this table have all their parity bits cleared.
  */
 static byte weak_keys[64][8] =
 {
   { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, /*w*/
   { 0x00, 0x00, 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e },
   { 0x00, 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0 },
   { 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe },
   { 0x00, 0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e }, /*sw*/
   { 0x00, 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e, 0x00 },
   { 0x00, 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0, 0xfe },
   { 0x00, 0x1e, 0xfe, 0xe0, 0x00, 0x0e, 0xfe, 0xf0 },
   { 0x00, 0xe0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf0 }, /*sw*/
   { 0x00, 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e, 0xfe },
   { 0x00, 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00 },
   { 0x00, 0xe0, 0xfe, 0x1e, 0x00, 0xf0, 0xfe, 0x0e },
   { 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe }, /*sw*/
   { 0x00, 0xfe, 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0 },
   { 0x00, 0xfe, 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e },
   { 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00 },
   { 0x1e, 0x00, 0x00, 0x1e, 0x0e, 0x00, 0x00, 0x0e },
   { 0x1e, 0x00, 0x1e, 0x00, 0x0e, 0x00, 0x0e, 0x00 }, /*sw*/
   { 0x1e, 0x00, 0xe0, 0xfe, 0x0e, 0x00, 0xf0, 0xfe },
   { 0x1e, 0x00, 0xfe, 0xe0, 0x0e, 0x00, 0xfe, 0xf0 },
   { 0x1e, 0x1e, 0x00, 0x00, 0x0e, 0x0e, 0x00, 0x00 },
   { 0x1e, 0x1e, 0x1e, 0x1e, 0x0e, 0x0e, 0x0e, 0x0e }, /*w*/
   { 0x1e, 0x1e, 0xe0, 0xe0, 0x0e, 0x0e, 0xf0, 0xf0 },
   { 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e, 0xfe, 0xfe },
   { 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0, 0x00, 0xfe },
   { 0x1e, 0xe0, 0x1e, 0xe0, 0x0e, 0xf0, 0x0e, 0xf0 }, /*sw*/
   { 0x1e, 0xe0, 0xe0, 0x1e, 0x0e, 0xf0, 0xf0, 0x0e },
   { 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0, 0xfe, 0x00 },
   { 0x1e, 0xfe, 0x00, 0xe0, 0x0e, 0xfe, 0x00, 0xf0 },
   { 0x1e, 0xfe, 0x1e, 0xfe, 0x0e, 0xfe, 0x0e, 0xfe }, /*sw*/
   { 0x1e, 0xfe, 0xe0, 0x00, 0x0e, 0xfe, 0xf0, 0x00 },
   { 0x1e, 0xfe, 0xfe, 0x1e, 0x0e, 0xfe, 0xfe, 0x0e },
   { 0xe0, 0x00, 0x00, 0xe0, 0xf0, 0x00, 0x00, 0xf0 },
   { 0xe0, 0x00, 0x1e, 0xfe, 0xf0, 0x00, 0x0e, 0xfe },
   { 0xe0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf0, 0x00 }, /*sw*/
   { 0xe0, 0x00, 0xfe, 0x1e, 0xf0, 0x00, 0xfe, 0x0e },
   { 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e, 0x00, 0xfe },
   { 0xe0, 0x1e, 0x1e, 0xe0, 0xf0, 0x0e, 0x0e, 0xf0 },
   { 0xe0, 0x1e, 0xe0, 0x1e, 0xf0, 0x0e, 0xf0, 0x0e }, /*sw*/
   { 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e, 0xfe, 0x00 },
   { 0xe0, 0xe0, 0x00, 0x00, 0xf0, 0xf0, 0x00, 0x00 },
   { 0xe0, 0xe0, 0x1e, 0x1e, 0xf0, 0xf0, 0x0e, 0x0e },
   { 0xe0, 0xe0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf0, 0xf0 }, /*w*/
   { 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0, 0xfe, 0xfe },
   { 0xe0, 0xfe, 0x00, 0x1e, 0xf0, 0xfe, 0x00, 0x0e },
   { 0xe0, 0xfe, 0x1e, 0x00, 0xf0, 0xfe, 0x0e, 0x00 },
   { 0xe0, 0xfe, 0xe0, 0xfe, 0xf0, 0xfe, 0xf0, 0xfe }, /*sw*/
   { 0xe0, 0xfe, 0xfe, 0xe0, 0xf0, 0xfe, 0xfe, 0xf0 },
   { 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00, 0xfe },
   { 0xfe, 0x00, 0x1e, 0xe0, 0xfe, 0x00, 0x0e, 0xf0 },
   { 0xfe, 0x00, 0xe0, 0x1e, 0xfe, 0x00, 0xf0, 0x0e },
   { 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00, 0xfe, 0x00 }, /*sw*/
   { 0xfe, 0x1e, 0x00, 0xe0, 0xfe, 0x0e, 0x00, 0xf0 },
   { 0xfe, 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e, 0xfe },
   { 0xfe, 0x1e, 0xe0, 0x00, 0xfe, 0x0e, 0xf0, 0x00 },
   { 0xfe, 0x1e, 0xfe, 0x1e, 0xfe, 0x0e, 0xfe, 0x0e }, /*sw*/
   { 0xfe, 0xe0, 0x00, 0x1e, 0xfe, 0xf0, 0x00, 0x0e },
   { 0xfe, 0xe0, 0x1e, 0x00, 0xfe, 0xf0, 0x0e, 0x00 },
   { 0xfe, 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0, 0xfe },
   { 0xfe, 0xe0, 0xfe, 0xe0, 0xfe, 0xf0, 0xfe, 0xf0 }, /*sw*/
   { 0xfe, 0xfe, 0x00, 0x00, 0xfe, 0xfe, 0x00, 0x00 },
   { 0xfe, 0xfe, 0x1e, 0x1e, 0xfe, 0xfe, 0x0e, 0x0e },
   { 0xfe, 0xfe, 0xe0, 0xe0, 0xfe, 0xfe, 0xf0, 0xf0 },
   { 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe }  /*w*/
 };
 static unsigned char weak_keys_chksum[20] = {
   0xD0, 0xCF, 0x07, 0x38, 0x93, 0x70, 0x8A, 0x83, 0x7D, 0xD7,
   0x8A, 0x36, 0x65, 0x29, 0x6C, 0x1F, 0x7C, 0x3F, 0xD3, 0x41 
 };
 
 
 
 /*
  * Macro to swap bits across two words.
  */
 #define DO_PERMUTATION(a, temp, b, offset, mask)	\
     temp = ((a>>offset) ^ b) & mask;			\
     b ^= temp;						\
     a ^= temp<<offset;
 
 
 /*
  * This performs the 'initial permutation' of the data to be encrypted
  * or decrypted. Additionally the resulting two words are rotated one bit
  * to the left.
  */
 #define INITIAL_PERMUTATION(left, temp, right)		\
     DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f)	\
     DO_PERMUTATION(left, temp, right, 16, 0x0000ffff)	\
     DO_PERMUTATION(right, temp, left, 2, 0x33333333)	\
     DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff)	\
     right =  (right << 1) | (right >> 31);		\
     temp  =  (left ^ right) & 0xaaaaaaaa;		\
     right ^= temp;					\
     left  ^= temp;					\
     left  =  (left << 1) | (left >> 31);
 
 /*
  * The 'inverse initial permutation'.
  */
 #define FINAL_PERMUTATION(left, temp, right)		\
     left  =  (left << 31) | (left >> 1);		\
     temp  =  (left ^ right) & 0xaaaaaaaa;		\
     left  ^= temp;					\
     right ^= temp;					\
     right  =  (right << 31) | (right >> 1);		\
     DO_PERMUTATION(right, temp, left, 8, 0x00ff00ff)	\
     DO_PERMUTATION(right, temp, left, 2, 0x33333333)	\
     DO_PERMUTATION(left, temp, right, 16, 0x0000ffff)	\
     DO_PERMUTATION(left, temp, right, 4, 0x0f0f0f0f)
 
 
 /*
  * A full DES round including 'expansion function', 'sbox substitution'
  * and 'primitive function P' but without swapping the left and right word.
  * Please note: The data in 'from' and 'to' is already rotated one bit to
  * the left, done in the initial permutation.
  */
 #define DES_ROUND(from, to, work, subkey)		\
     work = from ^ *subkey++;				\
     to ^= sbox8[  work	    & 0x3f ];			\
     to ^= sbox6[ (work>>8)  & 0x3f ];			\
     to ^= sbox4[ (work>>16) & 0x3f ];			\
     to ^= sbox2[ (work>>24) & 0x3f ];			\
     work = ((from << 28) | (from >> 4)) ^ *subkey++;	\
     to ^= sbox7[  work	    & 0x3f ];			\
     to ^= sbox5[ (work>>8)  & 0x3f ];			\
     to ^= sbox3[ (work>>16) & 0x3f ];			\
     to ^= sbox1[ (work>>24) & 0x3f ];
 
 /*
  * Macros to convert 8 bytes from/to 32bit words.
  */
 #define READ_64BIT_DATA(data, left, right)				   \
     left  = (data[0] << 24) | (data[1] << 16) | (data[2] << 8) | data[3];  \
     right = (data[4] << 24) | (data[5] << 16) | (data[6] << 8) | data[7];
 
 #define WRITE_64BIT_DATA(data, left, right)				   \
     data[0] = (left >> 24) &0xff; data[1] = (left >> 16) &0xff; 	   \
     data[2] = (left >> 8) &0xff; data[3] = left &0xff;			   \
     data[4] = (right >> 24) &0xff; data[5] = (right >> 16) &0xff;	   \
     data[6] = (right >> 8) &0xff; data[7] = right &0xff;
 
 /*
  * Handy macros for encryption and decryption of data
  */
 #define des_ecb_encrypt(ctx, from, to)	      des_ecb_crypt(ctx, from, to, 0)
 #define des_ecb_decrypt(ctx, from, to)	      des_ecb_crypt(ctx, from, to, 1)
 #define tripledes_ecb_encrypt(ctx, from, to) tripledes_ecb_crypt(ctx,from,to,0)
 #define tripledes_ecb_decrypt(ctx, from, to) tripledes_ecb_crypt(ctx,from,to,1)
 
 
 
 
 
 
 /*
  * des_key_schedule():	  Calculate 16 subkeys pairs (even/odd) for
  *			  16 encryption rounds.
  *			  To calculate subkeys for decryption the caller
  *			  have to reorder the generated subkeys.
  *
  *    rawkey:	    8 Bytes of key data
  *    subkey:	    Array of at least 32 u32s. Will be filled
  *		    with calculated subkeys.
  *
  */
 static void
 des_key_schedule (const byte * rawkey, u32 * subkey)
 {
   u32 left, right, work;
   int round;
 
   READ_64BIT_DATA (rawkey, left, right)
 
   DO_PERMUTATION (right, work, left, 4, 0x0f0f0f0f)
   DO_PERMUTATION (right, work, left, 0, 0x10101010)
 
   left = ((leftkey_swap[(left >> 0) & 0xf] << 3)
           | (leftkey_swap[(left >> 8) & 0xf] << 2)
           | (leftkey_swap[(left >> 16) & 0xf] << 1)
           | (leftkey_swap[(left >> 24) & 0xf])
           | (leftkey_swap[(left >> 5) & 0xf] << 7)
           | (leftkey_swap[(left >> 13) & 0xf] << 6)
           | (leftkey_swap[(left >> 21) & 0xf] << 5)
           | (leftkey_swap[(left >> 29) & 0xf] << 4));
 
   left &= 0x0fffffff;
 
   right = ((rightkey_swap[(right >> 1) & 0xf] << 3)
            | (rightkey_swap[(right >> 9) & 0xf] << 2)
            | (rightkey_swap[(right >> 17) & 0xf] << 1)
            | (rightkey_swap[(right >> 25) & 0xf])
            | (rightkey_swap[(right >> 4) & 0xf] << 7)
            | (rightkey_swap[(right >> 12) & 0xf] << 6)
            | (rightkey_swap[(right >> 20) & 0xf] << 5)
            | (rightkey_swap[(right >> 28) & 0xf] << 4));
 
   right &= 0x0fffffff;
 
   for (round = 0; round < 16; ++round)
     {
       left = ((left << encrypt_rotate_tab[round])
               | (left >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff;
       right = ((right << encrypt_rotate_tab[round])
                | (right >> (28 - encrypt_rotate_tab[round]))) & 0x0fffffff;
 
       *subkey++ = (((left << 4) & 0x24000000)
                    | ((left << 28) & 0x10000000)
                    | ((left << 14) & 0x08000000)
                    | ((left << 18) & 0x02080000)
                    | ((left << 6) & 0x01000000)
                    | ((left << 9) & 0x00200000)
                    | ((left >> 1) & 0x00100000)
                    | ((left << 10) & 0x00040000)
                    | ((left << 2) & 0x00020000)
                    | ((left >> 10) & 0x00010000)
                    | ((right >> 13) & 0x00002000)
                    | ((right >> 4) & 0x00001000)
                    | ((right << 6) & 0x00000800)
                    | ((right >> 1) & 0x00000400)
                    | ((right >> 14) & 0x00000200)
                    | (right & 0x00000100)
                    | ((right >> 5) & 0x00000020)
                    | ((right >> 10) & 0x00000010)
                    | ((right >> 3) & 0x00000008)
                    | ((right >> 18) & 0x00000004)
                    | ((right >> 26) & 0x00000002)
                    | ((right >> 24) & 0x00000001));
 
       *subkey++ = (((left << 15) & 0x20000000)
                    | ((left << 17) & 0x10000000)
                    | ((left << 10) & 0x08000000)
                    | ((left << 22) & 0x04000000)
                    | ((left >> 2) & 0x02000000)
                    | ((left << 1) & 0x01000000)
                    | ((left << 16) & 0x00200000)
                    | ((left << 11) & 0x00100000)
                    | ((left << 3) & 0x00080000)
                    | ((left >> 6) & 0x00040000)
                    | ((left << 15) & 0x00020000)
                    | ((left >> 4) & 0x00010000)
                    | ((right >> 2) & 0x00002000)
                    | ((right << 8) & 0x00001000)
                    | ((right >> 14) & 0x00000808)
                    | ((right >> 9) & 0x00000400)
                    | ((right) & 0x00000200)
                    | ((right << 7) & 0x00000100)
                    | ((right >> 7) & 0x00000020)
                    | ((right >> 3) & 0x00000011)
                    | ((right << 2) & 0x00000004)
                    | ((right >> 21) & 0x00000002));
     }
 }
 
 
 /*
  * Fill a DES context with subkeys calculated from a 64bit key.
  * Does not check parity bits, but simply ignore them.
  * Does not check for weak keys.
  */
 static int
 des_setkey (struct _des_ctx *ctx, const byte * key)
 {
   static const char *selftest_failed;
   int i;
 
   if (!fips_mode () && !initialized)
     {
       initialized = 1;
       selftest_failed = selftest ();
 
       if (selftest_failed)
 	log_error ("%s\n", selftest_failed);
     }
   if (selftest_failed)
     return GPG_ERR_SELFTEST_FAILED;
 
   des_key_schedule (key, ctx->encrypt_subkeys);
   _gcry_burn_stack (32);
 
   for(i=0; i<32; i+=2)
     {
       ctx->decrypt_subkeys[i]	= ctx->encrypt_subkeys[30-i];
       ctx->decrypt_subkeys[i+1] = ctx->encrypt_subkeys[31-i];
     }
 
   return 0;
 }
 
 
 
 /*
  * Electronic Codebook Mode DES encryption/decryption of data according
  * to 'mode'.
  */
 static int
 des_ecb_crypt (struct _des_ctx *ctx, const byte * from, byte * to, int mode)
 {
   u32 left, right, work;
   u32 *keys;
 
   keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys;
 
   READ_64BIT_DATA (from, left, right)
   INITIAL_PERMUTATION (left, work, right)
 
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
 
   FINAL_PERMUTATION (right, work, left)
   WRITE_64BIT_DATA (to, right, left)
 
   return 0;
 }
 
 
 
 /*
  * Fill a Triple-DES context with subkeys calculated from two 64bit keys.
  * Does not check the parity bits of the keys, but simply ignore them.
  * Does not check for weak keys.
  */
 static int
 tripledes_set2keys (struct _tripledes_ctx *ctx,
 		    const byte * key1,
 		    const byte * key2)
 {
   int i;
 
   des_key_schedule (key1, ctx->encrypt_subkeys);
   des_key_schedule (key2, &(ctx->decrypt_subkeys[32]));
   _gcry_burn_stack (32);
 
   for(i=0; i<32; i+=2)
     {
       ctx->decrypt_subkeys[i]	 = ctx->encrypt_subkeys[30-i];
       ctx->decrypt_subkeys[i+1]  = ctx->encrypt_subkeys[31-i];
 
       ctx->encrypt_subkeys[i+32] = ctx->decrypt_subkeys[62-i];
       ctx->encrypt_subkeys[i+33] = ctx->decrypt_subkeys[63-i];
 
       ctx->encrypt_subkeys[i+64] = ctx->encrypt_subkeys[i];
       ctx->encrypt_subkeys[i+65] = ctx->encrypt_subkeys[i+1];
 
       ctx->decrypt_subkeys[i+64] = ctx->decrypt_subkeys[i];
       ctx->decrypt_subkeys[i+65] = ctx->decrypt_subkeys[i+1];
     }
 
   return 0;
 }
 
 
 
 /*
  * Fill a Triple-DES context with subkeys calculated from three 64bit keys.
  * Does not check the parity bits of the keys, but simply ignore them.
  * Does not check for weak keys.
  */
 static int
 tripledes_set3keys (struct _tripledes_ctx *ctx,
 		    const byte * key1,
 		    const byte * key2,
 		    const byte * key3)
 {
   static const char *selftest_failed;
   int i;
 
   if (!fips_mode () && !initialized)
     {
       initialized = 1;
       selftest_failed = selftest ();
 
       if (selftest_failed)
 	log_error ("%s\n", selftest_failed);
     }
   if (selftest_failed)
     return GPG_ERR_SELFTEST_FAILED;
 
   des_key_schedule (key1, ctx->encrypt_subkeys);
   des_key_schedule (key2, &(ctx->decrypt_subkeys[32]));
   des_key_schedule (key3, &(ctx->encrypt_subkeys[64]));
   _gcry_burn_stack (32);
 
   for(i=0; i<32; i+=2)
     {
       ctx->decrypt_subkeys[i]	 = ctx->encrypt_subkeys[94-i];
       ctx->decrypt_subkeys[i+1]  = ctx->encrypt_subkeys[95-i];
 
       ctx->encrypt_subkeys[i+32] = ctx->decrypt_subkeys[62-i];
       ctx->encrypt_subkeys[i+33] = ctx->decrypt_subkeys[63-i];
 
       ctx->decrypt_subkeys[i+64] = ctx->encrypt_subkeys[30-i];
       ctx->decrypt_subkeys[i+65] = ctx->encrypt_subkeys[31-i];
      }
 
   return 0;
 }
 
 
 
 /*
  * Electronic Codebook Mode Triple-DES encryption/decryption of data
  * according to 'mode'.  Sometimes this mode is named 'EDE' mode
  * (Encryption-Decryption-Encryption).
  */
 static int
 tripledes_ecb_crypt (struct _tripledes_ctx *ctx, const byte * from,
                      byte * to, int mode)
 {
   u32 left, right, work;
   u32 *keys;
 
   keys = mode ? ctx->decrypt_subkeys : ctx->encrypt_subkeys;
 
   READ_64BIT_DATA (from, left, right)
   INITIAL_PERMUTATION (left, work, right)
 
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
 
   DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
   DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
   DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
   DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
   DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
   DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
   DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
   DES_ROUND (left, right, work, keys) DES_ROUND (right, left, work, keys)
 
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
   DES_ROUND (right, left, work, keys) DES_ROUND (left, right, work, keys)
 
   FINAL_PERMUTATION (right, work, left)
   WRITE_64BIT_DATA (to, right, left)
 
   return 0;
 }
 
 
 
 
 
 /*
  * Check whether the 8 byte key is weak.
  * Does not check the parity bits of the key but simple ignore them.
  */
 static int
 is_weak_key ( const byte *key )
 {
   byte work[8];
   int i, left, right, middle, cmp_result;
 
   /* clear parity bits */
   for(i=0; i<8; ++i)
      work[i] = key[i] & 0xfe;
 
   /* binary search in the weak key table */
   left = 0;
   right = 63;
   while(left <= right)
     {
       middle = (left + right) / 2;
 
       if ( !(cmp_result=working_memcmp(work, weak_keys[middle], 8)) )
 	  return -1;
 
       if ( cmp_result > 0 )
 	  left = middle + 1;
       else
 	  right = middle - 1;
     }
 
   return 0;
 }
 
 
 
 /*
  * Performs a selftest of this DES/Triple-DES implementation.
  * Returns an string with the error text on failure.
  * Returns NULL if all is ok.
  */
 static const char *
 selftest (void)
 {
   /*
    * Check if 'u32' is really 32 bits wide. This DES / 3DES implementation
    * need this.
    */
   if (sizeof (u32) != 4)
     return "Wrong word size for DES configured.";
 
   /*
    * DES Maintenance Test
    */
   {
     int i;
     byte key[8] =
       {0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55, 0x55};
     byte input[8] =
       {0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
     byte result[8] =
       {0x24, 0x6e, 0x9d, 0xb9, 0xc5, 0x50, 0x38, 0x1a};
     byte temp1[8], temp2[8], temp3[8];
     des_ctx des;
 
     for (i = 0; i < 64; ++i)
       {
 	des_setkey (des, key);
 	des_ecb_encrypt (des, input, temp1);
 	des_ecb_encrypt (des, temp1, temp2);
 	des_setkey (des, temp2);
 	des_ecb_decrypt (des, temp1, temp3);
 	memcpy (key, temp3, 8);
 	memcpy (input, temp1, 8);
       }
     if (memcmp (temp3, result, 8))
       return "DES maintenance test failed.";
   }
 
 
   /*
    * Self made Triple-DES test	(Does somebody know an official test?)
    */
   {
     int i;
     byte input[8] =
       {0xfe, 0xdc, 0xba, 0x98, 0x76, 0x54, 0x32, 0x10};
     byte key1[8] =
       {0x12, 0x34, 0x56, 0x78, 0x9a, 0xbc, 0xde, 0xf0};
     byte key2[8] =
       {0x11, 0x22, 0x33, 0x44, 0xff, 0xaa, 0xcc, 0xdd};
     byte result[8] =
       {0x7b, 0x38, 0x3b, 0x23, 0xa2, 0x7d, 0x26, 0xd3};
 
     tripledes_ctx des3;
 
     for (i = 0; i < 16; ++i)
       {
 	tripledes_set2keys (des3, key1, key2);
 	tripledes_ecb_encrypt (des3, input, key1);
 	tripledes_ecb_decrypt (des3, input, key2);
 	tripledes_set3keys (des3, key1, input, key2);
 	tripledes_ecb_encrypt (des3, input, input);
       }
     if (memcmp (input, result, 8))
       return "Triple-DES test failed.";
   }
   
   /*
    * More Triple-DES test.  These are testvectors as used by SSLeay,
    * thanks to Jeroen C. van Gelderen.
    */
   { 
     struct { byte key[24]; byte plain[8]; byte cipher[8]; } testdata[] = {
       { { 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
           0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
           0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01  },
         { 0x95,0xF8,0xA5,0xE5,0xDD,0x31,0xD9,0x00  },
         { 0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00  }
       },
       
       { { 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
           0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
           0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01  },
         { 0x9D,0x64,0x55,0x5A,0x9A,0x10,0xB8,0x52, },
         { 0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00  }
       },
       { { 0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E,
           0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E,
           0x38,0x49,0x67,0x4C,0x26,0x02,0x31,0x9E  },
         { 0x51,0x45,0x4B,0x58,0x2D,0xDF,0x44,0x0A  },
         { 0x71,0x78,0x87,0x6E,0x01,0xF1,0x9B,0x2A  }
       },
       { { 0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6,
           0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6,
           0x04,0xB9,0x15,0xBA,0x43,0xFE,0xB5,0xB6  },
         { 0x42,0xFD,0x44,0x30,0x59,0x57,0x7F,0xA2  },
         { 0xAF,0x37,0xFB,0x42,0x1F,0x8C,0x40,0x95  }
       },
       { { 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
           0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
           0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF  },
         { 0x73,0x6F,0x6D,0x65,0x64,0x61,0x74,0x61  },
         { 0x3D,0x12,0x4F,0xE2,0x19,0x8B,0xA3,0x18  }
       },
       { { 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
           0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
           0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF  },
         { 0x73,0x6F,0x6D,0x65,0x64,0x61,0x74,0x61  },
         { 0xFB,0xAB,0xA1,0xFF,0x9D,0x05,0xE9,0xB1  }
       },
       { { 0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF,
           0x55,0x55,0x55,0x55,0x55,0x55,0x55,0x55,
           0xFE,0xDC,0xBA,0x98,0x76,0x54,0x32,0x10  },
         { 0x73,0x6F,0x6D,0x65,0x64,0x61,0x74,0x61  },
         { 0x18,0xd7,0x48,0xe5,0x63,0x62,0x05,0x72  }
       },
       { { 0x03,0x52,0x02,0x07,0x67,0x20,0x82,0x17,
           0x86,0x02,0x87,0x66,0x59,0x08,0x21,0x98,
           0x64,0x05,0x6A,0xBD,0xFE,0xA9,0x34,0x57  },
         { 0x73,0x71,0x75,0x69,0x67,0x67,0x6C,0x65  },
         { 0xc0,0x7d,0x2a,0x0f,0xa5,0x66,0xfa,0x30  }
       },
       { { 0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
           0x80,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
           0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x02  },
         { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  },
         { 0xe6,0xe6,0xdd,0x5b,0x7e,0x72,0x29,0x74  }
       },
       { { 0x10,0x46,0x10,0x34,0x89,0x98,0x80,0x20,
           0x91,0x07,0xD0,0x15,0x89,0x19,0x01,0x01,
           0x19,0x07,0x92,0x10,0x98,0x1A,0x01,0x01  },
         { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00  },
         { 0xe1,0xef,0x62,0xc3,0x32,0xfe,0x82,0x5b  }
       }
     };
 
     byte		result[8];
     int		i;
     tripledes_ctx	des3;
 
     for (i=0; i<sizeof(testdata)/sizeof(*testdata); ++i)
       {
         tripledes_set3keys (des3, testdata[i].key,
                             testdata[i].key + 8, testdata[i].key + 16);
         
         tripledes_ecb_encrypt (des3, testdata[i].plain, result);
         if (memcmp (testdata[i].cipher, result, 8))
           return "Triple-DES SSLeay test failed on encryption.";
 
         tripledes_ecb_decrypt (des3, testdata[i].cipher, result);
         if (memcmp (testdata[i].plain, result, 8))
           return  "Triple-DES SSLeay test failed on decryption.";;
       }
   }
 
   /*
    * Check the weak key detection. We simply assume that the table
    * with weak keys is ok and check every key in the table if it is
    * detected... (This test is a little bit stupid).
    */
   {
     int i;
     unsigned char *p;
     gcry_md_hd_t h;
 
     if (_gcry_md_open (&h, GCRY_MD_SHA1, 0))
       return "SHA1 not available";
 
     for (i = 0; i < 64; ++i)
       _gcry_md_write (h, weak_keys[i], 8);
     p = _gcry_md_read (h, GCRY_MD_SHA1);
     i = memcmp (p, weak_keys_chksum, 20);
     _gcry_md_close (h);
     if (i)
       return "weak key table defect";
 
     for (i = 0; i < 64; ++i)
       if (!is_weak_key(weak_keys[i]))
         return "DES weak key detection failed";
   }
 
   return 0;
 }
 
 
 static gcry_err_code_t
 do_tripledes_setkey ( void *context, const byte *key, unsigned keylen )
 {
   struct _tripledes_ctx *ctx = (struct _tripledes_ctx *) context;
 
   if( keylen != 24 )
     return GPG_ERR_INV_KEYLEN;
 
   tripledes_set3keys ( ctx, key, key+8, key+16);
 
   if( is_weak_key( key ) || is_weak_key( key+8 ) || is_weak_key( key+16 ) )
     {
       _gcry_burn_stack (64);
       return GPG_ERR_WEAK_KEY;
     }
   _gcry_burn_stack (64);
 
   return GPG_ERR_NO_ERROR;
 }
 
 
 static void
 do_tripledes_encrypt( void *context, byte *outbuf, const byte *inbuf )
 {
   struct _tripledes_ctx *ctx = (struct _tripledes_ctx *) context;
 
   tripledes_ecb_encrypt ( ctx, inbuf, outbuf );
   _gcry_burn_stack (32);
 }
 
 static void
 do_tripledes_decrypt( void *context, byte *outbuf, const byte *inbuf )
 {
   struct _tripledes_ctx *ctx = (struct _tripledes_ctx *) context;
   tripledes_ecb_decrypt ( ctx, inbuf, outbuf );
   _gcry_burn_stack (32);
 }
 
 static gcry_err_code_t
 do_des_setkey (void *context, const byte *key, unsigned keylen)
 {
   struct _des_ctx *ctx = (struct _des_ctx *) context;
 
   if (keylen != 8)
     return GPG_ERR_INV_KEYLEN;
 
   des_setkey (ctx, key);
 
   if (is_weak_key (key)) {
     _gcry_burn_stack (64);
     return GPG_ERR_WEAK_KEY;
   }
   _gcry_burn_stack (64);
 
   return GPG_ERR_NO_ERROR;
 }
 
 
 static void
 do_des_encrypt( void *context, byte *outbuf, const byte *inbuf )
 {
   struct _des_ctx *ctx = (struct _des_ctx *) context;
 
   des_ecb_encrypt ( ctx, inbuf, outbuf );
   _gcry_burn_stack (32);
 }
 
 static void
 do_des_decrypt( void *context, byte *outbuf, const byte *inbuf )
 {
   struct _des_ctx *ctx = (struct _des_ctx *) context;
 
   des_ecb_decrypt ( ctx, inbuf, outbuf );
   _gcry_burn_stack (32);
 }
 
 
 
 
 /* 
      Self-test section.
  */
 
 
-/* Complete selftest for TripleDES with all modes and driver code.  */
+/* Selftest for TripleDES.  */
 static gpg_err_code_t
 selftest_fips (selftest_report_func_t report)
 {
   const char *what;
   const char *errtxt;
   
   what = "low-level";
   errtxt = selftest ();
   if (errtxt)
     goto failed;
 
-  /* FIXME:  need more tests.  */
+  /* The low-level self-tests are quite extensive and thus we can do
+     without high level tests.  This is also justified because we have
+     no custom block code implementation for 3des but always use the
+     standard high level block code.  */
 
   return 0; /* Succeeded. */
 
  failed:
   if (report)
     report ("cipher", GCRY_CIPHER_3DES, what, errtxt);
   return GPG_ERR_SELFTEST_FAILED;
 }
 
 
 
 /* Run a full self-test for ALGO and return 0 on success.  */
 static gpg_err_code_t
 run_selftests (int algo, selftest_report_func_t report)
 {
   gpg_err_code_t ec;
 
   switch (algo)
     {
     case GCRY_CIPHER_3DES:
       ec = selftest_fips (report);
       break;
     default:
       ec = GPG_ERR_CIPHER_ALGO;
       break;
         
     }
   return ec;
 }
 
 
 
 gcry_cipher_spec_t _gcry_cipher_spec_des =
   {
     "DES", NULL, NULL, 8, 64, sizeof (struct _des_ctx),
     do_des_setkey, do_des_encrypt, do_des_decrypt
   };
 
 static gcry_cipher_oid_spec_t oids_tripledes[] =
   {
     { "1.2.840.113549.3.7", GCRY_CIPHER_MODE_CBC },
     /* Teletrust specific OID for 3DES. */
     { "1.3.36.3.1.3.2.1",   GCRY_CIPHER_MODE_CBC },
     /* pbeWithSHAAnd3_KeyTripleDES_CBC */
     { "1.2.840.113549.1.12.1.3", GCRY_CIPHER_MODE_CBC },
     { NULL }
   };
 
 gcry_cipher_spec_t _gcry_cipher_spec_tripledes =
   {
     "3DES", NULL, oids_tripledes, 8, 192, sizeof (struct _tripledes_ctx),
     do_tripledes_setkey, do_tripledes_encrypt, do_tripledes_decrypt
   };
 
 cipher_extra_spec_t _gcry_cipher_extraspec_tripledes = 
   {
     run_selftests
   };
diff --git a/cipher/hmac-tests.c b/cipher/hmac-tests.c
index 6eb7b001..38b5ea47 100644
--- a/cipher/hmac-tests.c
+++ b/cipher/hmac-tests.c
@@ -1,423 +1,721 @@
 /* hmac-tests.c - HMAC selftests.
  * Copyright (C) 2008 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
  * Libgcrypt 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.
  *
  * Libgcrypt 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 program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 /* 
    Although algorithm self-tests are usually implemented in the module
    implementing the algorithm, the case for HMAC is different because
    HMAC is implemnetd on a higher level using a special feature of the
    gcry_md_ functions.  It would be possible to do this also in the
    digest algorithm modules, but that would blow up the code too much
    and spread the hmac tests over several modules.
 
-    Thus we implement all HMAC tests in this test module and provide a
-    function to run the tests.
+   Thus we implement all HMAC tests in this test module and provide a
+   function to run the tests.
 */
 
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #ifdef HAVE_STDINT_H 
 # include <stdint.h>
 #endif
 
 #include "g10lib.h"
 #include "cipher.h"
 #include "hmac256.h"
 
 /* Check one HMAC with digest ALGO using the regualr HAMC
    API. (DATA,DATALEN) is the data to be MACed, (KEY,KEYLEN) the key
    and (EXPECT,EXPECTLEN) the expected result.  Returns NULL on
    succdess or a string describing the failure.  */
 static const char *
 check_one (int algo,
            const void *data, size_t datalen, 
            const void *key, size_t keylen,
            const void *expect, size_t expectlen)
 {
   gcry_md_hd_t hd;
   const unsigned char *digest;
 
+/*   printf ("HMAC algo %d\n", algo); */
   if (_gcry_md_get_algo_dlen (algo) != expectlen)
     return "invalid tests data";
   if (_gcry_md_open (&hd, algo, GCRY_MD_FLAG_HMAC))
     return "gcry_md_open failed";
   if (_gcry_md_setkey (hd, key, keylen))
     {
       _gcry_md_close (hd);
       return "gcry_md_setkey failed";
     }
   _gcry_md_write (hd, data, datalen);
   digest = _gcry_md_read (hd, algo);
   if (!digest)
     {
       _gcry_md_close (hd);
       return "gcry_md_read failed";
     }
   if (memcmp (digest, expect, expectlen))
     {
+/*       int i; */
+
+/*       fputs ("        {", stdout); */
+/*       for (i=0; i < expectlen-1; i++) */
+/*         { */
+/*           if (i && !(i % 8)) */
+/*             fputs ("\n         ", stdout); */
+/*           printf (" 0x%02x,", digest[i]); */
+/*         } */
+/*       printf (" 0x%02x } },\n", digest[i]); */
+
       _gcry_md_close (hd);
       return "does not match";
     }
   _gcry_md_close (hd);
   return NULL;  
 }
 
 
 static gpg_err_code_t
 selftests_sha1 (selftest_report_func_t report)
 {
-  static struct 
-  {
-    const char * const desc;
-    const char * const data;
-    const char * const key;
-    const char expect[20];
-  } tv[] =
-    {
-      { NULL }
-    };
   const char *what;
   const char *errtxt;
-  int tvidx;
-  
-  for (tvidx=0; tv[tvidx].desc; tvidx++)
-    {
-      what = tv[tvidx].desc;
-      errtxt = check_one (GCRY_MD_SHA1,
-                          tv[tvidx].data, strlen (tv[tvidx].data),
-                          tv[tvidx].key, strlen (tv[tvidx].key),
-                          tv[tvidx].expect, DIM (tv[tvidx].expect) );
-      if (errtxt)
-        goto failed;
-    }
+  unsigned char key[128];
+  int i, j;
+
+  what = "FIPS-198a, A.1";
+  for (i=0; i < 64; i++)
+    key[i] = i;
+  errtxt = check_one (GCRY_MD_SHA1,
+                      "Sample #1", 9,
+                      key, 64,
+                      "\x4f\x4c\xa3\xd5\xd6\x8b\xa7\xcc\x0a\x12"
+                      "\x08\xc9\xc6\x1e\x9c\x5d\xa0\x40\x3c\x0a", 20);
+  if (errtxt)
+    goto failed;
+
+  what = "FIPS-198a, A.2";
+  for (i=0, j=0x30; i < 20; i++)
+    key[i] = j++;
+  errtxt = check_one (GCRY_MD_SHA1,
+                      "Sample #2", 9,
+                      key, 20,
+                      "\x09\x22\xd3\x40\x5f\xaa\x3d\x19\x4f\x82"
+                      "\xa4\x58\x30\x73\x7d\x5c\xc6\xc7\x5d\x24", 20);
+  if (errtxt)
+    goto failed;
+
+  what = "FIPS-198a, A.3";
+  for (i=0, j=0x50; i < 100; i++)
+    key[i] = j++;
+  errtxt = check_one (GCRY_MD_SHA1,
+                      "Sample #3", 9,
+                      key, 100,
+                      "\xbc\xf4\x1e\xab\x8b\xb2\xd8\x02\xf3\xd0"
+                      "\x5c\xaf\x7c\xb0\x92\xec\xf8\xd1\xa3\xaa", 20 );
+  if (errtxt)
+    goto failed;
+
+  what = "FIPS-198a, A.4";
+  for (i=0, j=0x70; i < 49; i++)
+    key[i] = j++;
+  errtxt = check_one (GCRY_MD_SHA1,
+                      "Sample #4", 9,
+                      key, 49,
+                      "\x9e\xa8\x86\xef\xe2\x68\xdb\xec\xce\x42"
+                      "\x0c\x75\x24\xdf\x32\xe0\x75\x1a\x2a\x26", 20 );
+  if (errtxt)
+    goto failed;
+
 
   return 0; /* Succeeded. */
 
  failed:
   if (report)
     report ("hmac", GCRY_MD_SHA1, what, errtxt);
   return GPG_ERR_SELFTEST_FAILED;
 }
 
 
 
 static gpg_err_code_t
 selftests_sha224 (selftest_report_func_t report)
 {
   static struct 
   {
     const char * const desc;
     const char * const data;
     const char * const key;
     const char expect[28];
   } tv[] =
     {
+      { "data-28 key-4",
+        "what do ya want for nothing?", 
+        "Jefe",
+        { 0xa3, 0x0e, 0x01, 0x09, 0x8b, 0xc6, 0xdb, 0xbf,
+          0x45, 0x69, 0x0f, 0x3a, 0x7e, 0x9e, 0x6d, 0x0f,
+          0x8b, 0xbe, 0xa2, 0xa3, 0x9e, 0x61, 0x48, 0x00,
+          0x8f, 0xd0, 0x5e, 0x44 } },
+
+      { "data-9 key-20",
+        "Hi There",
+	"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
+        "\x0b\x0b\x0b\x0b",
+        { 0x89, 0x6f, 0xb1, 0x12, 0x8a, 0xbb, 0xdf, 0x19,
+          0x68, 0x32, 0x10, 0x7c, 0xd4, 0x9d, 0xf3, 0x3f,
+          0x47, 0xb4, 0xb1, 0x16, 0x99, 0x12, 0xba, 0x4f,
+          0x53, 0x68, 0x4b, 0x22 } },
+
+      { "data-50 key-20",
+        "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+        "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+        "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+        "\xdd\xdd",
+	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa",
+        { 0x7f, 0xb3, 0xcb, 0x35, 0x88, 0xc6, 0xc1, 0xf6,
+          0xff, 0xa9, 0x69, 0x4d, 0x7d, 0x6a, 0xd2, 0x64,
+          0x93, 0x65, 0xb0, 0xc1, 0xf6, 0x5d, 0x69, 0xd1,
+          0xec, 0x83, 0x33, 0xea } },
+
+      { "data-50 key-26",
+        "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+        "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+        "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+        "\xcd\xcd",
+	"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
+        "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
+        { 0x6c, 0x11, 0x50, 0x68, 0x74, 0x01, 0x3c, 0xac,
+          0x6a, 0x2a, 0xbc, 0x1b, 0xb3, 0x82, 0x62, 0x7c,
+          0xec, 0x6a, 0x90, 0xd8, 0x6e, 0xfc, 0x01, 0x2d,
+          0xe7, 0xaf, 0xec, 0x5a } },
+
+      { "data-54 key-131",
+        "Test Using Larger Than Block-Size Key - Hash Key First",
+	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa",
+        { 0x95, 0xe9, 0xa0, 0xdb, 0x96, 0x20, 0x95, 0xad,
+          0xae, 0xbe, 0x9b, 0x2d, 0x6f, 0x0d, 0xbc, 0xe2,
+          0xd4, 0x99, 0xf1, 0x12, 0xf2, 0xd2, 0xb7, 0x27,
+          0x3f, 0xa6, 0x87, 0x0e } },
+
+      { "data-152 key-131",
+        "This is a test using a larger than block-size key and a larger "
+        "than block-size data. The key needs to be hashed before being "
+        "used by the HMAC algorithm.",
+	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa",
+        { 0x3a, 0x85, 0x41, 0x66, 0xac, 0x5d, 0x9f, 0x02,
+          0x3f, 0x54, 0xd5, 0x17, 0xd0, 0xb3, 0x9d, 0xbd,
+          0x94, 0x67, 0x70, 0xdb, 0x9c, 0x2b, 0x95, 0xc9,
+          0xf6, 0xf5, 0x65, 0xd1 } },
+
       { NULL }
     };
   const char *what;
   const char *errtxt;
   int tvidx;
   
   for (tvidx=0; tv[tvidx].desc; tvidx++)
     {
       what = tv[tvidx].desc;
       errtxt = check_one (GCRY_MD_SHA224,
                           tv[tvidx].data, strlen (tv[tvidx].data),
                           tv[tvidx].key, strlen (tv[tvidx].key),
                           tv[tvidx].expect, DIM (tv[tvidx].expect) );
       if (errtxt)
         goto failed;
     }
 
   return 0; /* Succeeded. */
 
  failed:
   if (report)
     report ("hmac", GCRY_MD_SHA224, what, errtxt);
   return GPG_ERR_SELFTEST_FAILED;
 }
 
 
 static gpg_err_code_t
 selftests_sha256 (selftest_report_func_t report)
 {
   static struct 
   {
     const char * const desc;
     const char * const data;
     const char * const key;
     const char expect[32];
   } tv[] =
     {
       { "data-28 key-4",
         "what do ya want for nothing?", 
         "Jefe",
 	{ 0x5b, 0xdc, 0xc1, 0x46, 0xbf, 0x60, 0x75, 0x4e,
           0x6a, 0x04, 0x24, 0x26, 0x08, 0x95, 0x75, 0xc7,
           0x5a, 0x00, 0x3f, 0x08, 0x9d, 0x27, 0x39, 0x83,
           0x9d, 0xec, 0x58, 0xb9, 0x64, 0xec, 0x38, 0x43 } },
 
       { "data-9 key-20",
         "Hi There",
 	"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
         "\x0b\x0b\x0b\x0b",
         { 0xb0, 0x34, 0x4c, 0x61, 0xd8, 0xdb, 0x38, 0x53,
           0x5c, 0xa8, 0xaf, 0xce, 0xaf, 0x0b, 0xf1, 0x2b,
           0x88, 0x1d, 0xc2, 0x00, 0xc9, 0x83, 0x3d, 0xa7,
           0x26, 0xe9, 0x37, 0x6c, 0x2e, 0x32, 0xcf, 0xf7 } },
 
       { "data-50 key-20",
         "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
         "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
         "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
         "\xdd\xdd",
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa",
         { 0x77, 0x3e, 0xa9, 0x1e, 0x36, 0x80, 0x0e, 0x46,
           0x85, 0x4d, 0xb8, 0xeb, 0xd0, 0x91, 0x81, 0xa7,
           0x29, 0x59, 0x09, 0x8b, 0x3e, 0xf8, 0xc1, 0x22,
           0xd9, 0x63, 0x55, 0x14, 0xce, 0xd5, 0x65, 0xfe } },
 
       { "data-50 key-26",
         "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
         "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
         "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
         "\xcd\xcd",
 	"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
         "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
 	{ 0x82, 0x55, 0x8a, 0x38, 0x9a, 0x44, 0x3c, 0x0e,
           0xa4, 0xcc, 0x81, 0x98, 0x99, 0xf2, 0x08, 0x3a,
           0x85, 0xf0, 0xfa, 0xa3, 0xe5, 0x78, 0xf8, 0x07,
           0x7a, 0x2e, 0x3f, 0xf4, 0x67, 0x29, 0x66, 0x5b } },
 
       { "data-54 key-131",
         "Test Using Larger Than Block-Size Key - Hash Key First",
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa",
 	{ 0x60, 0xe4, 0x31, 0x59, 0x1e, 0xe0, 0xb6, 0x7f,
           0x0d, 0x8a, 0x26, 0xaa, 0xcb, 0xf5, 0xb7, 0x7f,
           0x8e, 0x0b, 0xc6, 0x21, 0x37, 0x28, 0xc5, 0x14,
           0x05, 0x46, 0x04, 0x0f, 0x0e, 0xe3, 0x7f, 0x54 } },
 
       { "data-152 key-131",
         "This is a test using a larger than block-size key and a larger "
         "than block-size data. The key needs to be hashed before being "
         "used by the HMAC algorithm.",
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
         "\xaa\xaa\xaa",
 	{ 0x9b, 0x09, 0xff, 0xa7, 0x1b, 0x94, 0x2f, 0xcb,
           0x27, 0x63, 0x5f, 0xbc, 0xd5, 0xb0, 0xe9, 0x44,
           0xbf, 0xdc, 0x63, 0x64, 0x4f, 0x07, 0x13, 0x93,
           0x8a, 0x7f, 0x51, 0x53, 0x5c, 0x3a, 0x35, 0xe2 } },
 
       { NULL }
     };
   const char *what;
   const char *errtxt;
   int tvidx;
   
   for (tvidx=0; tv[tvidx].desc; tvidx++)
     {
       hmac256_context_t hmachd;
       const unsigned char *digest;
       size_t dlen;
 
       what = tv[tvidx].desc;
       errtxt = check_one (GCRY_MD_SHA256,
                           tv[tvidx].data, strlen (tv[tvidx].data),
                           tv[tvidx].key, strlen (tv[tvidx].key),
                           tv[tvidx].expect, DIM (tv[tvidx].expect) );
       if (errtxt)
         goto failed;
 
       hmachd = _gcry_hmac256_new (tv[tvidx].key, strlen (tv[tvidx].key));
       if (!hmachd)
         {
           errtxt = "_gcry_hmac256_new failed";
           goto failed;
         }
       _gcry_hmac256_update (hmachd, tv[tvidx].data, strlen (tv[tvidx].data));
       digest = _gcry_hmac256_finalize (hmachd, &dlen);
       if (!digest)
         {
           errtxt = "_gcry_hmac256_finalize failed";
           _gcry_hmac256_release (hmachd);
           goto failed;
         }
       if (dlen != DIM (tv[tvidx].expect)
           || memcmp (digest, tv[tvidx].expect, DIM (tv[tvidx].expect)))
         {
           errtxt = "does not match in second implementation";
           _gcry_hmac256_release (hmachd);
           goto failed;
         }
       _gcry_hmac256_release (hmachd);
     }
 
   return 0; /* Succeeded. */
 
  failed:
   if (report)
     report ("hmac", GCRY_MD_SHA256, what, errtxt);
   return GPG_ERR_SELFTEST_FAILED;
 }
 
 
 static gpg_err_code_t
 selftests_sha384 (selftest_report_func_t report)
 {
   static struct 
   {
     const char * const desc;
     const char * const data;
     const char * const key;
     const char expect[48];
   } tv[] =
     {
+      { "data-28 key-4",
+        "what do ya want for nothing?", 
+        "Jefe",
+        { 0xaf, 0x45, 0xd2, 0xe3, 0x76, 0x48, 0x40, 0x31,
+          0x61, 0x7f, 0x78, 0xd2, 0xb5, 0x8a, 0x6b, 0x1b,
+          0x9c, 0x7e, 0xf4, 0x64, 0xf5, 0xa0, 0x1b, 0x47,
+          0xe4, 0x2e, 0xc3, 0x73, 0x63, 0x22, 0x44, 0x5e,
+          0x8e, 0x22, 0x40, 0xca, 0x5e, 0x69, 0xe2, 0xc7,
+          0x8b, 0x32, 0x39, 0xec, 0xfa, 0xb2, 0x16, 0x49 } },
+
+      { "data-9 key-20",
+        "Hi There",
+	"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
+        "\x0b\x0b\x0b\x0b",
+        { 0xaf, 0xd0, 0x39, 0x44, 0xd8, 0x48, 0x95, 0x62,
+          0x6b, 0x08, 0x25, 0xf4, 0xab, 0x46, 0x90, 0x7f,
+          0x15, 0xf9, 0xda, 0xdb, 0xe4, 0x10, 0x1e, 0xc6,
+          0x82, 0xaa, 0x03, 0x4c, 0x7c, 0xeb, 0xc5, 0x9c,
+          0xfa, 0xea, 0x9e, 0xa9, 0x07, 0x6e, 0xde, 0x7f,
+          0x4a, 0xf1, 0x52, 0xe8, 0xb2, 0xfa, 0x9c, 0xb6 } },
+
+      { "data-50 key-20",
+        "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+        "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+        "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+        "\xdd\xdd",
+	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa",
+        { 0x88, 0x06, 0x26, 0x08, 0xd3, 0xe6, 0xad, 0x8a,
+          0x0a, 0xa2, 0xac, 0xe0, 0x14, 0xc8, 0xa8, 0x6f,
+          0x0a, 0xa6, 0x35, 0xd9, 0x47, 0xac, 0x9f, 0xeb,
+          0xe8, 0x3e, 0xf4, 0xe5, 0x59, 0x66, 0x14, 0x4b,
+          0x2a, 0x5a, 0xb3, 0x9d, 0xc1, 0x38, 0x14, 0xb9,
+          0x4e, 0x3a, 0xb6, 0xe1, 0x01, 0xa3, 0x4f, 0x27 } },
+
+      { "data-50 key-26",
+        "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+        "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+        "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+        "\xcd\xcd",
+	"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
+        "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
+        { 0x3e, 0x8a, 0x69, 0xb7, 0x78, 0x3c, 0x25, 0x85,
+          0x19, 0x33, 0xab, 0x62, 0x90, 0xaf, 0x6c, 0xa7,
+          0x7a, 0x99, 0x81, 0x48, 0x08, 0x50, 0x00, 0x9c,
+          0xc5, 0x57, 0x7c, 0x6e, 0x1f, 0x57, 0x3b, 0x4e,
+          0x68, 0x01, 0xdd, 0x23, 0xc4, 0xa7, 0xd6, 0x79,
+          0xcc, 0xf8, 0xa3, 0x86, 0xc6, 0x74, 0xcf, 0xfb } },
+
+      { "data-54 key-131",
+        "Test Using Larger Than Block-Size Key - Hash Key First",
+	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa",
+        { 0x4e, 0xce, 0x08, 0x44, 0x85, 0x81, 0x3e, 0x90,
+          0x88, 0xd2, 0xc6, 0x3a, 0x04, 0x1b, 0xc5, 0xb4,
+          0x4f, 0x9e, 0xf1, 0x01, 0x2a, 0x2b, 0x58, 0x8f,
+          0x3c, 0xd1, 0x1f, 0x05, 0x03, 0x3a, 0xc4, 0xc6,
+          0x0c, 0x2e, 0xf6, 0xab, 0x40, 0x30, 0xfe, 0x82,
+          0x96, 0x24, 0x8d, 0xf1, 0x63, 0xf4, 0x49, 0x52 } },
+
+      { "data-152 key-131",
+        "This is a test using a larger than block-size key and a larger "
+        "than block-size data. The key needs to be hashed before being "
+        "used by the HMAC algorithm.",
+	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa",
+        { 0x66, 0x17, 0x17, 0x8e, 0x94, 0x1f, 0x02, 0x0d,
+          0x35, 0x1e, 0x2f, 0x25, 0x4e, 0x8f, 0xd3, 0x2c,
+          0x60, 0x24, 0x20, 0xfe, 0xb0, 0xb8, 0xfb, 0x9a,
+          0xdc, 0xce, 0xbb, 0x82, 0x46, 0x1e, 0x99, 0xc5,
+          0xa6, 0x78, 0xcc, 0x31, 0xe7, 0x99, 0x17, 0x6d,
+          0x38, 0x60, 0xe6, 0x11, 0x0c, 0x46, 0x52, 0x3e } },
+
       { NULL }
     };
   const char *what;
   const char *errtxt;
   int tvidx;
   
   for (tvidx=0; tv[tvidx].desc; tvidx++)
     {
       what = tv[tvidx].desc;
       errtxt = check_one (GCRY_MD_SHA384,
                           tv[tvidx].data, strlen (tv[tvidx].data),
                           tv[tvidx].key, strlen (tv[tvidx].key),
                           tv[tvidx].expect, DIM (tv[tvidx].expect) );
       if (errtxt)
         goto failed;
     }
 
   return 0; /* Succeeded. */
 
  failed:
   if (report)
     report ("hmac", GCRY_MD_SHA384, what, errtxt);
   return GPG_ERR_SELFTEST_FAILED;
 }
 
 
 static gpg_err_code_t
 selftests_sha512 (selftest_report_func_t report)
 {
   static struct 
   {
     const char * const desc;
     const char * const data;
     const char * const key;
     const char expect[64];
   } tv[] =
     {
+      { "data-28 key-4",
+        "what do ya want for nothing?", 
+        "Jefe",
+        { 0x16, 0x4b, 0x7a, 0x7b, 0xfc, 0xf8, 0x19, 0xe2,
+          0xe3, 0x95, 0xfb, 0xe7, 0x3b, 0x56, 0xe0, 0xa3,
+          0x87, 0xbd, 0x64, 0x22, 0x2e, 0x83, 0x1f, 0xd6,
+          0x10, 0x27, 0x0c, 0xd7, 0xea, 0x25, 0x05, 0x54,
+          0x97, 0x58, 0xbf, 0x75, 0xc0, 0x5a, 0x99, 0x4a,
+          0x6d, 0x03, 0x4f, 0x65, 0xf8, 0xf0, 0xe6, 0xfd,
+          0xca, 0xea, 0xb1, 0xa3, 0x4d, 0x4a, 0x6b, 0x4b,
+          0x63, 0x6e, 0x07, 0x0a, 0x38, 0xbc, 0xe7, 0x37 } },
+
+      { "data-9 key-20",
+        "Hi There",
+	"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
+        "\x0b\x0b\x0b\x0b",
+        { 0x87, 0xaa, 0x7c, 0xde, 0xa5, 0xef, 0x61, 0x9d,
+          0x4f, 0xf0, 0xb4, 0x24, 0x1a, 0x1d, 0x6c, 0xb0,
+          0x23, 0x79, 0xf4, 0xe2, 0xce, 0x4e, 0xc2, 0x78,
+          0x7a, 0xd0, 0xb3, 0x05, 0x45, 0xe1, 0x7c, 0xde,
+          0xda, 0xa8, 0x33, 0xb7, 0xd6, 0xb8, 0xa7, 0x02,
+          0x03, 0x8b, 0x27, 0x4e, 0xae, 0xa3, 0xf4, 0xe4,
+          0xbe, 0x9d, 0x91, 0x4e, 0xeb, 0x61, 0xf1, 0x70,
+          0x2e, 0x69, 0x6c, 0x20, 0x3a, 0x12, 0x68, 0x54 } },
+
+      { "data-50 key-20",
+        "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+        "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+        "\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
+        "\xdd\xdd",
+	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa",
+        { 0xfa, 0x73, 0xb0, 0x08, 0x9d, 0x56, 0xa2, 0x84,
+          0xef, 0xb0, 0xf0, 0x75, 0x6c, 0x89, 0x0b, 0xe9,
+          0xb1, 0xb5, 0xdb, 0xdd, 0x8e, 0xe8, 0x1a, 0x36,
+          0x55, 0xf8, 0x3e, 0x33, 0xb2, 0x27, 0x9d, 0x39,
+          0xbf, 0x3e, 0x84, 0x82, 0x79, 0xa7, 0x22, 0xc8,
+          0x06, 0xb4, 0x85, 0xa4, 0x7e, 0x67, 0xc8, 0x07,
+          0xb9, 0x46, 0xa3, 0x37, 0xbe, 0xe8, 0x94, 0x26,
+          0x74, 0x27, 0x88, 0x59, 0xe1, 0x32, 0x92, 0xfb } },
+
+      { "data-50 key-26",
+        "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+        "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+        "\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
+        "\xcd\xcd",
+	"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10"
+        "\x11\x12\x13\x14\x15\x16\x17\x18\x19",
+        { 0xb0, 0xba, 0x46, 0x56, 0x37, 0x45, 0x8c, 0x69,
+          0x90, 0xe5, 0xa8, 0xc5, 0xf6, 0x1d, 0x4a, 0xf7,
+          0xe5, 0x76, 0xd9, 0x7f, 0xf9, 0x4b, 0x87, 0x2d,
+          0xe7, 0x6f, 0x80, 0x50, 0x36, 0x1e, 0xe3, 0xdb,
+          0xa9, 0x1c, 0xa5, 0xc1, 0x1a, 0xa2, 0x5e, 0xb4,
+          0xd6, 0x79, 0x27, 0x5c, 0xc5, 0x78, 0x80, 0x63,
+          0xa5, 0xf1, 0x97, 0x41, 0x12, 0x0c, 0x4f, 0x2d,
+          0xe2, 0xad, 0xeb, 0xeb, 0x10, 0xa2, 0x98, 0xdd } },
+
+      { "data-54 key-131",
+        "Test Using Larger Than Block-Size Key - Hash Key First",
+	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa",
+        { 0x80, 0xb2, 0x42, 0x63, 0xc7, 0xc1, 0xa3, 0xeb,
+          0xb7, 0x14, 0x93, 0xc1, 0xdd, 0x7b, 0xe8, 0xb4,
+          0x9b, 0x46, 0xd1, 0xf4, 0x1b, 0x4a, 0xee, 0xc1,
+          0x12, 0x1b, 0x01, 0x37, 0x83, 0xf8, 0xf3, 0x52,
+          0x6b, 0x56, 0xd0, 0x37, 0xe0, 0x5f, 0x25, 0x98,
+          0xbd, 0x0f, 0xd2, 0x21, 0x5d, 0x6a, 0x1e, 0x52,
+          0x95, 0xe6, 0x4f, 0x73, 0xf6, 0x3f, 0x0a, 0xec,
+          0x8b, 0x91, 0x5a, 0x98, 0x5d, 0x78, 0x65, 0x98 } },
+
+      { "data-152 key-131",
+        "This is a test using a larger than block-size key and a larger "
+        "than block-size data. The key needs to be hashed before being "
+        "used by the HMAC algorithm.",
+	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
+        "\xaa\xaa\xaa",
+        { 0xe3, 0x7b, 0x6a, 0x77, 0x5d, 0xc8, 0x7d, 0xba,
+          0xa4, 0xdf, 0xa9, 0xf9, 0x6e, 0x5e, 0x3f, 0xfd,
+          0xde, 0xbd, 0x71, 0xf8, 0x86, 0x72, 0x89, 0x86,
+          0x5d, 0xf5, 0xa3, 0x2d, 0x20, 0xcd, 0xc9, 0x44,
+          0xb6, 0x02, 0x2c, 0xac, 0x3c, 0x49, 0x82, 0xb1,
+          0x0d, 0x5e, 0xeb, 0x55, 0xc3, 0xe4, 0xde, 0x15,
+          0x13, 0x46, 0x76, 0xfb, 0x6d, 0xe0, 0x44, 0x60,
+          0x65, 0xc9, 0x74, 0x40, 0xfa, 0x8c, 0x6a, 0x58 } },
+
       { NULL }
     };
   const char *what;
   const char *errtxt;
   int tvidx;
   
   for (tvidx=0; tv[tvidx].desc; tvidx++)
     {
       what = tv[tvidx].desc;
       errtxt = check_one (GCRY_MD_SHA512,
                           tv[tvidx].data, strlen (tv[tvidx].data),
                           tv[tvidx].key, strlen (tv[tvidx].key),
                           tv[tvidx].expect, DIM (tv[tvidx].expect) );
       if (errtxt)
         goto failed;
     }
 
   return 0; /* Succeeded. */
 
  failed:
   if (report)
     report ("hmac", GCRY_MD_SHA512, what, errtxt);
   return GPG_ERR_SELFTEST_FAILED;
 }
 
 
 
 /* Run a full self-test for ALGO and return 0 on success.  */
 static gpg_err_code_t
 run_selftests (int algo, selftest_report_func_t report)
 {
   gpg_err_code_t ec;
 
   switch (algo)
     {
     case GCRY_MD_SHA1:
       ec = selftests_sha1 (report);
       break;
     case GCRY_MD_SHA224:
       ec = selftests_sha224 (report);
       break;
     case GCRY_MD_SHA256:
       ec = selftests_sha256 (report);
       break;
     case GCRY_MD_SHA384:
       ec = selftests_sha384 (report);
       break;
     case GCRY_MD_SHA512:
       ec = selftests_sha512 (report);
       break;
     default:
       ec = GPG_ERR_DIGEST_ALGO;
       break;
     }
   return ec;
 }
 
 
 
 
 /* Run the selftests for HMAC with digest algorithm ALGO with optional
    reporting function REPORT.  */
 gpg_error_t
 _gcry_hmac_selftest (int algo, selftest_report_func_t report)
 {
   gcry_err_code_t ec = 0;
 
   if (!gcry_md_test_algo (algo))
     {
       ec = run_selftests (algo, report);
     }
   else
     {
       ec = GPG_ERR_DIGEST_ALGO;
       if (report)
         report ("hmac", algo, "module", "algorithm not available");
     }
   return gpg_error (ec);
 }
diff --git a/cipher/sha1.c b/cipher/sha1.c
index caf1c9a0..be3bd940 100644
--- a/cipher/sha1.c
+++ b/cipher/sha1.c
@@ -1,455 +1,476 @@
 /* sha1.c - SHA1 hash function
  * Copyright (C) 1998, 2001, 2002, 2003, 2008 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
  * Libgcrypt 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.
  *
  * Libgcrypt 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 program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 
 /*  Test vectors:
  *
  *  "abc"
  *  A999 3E36 4706 816A BA3E  2571 7850 C26C 9CD0 D89D
  *
  *  "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
  *  8498 3E44 1C3B D26E BAAE  4AA1 F951 29E5 E546 70F1
  */
 
 
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #ifdef HAVE_STDINT_H 
 # include <stdint.h>
 #endif
 
 #include "g10lib.h"
 #include "memory.h"
 #include "bithelp.h"
 #include "cipher.h"
+#include "hash-common.h"
 
 
 /* A macro to test whether P is properly aligned for an u32 type.
    Note that config.h provides a suitable replacement for uintptr_t if
    it does not exist in stdint.h.  */
 /* #if __GNUC__ >= 2 */
 /* # define U32_ALIGNED_P(p) (!(((uintptr_t)p) % __alignof__ (u32))) */
 /* #else */
 /* # define U32_ALIGNED_P(p) (!(((uintptr_t)p) % sizeof (u32))) */
 /* #endif */
 
 #define TRANSFORM(x,d,n) transform ((x), (d), (n))
 
 
 typedef struct 
 {
   u32           h0,h1,h2,h3,h4;
   u32           nblocks;
   unsigned char buf[64];
   int           count;
 } SHA1_CONTEXT;
 
 
 
 static void
 sha1_init (void *context)
 {
   SHA1_CONTEXT *hd = context;
 
   hd->h0 = 0x67452301;
   hd->h1 = 0xefcdab89;
   hd->h2 = 0x98badcfe;
   hd->h3 = 0x10325476;
   hd->h4 = 0xc3d2e1f0;
   hd->nblocks = 0;
   hd->count = 0;
 }
 
 
 /* Round function macros. */
 #define K1  0x5A827999L
 #define K2  0x6ED9EBA1L
 #define K3  0x8F1BBCDCL
 #define K4  0xCA62C1D6L
 #define F1(x,y,z)   ( z ^ ( x & ( y ^ z ) ) )
 #define F2(x,y,z)   ( x ^ y ^ z )
 #define F3(x,y,z)   ( ( x & y ) | ( z & ( x | y ) ) )
 #define F4(x,y,z)   ( x ^ y ^ z )
 #define M(i) ( tm =    x[ i    &0x0f]  \
                      ^ x[(i-14)&0x0f]  \
 	 	     ^ x[(i-8) &0x0f]  \
                      ^ x[(i-3) &0x0f], \
                      (x[i&0x0f] = rol(tm, 1)))
 #define R(a,b,c,d,e,f,k,m)  do { e += rol( a, 5 )     \
 	                              + f( b, c, d )  \
 		 		      + k	      \
 			 	      + m;	      \
 				 b = rol( b, 30 );    \
 			       } while(0)
 
 
 /*
  * Transform NBLOCKS of each 64 bytes (16 32-bit words) at DATA.
  */
 static void
 transform (SHA1_CONTEXT *hd, const unsigned char *data, size_t nblocks)
 {
   register u32 a, b, c, d, e; /* Local copies of the chaining variables.  */
   register u32 tm;            /* Helper.  */
   u32 x[16];                  /* The array we work on. */
   
   /* Loop over all blocks.  */
   for ( ;nblocks; nblocks--)
     {
 #ifdef WORDS_BIGENDIAN
       memcpy (x, data, 64);
       data += 64;
 #else
       {
         int i;
         unsigned char *p;
 
         for(i=0, p=(unsigned char*)x; i < 16; i++, p += 4 )
           {
             p[3] = *data++;
             p[2] = *data++;
             p[1] = *data++;
             p[0] = *data++;
           }
       }
 #endif
       /* Get the values of the chaining variables. */
       a = hd->h0;
       b = hd->h1;
       c = hd->h2;
       d = hd->h3;
       e = hd->h4;
 
       /* Transform. */
       R( a, b, c, d, e, F1, K1, x[ 0] );
       R( e, a, b, c, d, F1, K1, x[ 1] );
       R( d, e, a, b, c, F1, K1, x[ 2] );
       R( c, d, e, a, b, F1, K1, x[ 3] );
       R( b, c, d, e, a, F1, K1, x[ 4] );
       R( a, b, c, d, e, F1, K1, x[ 5] );
       R( e, a, b, c, d, F1, K1, x[ 6] );
       R( d, e, a, b, c, F1, K1, x[ 7] );
       R( c, d, e, a, b, F1, K1, x[ 8] );
       R( b, c, d, e, a, F1, K1, x[ 9] );
       R( a, b, c, d, e, F1, K1, x[10] );
       R( e, a, b, c, d, F1, K1, x[11] );
       R( d, e, a, b, c, F1, K1, x[12] );
       R( c, d, e, a, b, F1, K1, x[13] );
       R( b, c, d, e, a, F1, K1, x[14] );
       R( a, b, c, d, e, F1, K1, x[15] );
       R( e, a, b, c, d, F1, K1, M(16) );
       R( d, e, a, b, c, F1, K1, M(17) );
       R( c, d, e, a, b, F1, K1, M(18) );
       R( b, c, d, e, a, F1, K1, M(19) );
       R( a, b, c, d, e, F2, K2, M(20) );
       R( e, a, b, c, d, F2, K2, M(21) );
       R( d, e, a, b, c, F2, K2, M(22) );
       R( c, d, e, a, b, F2, K2, M(23) );
       R( b, c, d, e, a, F2, K2, M(24) );
       R( a, b, c, d, e, F2, K2, M(25) );
       R( e, a, b, c, d, F2, K2, M(26) );
       R( d, e, a, b, c, F2, K2, M(27) );
       R( c, d, e, a, b, F2, K2, M(28) );
       R( b, c, d, e, a, F2, K2, M(29) );
       R( a, b, c, d, e, F2, K2, M(30) );
       R( e, a, b, c, d, F2, K2, M(31) );
       R( d, e, a, b, c, F2, K2, M(32) );
       R( c, d, e, a, b, F2, K2, M(33) );
       R( b, c, d, e, a, F2, K2, M(34) );
       R( a, b, c, d, e, F2, K2, M(35) );
       R( e, a, b, c, d, F2, K2, M(36) );
       R( d, e, a, b, c, F2, K2, M(37) );
       R( c, d, e, a, b, F2, K2, M(38) );
       R( b, c, d, e, a, F2, K2, M(39) );
       R( a, b, c, d, e, F3, K3, M(40) );
       R( e, a, b, c, d, F3, K3, M(41) );
       R( d, e, a, b, c, F3, K3, M(42) );
       R( c, d, e, a, b, F3, K3, M(43) );
       R( b, c, d, e, a, F3, K3, M(44) );
       R( a, b, c, d, e, F3, K3, M(45) );
       R( e, a, b, c, d, F3, K3, M(46) );
       R( d, e, a, b, c, F3, K3, M(47) );
       R( c, d, e, a, b, F3, K3, M(48) );
       R( b, c, d, e, a, F3, K3, M(49) );
       R( a, b, c, d, e, F3, K3, M(50) );
       R( e, a, b, c, d, F3, K3, M(51) );
       R( d, e, a, b, c, F3, K3, M(52) );
       R( c, d, e, a, b, F3, K3, M(53) );
       R( b, c, d, e, a, F3, K3, M(54) );
       R( a, b, c, d, e, F3, K3, M(55) );
       R( e, a, b, c, d, F3, K3, M(56) );
       R( d, e, a, b, c, F3, K3, M(57) );
       R( c, d, e, a, b, F3, K3, M(58) );
       R( b, c, d, e, a, F3, K3, M(59) );
       R( a, b, c, d, e, F4, K4, M(60) );
       R( e, a, b, c, d, F4, K4, M(61) );
       R( d, e, a, b, c, F4, K4, M(62) );
       R( c, d, e, a, b, F4, K4, M(63) );
       R( b, c, d, e, a, F4, K4, M(64) );
       R( a, b, c, d, e, F4, K4, M(65) );
       R( e, a, b, c, d, F4, K4, M(66) );
       R( d, e, a, b, c, F4, K4, M(67) );
       R( c, d, e, a, b, F4, K4, M(68) );
       R( b, c, d, e, a, F4, K4, M(69) );
       R( a, b, c, d, e, F4, K4, M(70) );
       R( e, a, b, c, d, F4, K4, M(71) );
       R( d, e, a, b, c, F4, K4, M(72) );
       R( c, d, e, a, b, F4, K4, M(73) );
       R( b, c, d, e, a, F4, K4, M(74) );
       R( a, b, c, d, e, F4, K4, M(75) );
       R( e, a, b, c, d, F4, K4, M(76) );
       R( d, e, a, b, c, F4, K4, M(77) );
       R( c, d, e, a, b, F4, K4, M(78) );
       R( b, c, d, e, a, F4, K4, M(79) );
 
       /* Update the chaining variables. */
       hd->h0 += a;
       hd->h1 += b;
       hd->h2 += c;
       hd->h3 += d;
       hd->h4 += e;
     }
 }
 
 
 /* Update the message digest with the contents
  * of INBUF with length INLEN.
  */
 static void
 sha1_write( void *context, const void *inbuf_arg, size_t inlen)
 {
   const unsigned char *inbuf = inbuf_arg;
   SHA1_CONTEXT *hd = context;
   size_t nblocks;
 
   if (hd->count == 64)  /* Flush the buffer. */
     {
       TRANSFORM( hd, hd->buf, 1 );
       _gcry_burn_stack (88+4*sizeof(void*));
       hd->count = 0;
       hd->nblocks++;
     }
   if (!inbuf)
     return;
 
   if (hd->count)
     {
       for (; inlen && hd->count < 64; inlen--)
         hd->buf[hd->count++] = *inbuf++;
       sha1_write (hd, NULL, 0);
       if (!inlen)
         return;
     }
 
   nblocks = inlen / 64;
   if (nblocks)
     {
       TRANSFORM (hd, inbuf, nblocks);
       hd->count = 0;
       hd->nblocks += nblocks;
       inlen -= nblocks * 64;
       inbuf += nblocks * 64;
     }
   _gcry_burn_stack (88+4*sizeof(void*));
 
   /* Save remaining bytes.  */
   for (; inlen && hd->count < 64; inlen--)
     hd->buf[hd->count++] = *inbuf++;
 }
 
 
 /* The routine final terminates the computation and
  * returns the digest.
  * The handle is prepared for a new cycle, but adding bytes to the
  * handle will the destroy the returned buffer.
  * Returns: 20 bytes representing the digest.
  */
 
 static void
 sha1_final(void *context)
 {
   SHA1_CONTEXT *hd = context;
   
   u32 t, msb, lsb;
   unsigned char *p;
 
   sha1_write(hd, NULL, 0); /* flush */;
 
   t = hd->nblocks;
   /* multiply by 64 to make a byte count */
   lsb = t << 6;
   msb = t >> 26;
   /* add the count */
   t = lsb;
   if( (lsb += hd->count) < t )
     msb++;
   /* multiply by 8 to make a bit count */
   t = lsb;
   lsb <<= 3;
   msb <<= 3;
   msb |= t >> 29;
 
   if( hd->count < 56 )  /* enough room */
     {
       hd->buf[hd->count++] = 0x80; /* pad */
       while( hd->count < 56 )
         hd->buf[hd->count++] = 0;  /* pad */
     }
   else  /* need one extra block */
     {
       hd->buf[hd->count++] = 0x80; /* pad character */
       while( hd->count < 64 )
         hd->buf[hd->count++] = 0;
       sha1_write(hd, NULL, 0);  /* flush */;
       memset(hd->buf, 0, 56 ); /* fill next block with zeroes */
     }
   /* append the 64 bit count */
   hd->buf[56] = msb >> 24;
   hd->buf[57] = msb >> 16;
   hd->buf[58] = msb >>  8;
   hd->buf[59] = msb	   ;
   hd->buf[60] = lsb >> 24;
   hd->buf[61] = lsb >> 16;
   hd->buf[62] = lsb >>  8;
   hd->buf[63] = lsb	   ;
   TRANSFORM( hd, hd->buf, 1 );
   _gcry_burn_stack (88+4*sizeof(void*));
 
   p = hd->buf;
 #ifdef WORDS_BIGENDIAN
 #define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0)
 #else /* little endian */
 #define X(a) do { *p++ = hd->h##a >> 24; *p++ = hd->h##a >> 16;	 \
                   *p++ = hd->h##a >> 8; *p++ = hd->h##a; } while(0)
 #endif
   X(0);
   X(1);
   X(2);
   X(3);
   X(4);
 #undef X
 
 }
 
 static unsigned char *
 sha1_read( void *context )
 {
   SHA1_CONTEXT *hd = context;
 
   return hd->buf;
 }
 
 /****************
  * Shortcut functions which puts the hash value of the supplied buffer
  * into outbuf which must have a size of 20 bytes.
  */
 void
 _gcry_sha1_hash_buffer (void *outbuf, const void *buffer, size_t length)
 {
   SHA1_CONTEXT hd;
 
   sha1_init (&hd);
   sha1_write (&hd, buffer, length);
   sha1_final (&hd);
   memcpy (outbuf, hd.buf, 20);
 }
 
 
 
 /* 
      Self-test section.
  */
 
 
 static gpg_err_code_t
 selftests_sha1 (selftest_report_func_t report)
 {
   const char *what;
   const char *errtxt;
   
-  what = "low-level";
-  errtxt = NULL; /*selftest ();*/
+  what = "short string";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA1, 0, 
+     "abc", 3,
+     "\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E"
+     "\x25\x71\x78\x50\xC2\x6C\x9C\xD0\xD8\x9D", 20);
   if (errtxt)
     goto failed;
 
-  /* FIXME:  need more tests.  */
+  what = "long string";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA1, 0, 
+     "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56,
+     "\x84\x98\x3E\x44\x1C\x3B\xD2\x6E\xBA\xAE"
+     "\x4A\xA1\xF9\x51\x29\xE5\xE5\x46\x70\xF1", 20);
+  if (errtxt)
+    goto failed;
+
+  what = "one million \"a\"";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA1, 1,
+     NULL, 0,
+     "\x34\xAA\x97\x3C\xD4\xC4\xDA\xA4\xF6\x1E"
+     "\xEB\x2B\xDB\xAD\x27\x31\x65\x34\x01\x6F", 20);
+  if (errtxt)
+    goto failed;
 
   return 0; /* Succeeded. */
 
  failed:
   if (report)
     report ("digest", GCRY_MD_SHA1, what, errtxt);
   return GPG_ERR_SELFTEST_FAILED;
 }
 
 
 /* Run a full self-test for ALGO and return 0 on success.  */
 static gpg_err_code_t
 run_selftests (int algo, selftest_report_func_t report)
 {
   gpg_err_code_t ec;
 
   switch (algo)
     {
     case GCRY_MD_SHA1:
       ec = selftests_sha1 (report);
       break;
     default:
       ec = GPG_ERR_DIGEST_ALGO;
       break;
         
     }
   return ec;
 }
 
 
 
 
 static unsigned char asn[15] = /* Object ID is 1.3.14.3.2.26 */
   { 0x30, 0x21, 0x30, 0x09, 0x06, 0x05, 0x2b, 0x0e, 0x03,
     0x02, 0x1a, 0x05, 0x00, 0x04, 0x14 };
 
 static gcry_md_oid_spec_t oid_spec_sha1[] =
   {
     /* iso.member-body.us.rsadsi.pkcs.pkcs-1.5 (sha1WithRSAEncryption) */
     { "1.2.840.113549.1.1.5" },
     /* iso.member-body.us.x9-57.x9cm.3 (dsaWithSha1)*/
     { "1.2.840.10040.4.3" },
     /* from NIST's OIW  (sha1) */
     { "1.3.14.3.2.26" },
     /* from NIST OIW (sha-1WithRSAEncryption) */
     { "1.3.14.3.2.29" },
     /* iso.member-body.us.ansi-x9-62.signatures.ecdsa-with-sha1 */
     { "1.2.840.10045.4.1" },
     { NULL },
   };
 
 gcry_md_spec_t _gcry_digest_spec_sha1 =
   {
     "SHA1", asn, DIM (asn), oid_spec_sha1, 20,
     sha1_init, sha1_write, sha1_final, sha1_read,
     sizeof (SHA1_CONTEXT)
   };
 md_extra_spec_t _gcry_digest_extraspec_sha1 = 
   {
     run_selftests
   };
 
diff --git a/cipher/sha256.c b/cipher/sha256.c
index b0a5629d..bb62e230 100644
--- a/cipher/sha256.c
+++ b/cipher/sha256.c
@@ -1,438 +1,479 @@
 /* sha256.c - SHA256 hash function
  *	Copyright (C) 2003, 2006, 2008 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
  * Libgcrypt 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.
  *
  * Libgcrypt 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 program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 
 /*  Test vectors:
     
     "abc"
     SHA224: 23097d22 3405d822 8642a477 bda255b3 2aadbce4 bda0b3f7 e36c9da7
     SHA256: ba7816bf 8f01cfea 414140de 5dae2223 b00361a3 96177a9c b410ff61 f20015ad
 
     "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"
     SHA224: 75388b16 512776cc 5dba5da1 fd890150 b0c6455c b4f58b19 52522525
     SHA256: 248d6a61 d20638b8 e5c02693 0c3e6039 a33ce459 64ff2167 f6ecedd4 19db06c1
  
     "a" one million times
     SHA224: 20794655 980c91d8 bbb4c1ea 97618a4b f03f4258 1948b2ee 4ee7ad67
     SHA256: cdc76e5c 9914fb92 81a1c7e2 84d73e67 f1809a48 a497200e 046d39cc c7112cd0
 
  */
 
 
 #include <config.h>
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 
 #include "g10lib.h"
 #include "memory.h"
 #include "bithelp.h"
 #include "cipher.h"
+#include "hash-common.h"
 
 typedef struct {
   u32  h0,h1,h2,h3,h4,h5,h6,h7;
   u32  nblocks;
   byte buf[64];
   int  count;
 } SHA256_CONTEXT;
 
 
 static void
 sha256_init (void *context)
 {
   SHA256_CONTEXT *hd = context;
 
   hd->h0 = 0x6a09e667;
   hd->h1 = 0xbb67ae85;
   hd->h2 = 0x3c6ef372;
   hd->h3 = 0xa54ff53a;
   hd->h4 = 0x510e527f;
   hd->h5 = 0x9b05688c;
   hd->h6 = 0x1f83d9ab;
   hd->h7 = 0x5be0cd19;
 
   hd->nblocks = 0;
   hd->count = 0;
 }
 
 
 static void
 sha224_init (void *context)
 {
   SHA256_CONTEXT *hd = context;
 
   hd->h0 = 0xc1059ed8;
   hd->h1 = 0x367cd507;
   hd->h2 = 0x3070dd17;
   hd->h3 = 0xf70e5939;
   hd->h4 = 0xffc00b31;
   hd->h5 = 0x68581511;
   hd->h6 = 0x64f98fa7;
   hd->h7 = 0xbefa4fa4;
 
   hd->nblocks = 0;
   hd->count = 0;
 }
 
 
 /*
   Transform the message X which consists of 16 32-bit-words. See FIPS
   180-2 for details.  */
 #define Cho(x,y,z) (z ^ (x & (y ^ z)))      /* (4.2) same as SHA-1's F1 */
 #define Maj(x,y,z) ((x & y) | (z & (x|y)))  /* (4.3) same as SHA-1's F3 */
 #define Sum0(x) (ror ((x), 2) ^ ror ((x), 13) ^ ror ((x), 22))  /* (4.4) */
 #define Sum1(x) (ror ((x), 6) ^ ror ((x), 11) ^ ror ((x), 25))  /* (4.5) */
 #define S0(x) (ror ((x), 7) ^ ror ((x), 18) ^ ((x) >> 3))       /* (4.6) */
 #define S1(x) (ror ((x), 17) ^ ror ((x), 19) ^ ((x) >> 10))     /* (4.7) */
 #define R(a,b,c,d,e,f,g,h,k,w) do                                 \
           {                                                       \
             t1 = (h) + Sum1((e)) + Cho((e),(f),(g)) + (k) + (w);  \
             t2 = Sum0((a)) + Maj((a),(b),(c));                    \
             h = g;                                                \
             g = f;                                                \
             f = e;                                                \
             e = d + t1;                                           \
             d = c;                                                \
             c = b;                                                \
             b = a;                                                \
             a = t1 + t2;                                          \
           } while (0)
  
 static void
 transform (SHA256_CONTEXT *hd, const unsigned char *data)
 {
   static const u32 K[64] = {
     0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
     0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
     0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
     0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 
     0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
     0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
     0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
     0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
     0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
     0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
     0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
     0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
     0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
     0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
     0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
     0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
   };
 
   u32 a,b,c,d,e,f,g,h,t1,t2;
   u32 x[16];
   u32 w[64];
   int i;
   
   a = hd->h0;
   b = hd->h1;
   c = hd->h2;
   d = hd->h3;
   e = hd->h4;
   f = hd->h5;
   g = hd->h6;
   h = hd->h7;
   
 #ifdef WORDS_BIGENDIAN
   memcpy (x, data, 64);
 #else
   { 
     byte *p2;
   
     for (i=0, p2=(byte*)x; i < 16; i++, p2 += 4 ) 
       {
         p2[3] = *data++;
         p2[2] = *data++;
         p2[1] = *data++;
         p2[0] = *data++;
       }
   }
 #endif
 
   for (i=0; i < 16; i++)
     w[i] = x[i];
   for (; i < 64; i++)
     w[i] = S1(w[i-2]) + w[i-7] + S0(w[i-15]) + w[i-16];
 
   for (i=0; i < 64; i++)
     R(a,b,c,d,e,f,g,h,K[i],w[i]);
 
   hd->h0 += a;
   hd->h1 += b;
   hd->h2 += c;
   hd->h3 += d;
   hd->h4 += e;
   hd->h5 += f;
   hd->h6 += g;
   hd->h7 += h;
 }
 #undef Cho
 #undef Maj
 #undef Sum0
 #undef Sum1
 #undef S0
 #undef S1
 #undef R
 
 
 /* Update the message digest with the contents of INBUF with length
   INLEN.  */
 static void
 sha256_write (void *context, const void *inbuf_arg, size_t inlen)
 {
   const unsigned char *inbuf = inbuf_arg;
   SHA256_CONTEXT *hd = context;
 
   if (hd->count == 64)
     { /* flush the buffer */
       transform (hd, hd->buf);
       _gcry_burn_stack (74*4+32);
       hd->count = 0;
       hd->nblocks++;
     }
   if (!inbuf)
     return;
   if (hd->count)
     {
       for (; inlen && hd->count < 64; inlen--)
         hd->buf[hd->count++] = *inbuf++;
       sha256_write (hd, NULL, 0);
       if (!inlen)
         return;
     }
 
   while (inlen >= 64)
     {
       transform (hd, inbuf);
       hd->count = 0;
       hd->nblocks++;
       inlen -= 64;
       inbuf += 64;
     }
   _gcry_burn_stack (74*4+32);
   for (; inlen && hd->count < 64; inlen--)
     hd->buf[hd->count++] = *inbuf++;
 }
 
 
 /*
    The routine finally terminates the computation and returns the
    digest.  The handle is prepared for a new cycle, but adding bytes
    to the handle will the destroy the returned buffer.  Returns: 32
    bytes with the message the digest.  */
 static void
 sha256_final(void *context)
 {
   SHA256_CONTEXT *hd = context;
   u32 t, msb, lsb;
   byte *p;
   
   sha256_write (hd, NULL, 0); /* flush */;
 
   t = hd->nblocks;
   /* multiply by 64 to make a byte count */
   lsb = t << 6;
   msb = t >> 26;
   /* add the count */
   t = lsb;
   if ((lsb += hd->count) < t)
     msb++;
   /* multiply by 8 to make a bit count */
   t = lsb;
   lsb <<= 3;
   msb <<= 3;
   msb |= t >> 29;
 
   if (hd->count < 56)
     { /* enough room */
       hd->buf[hd->count++] = 0x80; /* pad */
       while (hd->count < 56)
         hd->buf[hd->count++] = 0;  /* pad */
     }
   else
     { /* need one extra block */
       hd->buf[hd->count++] = 0x80; /* pad character */
       while (hd->count < 64)
         hd->buf[hd->count++] = 0;
       sha256_write (hd, NULL, 0);  /* flush */;
       memset (hd->buf, 0, 56 ); /* fill next block with zeroes */
     }
   /* append the 64 bit count */
   hd->buf[56] = msb >> 24;
   hd->buf[57] = msb >> 16;
   hd->buf[58] = msb >>  8;
   hd->buf[59] = msb;
   hd->buf[60] = lsb >> 24;
   hd->buf[61] = lsb >> 16;
   hd->buf[62] = lsb >>  8;
   hd->buf[63] = lsb;
   transform (hd, hd->buf);
   _gcry_burn_stack (74*4+32);
 
   p = hd->buf;
 #ifdef WORDS_BIGENDIAN
 #define X(a) do { *(u32*)p = hd->h##a ; p += 4; } while(0)
 #else /* little endian */
 #define X(a) do { *p++ = hd->h##a >> 24; *p++ = hd->h##a >> 16;	 \
 		  *p++ = hd->h##a >> 8; *p++ = hd->h##a; } while(0)
 #endif
   X(0);
   X(1);
   X(2);
   X(3);
   X(4);
   X(5);
   X(6);
   X(7);
 #undef X
 }
 
 static byte *
 sha256_read (void *context)
 {
   SHA256_CONTEXT *hd = context;
 
   return hd->buf;
 }
 
 
 
 /* 
      Self-test section.
  */
 
 
 static gpg_err_code_t
 selftests_sha224 (selftest_report_func_t report)
 {
   const char *what;
   const char *errtxt;
   
-  what = "low-level";
-  errtxt = NULL; /*selftest ();*/
+  what = "short string";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA224, 0, 
+     "abc", 3,
+     "\x23\x09\x7d\x22\x34\x05\xd8\x22\x86\x42\xa4\x77\xbd\xa2\x55\xb3"
+     "\x2a\xad\xbc\xe4\xbd\xa0\xb3\xf7\xe3\x6c\x9d\xa7", 28);
   if (errtxt)
     goto failed;
 
-  /* FIXME:  need more tests.  */
+  what = "long string";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA224, 0, 
+     "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56,
+     "\x75\x38\x8b\x16\x51\x27\x76\xcc\x5d\xba\x5d\xa1\xfd\x89\x01\x50"
+     "\xb0\xc6\x45\x5c\xb4\xf5\x8b\x19\x52\x52\x25\x25", 28);
+  if (errtxt)
+    goto failed;
+
+  what = "one million \"a\"";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA224, 1,
+     NULL, 0,
+     "\x20\x79\x46\x55\x98\x0c\x91\xd8\xbb\xb4\xc1\xea\x97\x61\x8a\x4b"
+     "\xf0\x3f\x42\x58\x19\x48\xb2\xee\x4e\xe7\xad\x67", 28);
+  if (errtxt)
+    goto failed;
 
   return 0; /* Succeeded. */
 
  failed:
   if (report)
     report ("digest", GCRY_MD_SHA224, what, errtxt);
   return GPG_ERR_SELFTEST_FAILED;
 }
 
 static gpg_err_code_t
 selftests_sha256 (selftest_report_func_t report)
 {
   const char *what;
   const char *errtxt;
   
-  what = "low-level";
-  errtxt = NULL; /*selftest ();*/
+  what = "short string";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA256, 0, 
+     "abc", 3,
+     "\xba\x78\x16\xbf\x8f\x01\xcf\xea\x41\x41\x40\xde\x5d\xae\x22\x23"
+     "\xb0\x03\x61\xa3\x96\x17\x7a\x9c\xb4\x10\xff\x61\xf2\x00\x15\xad", 32);
   if (errtxt)
     goto failed;
 
-  /* FIXME:  need more tests.  */
+  what = "long string";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA256, 0, 
+     "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq", 56,
+     "\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39"
+     "\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1", 32);
+  if (errtxt)
+    goto failed;
+
+  what = "one million \"a\"";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA256, 1,
+     NULL, 0,
+     "\xcd\xc7\x6e\x5c\x99\x14\xfb\x92\x81\xa1\xc7\xe2\x84\xd7\x3e\x67"
+     "\xf1\x80\x9a\x48\xa4\x97\x20\x0e\x04\x6d\x39\xcc\xc7\x11\x2c\xd0", 32);
+  if (errtxt)
+    goto failed;
 
   return 0; /* Succeeded. */
 
  failed:
   if (report)
     report ("digest", GCRY_MD_SHA256, what, errtxt);
   return GPG_ERR_SELFTEST_FAILED;
 }
 
 
 /* Run a full self-test for ALGO and return 0 on success.  */
 static gpg_err_code_t
 run_selftests (int algo, selftest_report_func_t report)
 {
   gpg_err_code_t ec;
 
   switch (algo)
     {
     case GCRY_MD_SHA224:
       ec = selftests_sha224 (report);
       break;
     case GCRY_MD_SHA256:
       ec = selftests_sha256 (report);
       break;
     default:
       ec = GPG_ERR_DIGEST_ALGO;
       break;
         
     }
   return ec;
 }
 
 
 
 
 static byte asn224[19] = /* Object ID is 2.16.840.1.101.3.4.2.4 */
   { 0x30, 0x2D, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86, 0x48,
     0x01, 0x65, 0x03, 0x04, 0x02, 0x04, 0x05, 0x00, 0x04,
     0x1C
   };
 
 static gcry_md_oid_spec_t oid_spec_sha224[] =
   {
     /* From RFC3874, Section 4 */
     { "2.16.840.1.101.3.4.2.4" }, 
     { NULL },
   };
 
 static byte asn256[19] = /* Object ID is  2.16.840.1.101.3.4.2.1 */
   { 0x30, 0x31, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
     0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x01, 0x05,
     0x00, 0x04, 0x20 };
 
 static gcry_md_oid_spec_t oid_spec_sha256[] =
   {
     /* According to the OpenPGP draft rfc2440-bis06 */
     { "2.16.840.1.101.3.4.2.1" }, 
     /* PKCS#1 sha256WithRSAEncryption */
     { "1.2.840.113549.1.1.11" },
 
     { NULL },
   };
 
 gcry_md_spec_t _gcry_digest_spec_sha224 =
   {
     "SHA224", asn224, DIM (asn224), oid_spec_sha224, 28,
     sha224_init, sha256_write, sha256_final, sha256_read,
     sizeof (SHA256_CONTEXT)
   };
 md_extra_spec_t _gcry_digest_extraspec_sha224 = 
   {
     run_selftests
   };
 
 gcry_md_spec_t _gcry_digest_spec_sha256 =
   {
     "SHA256", asn256, DIM (asn256), oid_spec_sha256, 32,
     sha256_init, sha256_write, sha256_final, sha256_read,
     sizeof (SHA256_CONTEXT)
   };
 md_extra_spec_t _gcry_digest_extraspec_sha256 = 
   {
     run_selftests
   };
diff --git a/cipher/sha512.c b/cipher/sha512.c
index e1ba517b..d4a03f54 100644
--- a/cipher/sha512.c
+++ b/cipher/sha512.c
@@ -1,491 +1,543 @@
 /* sha512.c - SHA384 and SHA512 hash functions
  *	Copyright (C) 2003, 2008 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
  * Libgcrypt 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.
  *
  * Libgcrypt 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 program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 
 /*  Test vectors from FIPS-180-2:
  *
  *  "abc"
  * 384:
  *  CB00753F 45A35E8B B5A03D69 9AC65007 272C32AB 0EDED163
  *  1A8B605A 43FF5BED 8086072B A1E7CC23 58BAECA1 34C825A7
  * 512:
  *  DDAF35A1 93617ABA CC417349 AE204131 12E6FA4E 89A97EA2 0A9EEEE6 4B55D39A
  *  2192992A 274FC1A8 36BA3C23 A3FEEBBD 454D4423 643CE80E 2A9AC94F A54CA49F
  *
  *  "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmnhijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu"
  * 384:
  *  09330C33 F71147E8 3D192FC7 82CD1B47 53111B17 3B3B05D2
  *  2FA08086 E3B0F712 FCC7C71A 557E2DB9 66C3E9FA 91746039
  * 512:
  *  8E959B75 DAE313DA 8CF4F728 14FC143F 8F7779C6 EB9F7FA1 7299AEAD B6889018
  *  501D289E 4900F7E4 331B99DE C4B5433A C7D329EE B6DD2654 5E96E55B 874BE909
  *
  *  "a" x 1000000
  * 384:
  *  9D0E1809 716474CB 086E834E 310A4A1C ED149E9C 00F24852
  *  7972CEC5 704C2A5B 07B8B3DC 38ECC4EB AE97DDD8 7F3D8985
  * 512:
  *  E718483D 0CE76964 4E2E42C7 BC15B463 8E1F98B1 3B204428 5632A803 AFA973EB
  *  DE0FF244 877EA60A 4CB0432C E577C31B EB009C5C 2C49AA2E 4EADB217 AD8CC09B
  */
 
 
 #include <config.h>
 #include <string.h>
 #include "g10lib.h"
 #include "bithelp.h"
 #include "cipher.h"
+#include "hash-common.h"
 
 typedef struct
 {
   u64 h0, h1, h2, h3, h4, h5, h6, h7;
   u64 nblocks;
   byte buf[128];
   int count;
 } SHA512_CONTEXT;
 
 static void
 sha512_init (void *context)
 {
   SHA512_CONTEXT *hd = context;
 
   hd->h0 = U64_C(0x6a09e667f3bcc908);
   hd->h1 = U64_C(0xbb67ae8584caa73b);
   hd->h2 = U64_C(0x3c6ef372fe94f82b);
   hd->h3 = U64_C(0xa54ff53a5f1d36f1);
   hd->h4 = U64_C(0x510e527fade682d1);
   hd->h5 = U64_C(0x9b05688c2b3e6c1f);
   hd->h6 = U64_C(0x1f83d9abfb41bd6b);
   hd->h7 = U64_C(0x5be0cd19137e2179);
 
   hd->nblocks = 0;
   hd->count = 0;
 }
 
 static void
 sha384_init (void *context)
 {
   SHA512_CONTEXT *hd = context;
 
   hd->h0 = U64_C(0xcbbb9d5dc1059ed8);
   hd->h1 = U64_C(0x629a292a367cd507);
   hd->h2 = U64_C(0x9159015a3070dd17);
   hd->h3 = U64_C(0x152fecd8f70e5939);
   hd->h4 = U64_C(0x67332667ffc00b31);
   hd->h5 = U64_C(0x8eb44a8768581511);
   hd->h6 = U64_C(0xdb0c2e0d64f98fa7);
   hd->h7 = U64_C(0x47b5481dbefa4fa4);
 
   hd->nblocks = 0;
   hd->count = 0;
 }
 
 
 /****************
  * Transform the message W which consists of 16 64-bit-words
  */
 static void
 transform (SHA512_CONTEXT *hd, const unsigned char *data)
 {
   u64 a, b, c, d, e, f, g, h;
   u64 w[80];
   int t;
   static const u64 k[] =
     {
       U64_C(0x428a2f98d728ae22), U64_C(0x7137449123ef65cd),
       U64_C(0xb5c0fbcfec4d3b2f), U64_C(0xe9b5dba58189dbbc),
       U64_C(0x3956c25bf348b538), U64_C(0x59f111f1b605d019),
       U64_C(0x923f82a4af194f9b), U64_C(0xab1c5ed5da6d8118),
       U64_C(0xd807aa98a3030242), U64_C(0x12835b0145706fbe),
       U64_C(0x243185be4ee4b28c), U64_C(0x550c7dc3d5ffb4e2),
       U64_C(0x72be5d74f27b896f), U64_C(0x80deb1fe3b1696b1),
       U64_C(0x9bdc06a725c71235), U64_C(0xc19bf174cf692694),
       U64_C(0xe49b69c19ef14ad2), U64_C(0xefbe4786384f25e3),
       U64_C(0x0fc19dc68b8cd5b5), U64_C(0x240ca1cc77ac9c65),
       U64_C(0x2de92c6f592b0275), U64_C(0x4a7484aa6ea6e483),
       U64_C(0x5cb0a9dcbd41fbd4), U64_C(0x76f988da831153b5),
       U64_C(0x983e5152ee66dfab), U64_C(0xa831c66d2db43210),
       U64_C(0xb00327c898fb213f), U64_C(0xbf597fc7beef0ee4),
       U64_C(0xc6e00bf33da88fc2), U64_C(0xd5a79147930aa725),
       U64_C(0x06ca6351e003826f), U64_C(0x142929670a0e6e70),
       U64_C(0x27b70a8546d22ffc), U64_C(0x2e1b21385c26c926),
       U64_C(0x4d2c6dfc5ac42aed), U64_C(0x53380d139d95b3df),
       U64_C(0x650a73548baf63de), U64_C(0x766a0abb3c77b2a8),
       U64_C(0x81c2c92e47edaee6), U64_C(0x92722c851482353b),
       U64_C(0xa2bfe8a14cf10364), U64_C(0xa81a664bbc423001),
       U64_C(0xc24b8b70d0f89791), U64_C(0xc76c51a30654be30),
       U64_C(0xd192e819d6ef5218), U64_C(0xd69906245565a910),
       U64_C(0xf40e35855771202a), U64_C(0x106aa07032bbd1b8),
       U64_C(0x19a4c116b8d2d0c8), U64_C(0x1e376c085141ab53),
       U64_C(0x2748774cdf8eeb99), U64_C(0x34b0bcb5e19b48a8),
       U64_C(0x391c0cb3c5c95a63), U64_C(0x4ed8aa4ae3418acb),
       U64_C(0x5b9cca4f7763e373), U64_C(0x682e6ff3d6b2b8a3),
       U64_C(0x748f82ee5defb2fc), U64_C(0x78a5636f43172f60),
       U64_C(0x84c87814a1f0ab72), U64_C(0x8cc702081a6439ec),
       U64_C(0x90befffa23631e28), U64_C(0xa4506cebde82bde9),
       U64_C(0xbef9a3f7b2c67915), U64_C(0xc67178f2e372532b),
       U64_C(0xca273eceea26619c), U64_C(0xd186b8c721c0c207),
       U64_C(0xeada7dd6cde0eb1e), U64_C(0xf57d4f7fee6ed178),
       U64_C(0x06f067aa72176fba), U64_C(0x0a637dc5a2c898a6),
       U64_C(0x113f9804bef90dae), U64_C(0x1b710b35131c471b),
       U64_C(0x28db77f523047d84), U64_C(0x32caab7b40c72493),
       U64_C(0x3c9ebe0a15c9bebc), U64_C(0x431d67c49c100d4c),
       U64_C(0x4cc5d4becb3e42b6), U64_C(0x597f299cfc657e2a),
       U64_C(0x5fcb6fab3ad6faec), U64_C(0x6c44198c4a475817)
     };
 
   /* get values from the chaining vars */
   a = hd->h0;
   b = hd->h1;
   c = hd->h2;
   d = hd->h3;
   e = hd->h4;
   f = hd->h5;
   g = hd->h6;
   h = hd->h7;
 
 #ifdef WORDS_BIGENDIAN
   memcpy (w, data, 128);
 #else
   {
     int i;
     byte *p2;
 
     for (i = 0, p2 = (byte *) w; i < 16; i++, p2 += 8)
       {
 	p2[7] = *data++;
 	p2[6] = *data++;
 	p2[5] = *data++;
 	p2[4] = *data++;
 	p2[3] = *data++;
 	p2[2] = *data++;
 	p2[1] = *data++;
 	p2[0] = *data++;
       }
   }
 #endif
 
 #define ROTR(x,n) (((x)>>(n)) | ((x)<<(64-(n))))
 #define Ch(x,y,z) (((x) & (y)) ^ ((~(x)) & (z)))
 #define Maj(x,y,z) (((x) & (y)) ^ ((x) & (z)) ^ ((y) & (z)))
 #define Sum0(x) (ROTR((x),28) ^ ROTR((x),34) ^ ROTR((x),39))
 #define Sum1(x) (ROTR((x),14) ^ ROTR((x),18) ^ ROTR((x),41))
 #define S0(x) (ROTR((x),1) ^ ROTR((x),8) ^ ((x)>>7))
 #define S1(x) (ROTR((x),19) ^ ROTR((x),61) ^ ((x)>>6))
 
   for (t = 16; t < 80; t++)
     w[t] = S1 (w[t - 2]) + w[t - 7] + S0 (w[t - 15]) + w[t - 16];
 
   for (t = 0; t < 80; t++)
     {
       u64 t1, t2;
 
       t1 = h + Sum1 (e) + Ch (e, f, g) + k[t] + w[t];
       t2 = Sum0 (a) + Maj (a, b, c);
       h = g;
       g = f;
       f = e;
       e = d + t1;
       d = c;
       c = b;
       b = a;
       a = t1 + t2;
 
       /* printf("t=%d a=%016llX b=%016llX c=%016llX d=%016llX "
           "e=%016llX f=%016llX g=%016llX h=%016llX\n",t,a,b,c,d,e,f,g,h); */
     }
 
   /* update chaining vars */
   hd->h0 += a;
   hd->h1 += b;
   hd->h2 += c;
   hd->h3 += d;
   hd->h4 += e;
   hd->h5 += f;
   hd->h6 += g;
   hd->h7 += h;
 }
 
 
 /* Update the message digest with the contents
  * of INBUF with length INLEN.
  */
 static void
 sha512_write (void *context, const void *inbuf_arg, size_t inlen)
 {
   const unsigned char *inbuf = inbuf_arg;
   SHA512_CONTEXT *hd = context;
 
   if (hd->count == 128)
     {				/* flush the buffer */
       transform (hd, hd->buf);
       _gcry_burn_stack (768);
       hd->count = 0;
       hd->nblocks++;
     }
   if (!inbuf)
     return;
   if (hd->count)
     {
       for (; inlen && hd->count < 128; inlen--)
 	hd->buf[hd->count++] = *inbuf++;
       sha512_write (context, NULL, 0);
       if (!inlen)
 	return;
     }
 
   while (inlen >= 128)
     {
       transform (hd, inbuf);
       hd->count = 0;
       hd->nblocks++;
       inlen -= 128;
       inbuf += 128;
     }
   _gcry_burn_stack (768);
   for (; inlen && hd->count < 128; inlen--)
     hd->buf[hd->count++] = *inbuf++;
 }
 
 
 /* The routine final terminates the computation and
  * returns the digest.
  * The handle is prepared for a new cycle, but adding bytes to the
  * handle will the destroy the returned buffer.
  * Returns: 64 bytes representing the digest.  When used for sha384,
  * we take the leftmost 48 of those bytes.
  */
 
 static void
 sha512_final (void *context)
 {
   SHA512_CONTEXT *hd = context;
   u64 t, msb, lsb;
   byte *p;
 
   sha512_write (context, NULL, 0); /* flush */ ;
 
   t = hd->nblocks;
   /* multiply by 128 to make a byte count */
   lsb = t << 7;
   msb = t >> 57;
   /* add the count */
   t = lsb;
   if ((lsb += hd->count) < t)
     msb++;
   /* multiply by 8 to make a bit count */
   t = lsb;
   lsb <<= 3;
   msb <<= 3;
   msb |= t >> 61;
 
   if (hd->count < 112)
     {				/* enough room */
       hd->buf[hd->count++] = 0x80;	/* pad */
       while (hd->count < 112)
 	hd->buf[hd->count++] = 0;	/* pad */
     }
   else
     {				/* need one extra block */
       hd->buf[hd->count++] = 0x80;	/* pad character */
       while (hd->count < 128)
 	hd->buf[hd->count++] = 0;
       sha512_write (context, NULL, 0); /* flush */ ;
       memset (hd->buf, 0, 112);	/* fill next block with zeroes */
     }
   /* append the 128 bit count */
   hd->buf[112] = msb >> 56;
   hd->buf[113] = msb >> 48;
   hd->buf[114] = msb >> 40;
   hd->buf[115] = msb >> 32;
   hd->buf[116] = msb >> 24;
   hd->buf[117] = msb >> 16;
   hd->buf[118] = msb >> 8;
   hd->buf[119] = msb;
 
   hd->buf[120] = lsb >> 56;
   hd->buf[121] = lsb >> 48;
   hd->buf[122] = lsb >> 40;
   hd->buf[123] = lsb >> 32;
   hd->buf[124] = lsb >> 24;
   hd->buf[125] = lsb >> 16;
   hd->buf[126] = lsb >> 8;
   hd->buf[127] = lsb;
   transform (hd, hd->buf);
   _gcry_burn_stack (768);
 
   p = hd->buf;
 #ifdef WORDS_BIGENDIAN
 #define X(a) do { *(u64*)p = hd->h##a ; p += 8; } while (0)
 #else /* little endian */
 #define X(a) do { *p++ = hd->h##a >> 56; *p++ = hd->h##a >> 48;	      \
                   *p++ = hd->h##a >> 40; *p++ = hd->h##a >> 32;	      \
                   *p++ = hd->h##a >> 24; *p++ = hd->h##a >> 16;	      \
                   *p++ = hd->h##a >> 8;  *p++ = hd->h##a; } while (0)
 #endif
   X (0);
   X (1);
   X (2);
   X (3);
   X (4);
   X (5);
   /* Note that these last two chunks are included even for SHA384.
      We just ignore them. */
   X (6);
   X (7);
 #undef X
 }
 
 static byte *
 sha512_read (void *context)
 {
   SHA512_CONTEXT *hd = (SHA512_CONTEXT *) context;
   return hd->buf;
 }
 
 
 
 /* 
      Self-test section.
  */
 
 
 static gpg_err_code_t
 selftests_sha384 (selftest_report_func_t report)
 {
   const char *what;
   const char *errtxt;
   
-  what = "low-level";
-  errtxt = NULL; /*selftest ();*/
+  what = "short string";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA384, 0, 
+     "abc", 3,
+     "\xcb\x00\x75\x3f\x45\xa3\x5e\x8b\xb5\xa0\x3d\x69\x9a\xc6\x50\x07"
+     "\x27\x2c\x32\xab\x0e\xde\xd1\x63\x1a\x8b\x60\x5a\x43\xff\x5b\xed"
+     "\x80\x86\x07\x2b\xa1\xe7\xcc\x23\x58\xba\xec\xa1\x34\xc8\x25\xa7", 48);
   if (errtxt)
     goto failed;
 
-  /* FIXME:  need more tests.  */
+  what = "long string";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA384, 0, 
+     "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
+     "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", 112, 
+     "\x09\x33\x0C\x33\xF7\x11\x47\xE8\x3D\x19\x2F\xC7\x82\xCD\x1B\x47"
+     "\x53\x11\x1B\x17\x3B\x3B\x05\xD2\x2F\xA0\x80\x86\xE3\xB0\xF7\x12"
+     "\xFC\xC7\xC7\x1A\x55\x7E\x2D\xB9\x66\xC3\xE9\xFA\x91\x74\x60\x39", 48);
+  if (errtxt)
+    goto failed;
+
+  what = "one million \"a\"";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA384, 1,
+     NULL, 0,
+     "\x9D\x0E\x18\x09\x71\x64\x74\xCB\x08\x6E\x83\x4E\x31\x0A\x4A\x1C"
+     "\xED\x14\x9E\x9C\x00\xF2\x48\x52\x79\x72\xCE\xC5\x70\x4C\x2A\x5B"
+     "\x07\xB8\xB3\xDC\x38\xEC\xC4\xEB\xAE\x97\xDD\xD8\x7F\x3D\x89\x85", 48);
+ if (errtxt)
+    goto failed;
 
   return 0; /* Succeeded. */
 
  failed:
   if (report)
     report ("digest", GCRY_MD_SHA384, what, errtxt);
   return GPG_ERR_SELFTEST_FAILED;
 }
 
 static gpg_err_code_t
 selftests_sha512 (selftest_report_func_t report)
 {
   const char *what;
   const char *errtxt;
   
-  what = "low-level";
-  errtxt = NULL; /*selftest ();*/
+  what = "short string";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA512, 0, 
+     "abc", 3,
+     "\xDD\xAF\x35\xA1\x93\x61\x7A\xBA\xCC\x41\x73\x49\xAE\x20\x41\x31"
+     "\x12\xE6\xFA\x4E\x89\xA9\x7E\xA2\x0A\x9E\xEE\xE6\x4B\x55\xD3\x9A"
+     "\x21\x92\x99\x2A\x27\x4F\xC1\xA8\x36\xBA\x3C\x23\xA3\xFE\xEB\xBD"
+     "\x45\x4D\x44\x23\x64\x3C\xE8\x0E\x2A\x9A\xC9\x4F\xA5\x4C\xA4\x9F", 64);
   if (errtxt)
     goto failed;
 
-  /* FIXME:  need more tests.  */
+  what = "long string";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA512, 0, 
+     "abcdefghbcdefghicdefghijdefghijkefghijklfghijklmghijklmn"
+     "hijklmnoijklmnopjklmnopqklmnopqrlmnopqrsmnopqrstnopqrstu", 112, 
+     "\x8E\x95\x9B\x75\xDA\xE3\x13\xDA\x8C\xF4\xF7\x28\x14\xFC\x14\x3F"
+     "\x8F\x77\x79\xC6\xEB\x9F\x7F\xA1\x72\x99\xAE\xAD\xB6\x88\x90\x18"
+     "\x50\x1D\x28\x9E\x49\x00\xF7\xE4\x33\x1B\x99\xDE\xC4\xB5\x43\x3A"
+     "\xC7\xD3\x29\xEE\xB6\xDD\x26\x54\x5E\x96\xE5\x5B\x87\x4B\xE9\x09", 64);
+  if (errtxt)
+    goto failed;
+
+  what = "one million \"a\"";
+  errtxt = _gcry_hash_selftest_check_one
+    (GCRY_MD_SHA512, 1,
+     NULL, 0,
+     "\xE7\x18\x48\x3D\x0C\xE7\x69\x64\x4E\x2E\x42\xC7\xBC\x15\xB4\x63"
+     "\x8E\x1F\x98\xB1\x3B\x20\x44\x28\x56\x32\xA8\x03\xAF\xA9\x73\xEB"
+     "\xDE\x0F\xF2\x44\x87\x7E\xA6\x0A\x4C\xB0\x43\x2C\xE5\x77\xC3\x1B"
+     "\xEB\x00\x9C\x5C\x2C\x49\xAA\x2E\x4E\xAD\xB2\x17\xAD\x8C\xC0\x9B", 64);
+  if (errtxt)
+    goto failed;
 
   return 0; /* Succeeded. */
 
  failed:
   if (report)
     report ("digest", GCRY_MD_SHA512, what, errtxt);
   return GPG_ERR_SELFTEST_FAILED;
 }
 
 
 /* Run a full self-test for ALGO and return 0 on success.  */
 static gpg_err_code_t
 run_selftests (int algo, selftest_report_func_t report)
 {
   gpg_err_code_t ec;
 
   switch (algo)
     {
     case GCRY_MD_SHA384:
       ec = selftests_sha384 (report);
       break;
     case GCRY_MD_SHA512:
       ec = selftests_sha512 (report);
       break;
     default:
       ec = GPG_ERR_DIGEST_ALGO;
       break;
         
     }
   return ec;
 }
 
 
 
 
 static byte sha512_asn[] =	/* Object ID is 2.16.840.1.101.3.4.2.3 */
   {
     0x30, 0x51, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
     0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03, 0x05,
     0x00, 0x04, 0x40
   };
 
 static gcry_md_oid_spec_t oid_spec_sha512[] =
   {
     { "2.16.840.1.101.3.4.2.3" },
 
     /* PKCS#1 sha512WithRSAEncryption */
     { "1.2.840.113549.1.1.13" },
 
     { NULL }
   };
 
 gcry_md_spec_t _gcry_digest_spec_sha512 = 
   {
     "SHA512", sha512_asn, DIM (sha512_asn), oid_spec_sha512, 64,
     sha512_init, sha512_write, sha512_final, sha512_read,
     sizeof (SHA512_CONTEXT),
   };
 md_extra_spec_t _gcry_digest_extraspec_sha512 = 
   {
     run_selftests
   };
 
 static byte sha384_asn[] =	/* Object ID is 2.16.840.1.101.3.4.2.2 */
   {
     0x30, 0x41, 0x30, 0x0d, 0x06, 0x09, 0x60, 0x86,
     0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x02, 0x05,
     0x00, 0x04, 0x30
   };
 
 static gcry_md_oid_spec_t oid_spec_sha384[] =
   {
     { "2.16.840.1.101.3.4.2.2" }, 
 
     /* PKCS#1 sha384WithRSAEncryption */
     { "1.2.840.113549.1.1.12" },
 
     { NULL },
   };
 
 gcry_md_spec_t _gcry_digest_spec_sha384 = 
   {
     "SHA384", sha384_asn, DIM (sha384_asn), oid_spec_sha384, 48,
     sha384_init, sha512_write, sha512_final, sha512_read,
     sizeof (SHA512_CONTEXT),
   };
 md_extra_spec_t _gcry_digest_extraspec_sha384 = 
   {
     run_selftests
   };
diff --git a/configure.ac b/configure.ac
index d301eae2..a4dd27cf 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,1163 +1,1163 @@
 # Configure.ac script for Libgcrypt
 # Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2006,
 #               2007, 2008 Free Software Foundation, Inc.
 #
 # This file is part of Libgcrypt.
 #
 # Libgcrypt 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.
 #
 # Libgcrypt 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 program; if not, see <http://www.gnu.org/licenses/>.
 
 # (Process this file with autoconf to produce a configure script.)
 AC_REVISION($Revision$)
 AC_PREREQ(2.60)
 min_automake_version="1.10"
 
 
 # Remember to change the version number immediately *after* a release.
 # Set my_issvn to "yes" for non-released code.  Remember to run an
 # "svn up" and "autogen.sh" right before creating a distribution.
-m4_define([my_version], [1.4.2])
-m4_define([my_issvn], [no])
+m4_define([my_version], [1.4.3])
+m4_define([my_issvn], [yes])
 
 m4_define([svn_revision], m4_esyscmd([printf "%d" $(svn info 2>/dev/null \
           | sed -n '/^Revision:/ s/[^0-9]//gp'|head -1)]))
 AC_INIT([libgcrypt], 
         [my_version[]m4_if(my_issvn,[yes],[-svn[]svn_revision])],
         [bug-libgcrypt@gnupg.org])
 # LT Version numbers, remember to change them just *before* a release.
 #   (Interfaces removed:    CURRENT++, AGE=0, REVISION=0)
 #   (Interfaces added:      CURRENT++, AGE++, REVISION=0)
 #   (No interfaces changed:                   REVISION++)
 LIBGCRYPT_LT_CURRENT=16
 LIBGCRYPT_LT_AGE=5
 LIBGCRYPT_LT_REVISION=0
 
 
 # If the API is changed in an incompatible way: increment the next counter.
 LIBGCRYPT_CONFIG_API_VERSION=1
 
 NEED_GPG_ERROR_VERSION=1.4
 
 is_development_version=my_issvn
 BUILD_REVISION=svn_revision
 PACKAGE=$PACKAGE_NAME
 VERSION=$PACKAGE_VERSION
 
 AC_CONFIG_SRCDIR([src/libgcrypt.vers])
 AM_INIT_AUTOMAKE($PACKAGE, $VERSION)
 AM_CONFIG_HEADER(config.h)
 AC_CANONICAL_HOST
 AM_MAINTAINER_MODE
 
 AH_TOP([
 #ifndef _GCRYPT_CONFIG_H_INCLUDED
 #define _GCRYPT_CONFIG_H_INCLUDED
 /* need this, because some autoconf tests rely on this (e.g. stpcpy)
  * and it should be used for new programs  */
 #define _GNU_SOURCE  1
 ])
 
 AH_BOTTOM([
 #define _GCRYPT_IN_LIBGCRYPT 1
 
 /* If the configure check for endianness has been disabled, get it from
    OS macros.  This is intended for making fat binary builds on OS X.  */
 #ifdef DISABLED_ENDIAN_CHECK
 # if defined(__BIG_ENDIAN__)
 #  define WORDS_BIGENDIAN 1
 # elif defined(__LITTLE_ENDIAN__)
 #  undef WORDS_BIGENDIAN
 # else
 #  error "No endianness found"
 # endif
 #endif /*DISABLED_ENDIAN_CHECK*/
 
 /* We basically use the original Camellia source.  Make sure the symbols 
    properly prefixed.  */
 #define CAMELLIA_EXT_SYM_PREFIX _gcry_
 
 /* This error code is only available with gpg-error 1.7.  Thus
    we define it here with the usual gcry prefix.  */
 #define GCRY_GPG_ERR_NOT_OPERATIONAL  176
 
 
 #endif /*_GCRYPT_CONFIG_H_INCLUDED*/
 ])
 
 AH_VERBATIM([_REENTRANT],
 [/* To allow the use of Libgcrypt in multithreaded programs we have to use
     special features from the library. */
 #ifndef _REENTRANT
 # define _REENTRANT 1
 #endif
 ])
 
 
 AC_SUBST(LIBGCRYPT_LT_CURRENT)
 AC_SUBST(LIBGCRYPT_LT_AGE)
 AC_SUBST(LIBGCRYPT_LT_REVISION)
 AC_SUBST(PACKAGE)
 AC_SUBST(VERSION)
 AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of this package])
 AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version of this package])
 
 
 ######################
 ##  Basic checks.  ### (we need some results later on (e.g. $GCC)
 ######################
 
 AC_PROG_MAKE_SET
 missing_dir=`cd $ac_aux_dir && pwd`
 AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir)
 AM_MISSING_PROG(AUTOCONF, autoconf, $missing_dir)
 AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir)
 AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir)
 # AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
 AC_PROG_CC
 AC_PROG_CPP
 AM_PROG_CC_C_O
 AM_PROG_AS
 AC_ISC_POSIX
 AC_PROG_INSTALL
 AC_PROG_AWK
 
 AC_LIBTOOL_WIN32_DLL
 AC_LIBTOOL_RC
 AM_PROG_LIBTOOL
 
 
 ##########################
 ## General definitions. ##
 ##########################
 
 # Used by libgcrypt-config
 LIBGCRYPT_CONFIG_LIBS="-lgcrypt"
 LIBGCRYPT_CONFIG_CFLAGS=""
 
 # Definitions for symmetric ciphers.
 available_ciphers="arcfour blowfish cast5 des aes twofish serpent rfc2268 seed"
 available_ciphers="$available_ciphers camellia"
 enabled_ciphers=""
 
 # Definitions for public-key ciphers.
 available_pubkey_ciphers="dsa elgamal rsa ecc"
 enabled_pubkey_ciphers=""
 
 # Definitions for message digests.
 available_digests="crc md4 md5 rmd160 sha1 sha256"
 available_digests_64="sha512 tiger whirlpool"
 enabled_digests=""
 
 # Definitions for random modules.
 available_random_modules="linux egd unix"
 auto_random_modules="$available_random_modules"
 
 # Supported thread backends.
 LIBGCRYPT_THREAD_MODULES=""
 
 # Other definitions.
 print_egd_notice=no
 have_w32_system=no
 
 # Setup some stuff depending on host.
 case "${host}" in
     *-*-mingw32*)
       available_random_modules="w32"
       ac_cv_have_dev_random=no
       have_w32_system=yes
       AC_DEFINE(USE_ONLY_8DOT3,1,
                 [set this to limit filenames to the 8.3 format])
       AC_DEFINE(HAVE_DRIVE_LETTERS,1,
                 [defined if we must run on a stupid file system])
       AC_DEFINE(HAVE_DOSISH_SYSTEM,1,
                 [defined if we run on some of the PCDOS like systems 
                  (DOS, Windoze. OS/2) with special properties like
                   no file modes])
       ;;
 
     i?86-emx-os2 | i?86-*-os2*emx)
         # OS/2 with the EMX environment
         ac_cv_have_dev_random=no
         AC_DEFINE(HAVE_DRIVE_LETTERS)
         AC_DEFINE(HAVE_DOSISH_SYSTEM)
         ;;
 
     i?86-*-msdosdjgpp*)
         # DOS with the DJGPP environment
         ac_cv_have_dev_random=no
         AC_DEFINE(HAVE_DRIVE_LETTERS)
         AC_DEFINE(HAVE_DOSISH_SYSTEM)
         ;;
 
     *-*-freebsd*)
        # FreeBSD
        CPPFLAGS="$CPPFLAGS -I/usr/local/include"
        LDFLAGS="$LDFLAGS -L/usr/local/lib"
        ;;
 
     *-*-hpux*)
         if test -z "$GCC" ; then
             CFLAGS="$CFLAGS -Ae -D_HPUX_SOURCE"
         fi
         ;;
     *-dec-osf4*)
         if test -z "$GCC" ; then
             # Suppress all warnings
             # to get rid of the unsigned/signed char mismatch warnings.
             CFLAGS="$CFLAGS -w"
         fi
         ;;
     m68k-atari-mint)
         ;;
     *)
       ;;
 esac
 
 if test "$have_w32_system" = yes; then
    AC_DEFINE(HAVE_W32_SYSTEM,1, [Defined if we run on a W32 API based system])
 fi
 AM_CONDITIONAL(HAVE_W32_SYSTEM, test "$have_w32_system" = yes)
 
 
 
 # A printable OS Name is sometimes useful.
 case "${host}" in
     *-*-mingw32*)
         PRINTABLE_OS_NAME="MingW32"
         ;;
 
     i?86-emx-os2 | i?86-*-os2*emx )
         PRINTABLE_OS_NAME="OS/2"
         ;;
 
     i?86-*-msdosdjgpp*)
         PRINTABLE_OS_NAME="MSDOS/DJGPP"
         ;;
 
     *-linux*)
         PRINTABLE_OS_NAME="GNU/Linux"
         ;;
 
     *)
         PRINTABLE_OS_NAME=`uname -s || echo "Unknown"`
         ;;
 esac
 
 #
 # Figure out the name of the random device
 #
 case "${host}" in
     *-openbsd*)
         NAME_OF_DEV_RANDOM="/dev/srandom"
         NAME_OF_DEV_URANDOM="/dev/urandom"
         ;;
 
     *)
         NAME_OF_DEV_RANDOM="/dev/random"
         NAME_OF_DEV_URANDOM="/dev/urandom"
         ;;
 esac
 
 
 AC_ARG_ENABLE(endian-check,
               AC_HELP_STRING([--disable-endian-check],
 	      [disable the endian check and trust the OS provided macros]),
 	      endiancheck=$enableval,endiancheck=yes)
 if test x"$endiancheck" = xyes ; then
   AC_C_BIGENDIAN
 else
   AC_DEFINE(DISABLED_ENDIAN_CHECK,1,[configure did not test for endianess])
 fi
 
 AC_CHECK_SIZEOF(unsigned short, 2)
 AC_CHECK_SIZEOF(unsigned int, 4)
 AC_CHECK_SIZEOF(unsigned long, 4)
 AC_CHECK_SIZEOF(unsigned long long, 0)
 
 AC_TYPE_UINTPTR_T
 
 if test "$ac_cv_sizeof_unsigned_short" = "0" \
    || test "$ac_cv_sizeof_unsigned_int" = "0" \
    || test "$ac_cv_sizeof_unsigned_long" = "0"; then
     AC_MSG_WARN([Hmmm, something is wrong with the sizes - using defaults]);
 fi
 
 # Do we have any 64-bit data types?
 if test "$ac_cv_sizeof_unsigned_int" != "8" \
    && test "$ac_cv_sizeof_unsigned_long" != "8" \
    && test "$ac_cv_sizeof_unsigned_long_long" != "8" \
    && test "$ac_cv_sizeof_uint64_t" != "8"; then
     AC_MSG_WARN([No 64-bit types.  Disabling TIGER/192, SHA-384, and SHA-512])
 else
   available_digests="$available_digests $available_digests_64"
 fi
 
 # If not specified otherwise, all available algorithms will be
 # included.  
 default_ciphers="$available_ciphers"
 default_pubkey_ciphers="$available_pubkey_ciphers"
 default_digests="$available_digests"
 
 ############################
 ## Command line switches. ##
 ############################
 
 # Implementation of the --enable-ciphers switch.
 AC_ARG_ENABLE(ciphers,
 	      AC_HELP_STRING([--enable-ciphers=ciphers],
 			     [select the symmetric ciphers to include]),
 	      [enabled_ciphers=`echo $enableval | tr ',:' '  ' | tr '[A-Z]' '[a-z]'`],
 	      [enabled_ciphers=""])
 if test "x$enabled_ciphers" = "x" \
    -o "$enabled_ciphers" = "yes"  \
    -o "$enabled_ciphers" = "no"; then
    enabled_ciphers=$default_ciphers
 fi
 AC_MSG_CHECKING([which symmetric ciphers to include])
 for cipher in $enabled_ciphers; do
     LIST_MEMBER($cipher, $available_ciphers)
     if test "$found" = "0"; then
        AC_MSG_ERROR([unsupported cipher "$cipher" specified])
     fi
 done
 AC_MSG_RESULT([$enabled_ciphers])
 
 # Implementation of the --enable-pubkey-ciphers switch.
 AC_ARG_ENABLE(pubkey-ciphers,
 	      AC_HELP_STRING([--enable-pubkey-ciphers=ciphers],
 			     [select the public-key ciphers to include]),
 	      [enabled_pubkey_ciphers=`echo $enableval | tr ',:' '  ' | tr '[A-Z]' '[a-z]'`],
 	      [enabled_pubkey_ciphers=""])
 if test "x$enabled_pubkey_ciphers" = "x" \
    -o "$enabled_pubkey_ciphers" = "yes"  \
    -o "$enabled_pubkey_ciphers" = "no"; then
    enabled_pubkey_ciphers=$default_pubkey_ciphers
 fi
 AC_MSG_CHECKING([which public-key ciphers to include])
 for cipher in $enabled_pubkey_ciphers; do
     LIST_MEMBER($cipher, $available_pubkey_ciphers)
     if test "$found" = "0"; then
        AC_MSG_ERROR([unsupported public-key cipher specified])
     fi
 done
 AC_MSG_RESULT([$enabled_pubkey_ciphers])
 
 # Implementation of the --enable-digests switch.
 AC_ARG_ENABLE(digests,
 	      AC_HELP_STRING([--enable-digests=digests],
 			     [select the message digests to include]),
 	      [enabled_digests=`echo $enableval | tr ',:' '  ' | tr '[A-Z]' '[a-z]'`],
 	      [enabled_digests=""])
 if test "x$enabled_digests" = "x" \
    -o "$enabled_digests" = "yes"  \
    -o "$enabled_digests" = "no"; then
    enabled_digests=$default_digests
 fi
 AC_MSG_CHECKING([which message digests to include])
 for digest in $enabled_digests; do
     LIST_MEMBER($digest, $available_digests)
     if test "$found" = "0"; then
        AC_MSG_ERROR([unsupported message digest specified])
     fi
 done
 AC_MSG_RESULT([$enabled_digests])
 
 # Implementation of the --enable-random switch.
 AC_ARG_ENABLE(random,
 	      AC_HELP_STRING([--enable-random=name],
 	                     [select which random number generator to use]),
 	      [random=`echo $enableval | tr '[A-Z]' '[a-z]'`],
 	      [])
 if test "x$random" = "x" -o "$random" = "yes" -o "$random" = "no"; then
     random=default
 fi
 AC_MSG_CHECKING([which random module to use])
 if test "$random" != "default" -a "$random" != "auto"; then
     LIST_MEMBER($random, $available_random_modules)
     if test "$found" = "0"; then
        AC_MSG_ERROR([unsupported random module specified])
     fi
 fi
 AC_MSG_RESULT($random)
 
 # Implementation of the --disable-dev-random switch.
 AC_MSG_CHECKING([whether use of /dev/random is requested])
 AC_ARG_ENABLE(dev-random,
 [  --disable-dev-random    disable the use of dev random],
     try_dev_random=$enableval, try_dev_random=yes)
 AC_MSG_RESULT($try_dev_random)
 
 # Implementation of the --with-egd-socket switch.
 AC_ARG_WITH(egd-socket,
     [  --with-egd-socket=NAME  Use NAME for the EGD socket)],
             egd_socket_name="$withval", egd_socket_name="" )
 AC_DEFINE_UNQUOTED(EGD_SOCKET_NAME, "$egd_socket_name",
                    [Define if you don't want the default EGD socket name.
                     For details see cipher/rndegd.c])
 
 # Implementation of the --enable-random-daemon
 AC_MSG_CHECKING([whether the experimental random daemon is requested])
 AC_ARG_ENABLE([random-daemon],
               AC_HELP_STRING([--enable-random-daemon],
                              [Build and support the experimental gcryptrnd]),
               [use_random_daemon=$enableval],
               [use_random_daemon=no])
 AC_MSG_RESULT($use_random_daemon)
 if test x$use_random_daemon = xyes ; then
     AC_DEFINE(USE_RANDOM_DAEMON,1,
               [Define to support the experimental random daemon])
 fi
 AM_CONDITIONAL(USE_RANDOM_DAEMON, test x$use_random_daemon = xyes)
 
 
 # Implementation of --disable-asm.
 AC_MSG_CHECKING([whether MPI assembler modules are requested])
 AC_ARG_ENABLE([asm],
               AC_HELP_STRING([--disable-asm],
 	                     [Disable MPI assembler modules]),
               [try_asm_modules=$enableval],
               [try_asm_modules=yes])
 AC_MSG_RESULT($try_asm_modules)
 
 # Implementation of the --enable-m-guard switch.
 AC_MSG_CHECKING([whether memory guard is requested])
 AC_ARG_ENABLE(m-guard,
               AC_HELP_STRING([--enable-m-guard],
                              [Enable memory guard facility]),
               [use_m_guard=$enableval], [use_m_guard=no])
 AC_MSG_RESULT($use_m_guard)
 if test "$use_m_guard" = yes ; then
     AC_DEFINE(M_GUARD,1,[Define to use the (obsolete) malloc guarding feature])
 fi
 
 # Implementation of the --with-capabilities switch.
 # Check whether we want to use Linux capabilities
 AC_MSG_CHECKING([whether use of capabilities is requested])
 AC_ARG_WITH(capabilities,
             AC_HELP_STRING([--with-capabilities],
                            [Use linux capabilities [default=no]]),
             [use_capabilities="$withval"],[use_capabilities=no])
 AC_MSG_RESULT($use_capabilities)
 
 # Implementation of the --enable-hmac-binary-check.
 AC_MSG_CHECKING([whether a HMAC binary check is requested])
 AC_ARG_ENABLE(hmac-binary-check,
               AC_HELP_STRING([--enable-hmac-binary-check],
                              [Enable library integrity check]),
               [use_hmac_binary_check=$enableval],
               [use_hmac_binary_check=no])
 AC_MSG_RESULT($use_hmac_binary_check)
 if test "$use_hmac_binary_check" = yes ; then
     AC_DEFINE(ENABLE_HMAC_BINARY_CHECK,1,
               [Define to support an HMAC based integrity check])
 fi
 
 
 # Implementation of the --disable-padlock-support switch.
 AC_MSG_CHECKING([whether padlock support is requested])
 AC_ARG_ENABLE(padlock-support,
               AC_HELP_STRING([--disable-padlock-support],
        	         [Disable support for the PadLock Engine of VIA processors]),
 	      padlocksupport=$enableval,padlocksupport=yes)
 AC_MSG_RESULT($padlocksupport)
 if test x"$padlocksupport" = xyes ; then
   AC_DEFINE(ENABLE_PADLOCK_SUPPORT, 1,
             [Enable support for the PadLock engine.])
 fi
 
 
 
 AC_DEFINE_UNQUOTED(PRINTABLE_OS_NAME, "$PRINTABLE_OS_NAME",
                    [A human readable text with the name of the OS])
 
 # For some systems we know that we have ld_version scripts.  
 # Use it then as default.
 have_ld_version_script=no
 case "${host}" in
     *-*-linux*)
 	have_ld_version_script=yes
         ;;
     *-*-gnu*)
 	have_ld_version_script=yes
         ;;
 esac
 AC_ARG_ENABLE([ld-version-script],
               AC_HELP_STRING([--enable-ld-version-script],
                              [enable/disable use of linker version script.
                               (default is system dependent)]),
               [have_ld_version_script=$enableval],
               [ : ] )
 AM_CONDITIONAL(HAVE_LD_VERSION_SCRIPT, test "$have_ld_version_script" = "yes")
 
 AC_DEFINE_UNQUOTED(NAME_OF_DEV_RANDOM, "$NAME_OF_DEV_RANDOM",
                    [defined to the name of the strong random device])
 AC_DEFINE_UNQUOTED(NAME_OF_DEV_URANDOM, "$NAME_OF_DEV_URANDOM",
                    [defined to the name of the weaker random device])
 
 ###############################
 #### Checks for libraries. ####
 ###############################
 
 #
 # gpg-error is required.
 #
 AM_PATH_GPG_ERROR("$NEED_GPG_ERROR_VERSION")
 if test "x$GPG_ERROR_LIBS" = "x"; then
   AC_MSG_ERROR([libgpg-error is needed.
                 See ftp://ftp.gnupg.org/gcrypt/libgpg-error/ .])
 fi
 
 AC_DEFINE(GPG_ERR_SOURCE_DEFAULT, GPG_ERR_SOURCE_GCRYPT,
           [The default error source for libgcrypt.])
 
 #
 # Check whether the GNU Pth library is available.  We require this 
 # to build the optional gcryptrnd program.
 #
 AC_ARG_WITH(pth-prefix,
             AC_HELP_STRING([--with-pth-prefix=PFX],
                            [prefix where GNU Pth is installed (optional)]),
      pth_config_prefix="$withval", pth_config_prefix="")
 if test x$pth_config_prefix != x ; then
    PTH_CONFIG="$pth_config_prefix/bin/pth-config"
 fi
 if test "$use_random_daemon" = "yes"; then
   AC_PATH_PROG(PTH_CONFIG, pth-config, no)
   if test "$PTH_CONFIG" = "no"; then
     AC_MSG_WARN([[
 ***
 *** To build the Libgcrypt's random number daemon
 *** we need the support of the GNU Portable Threads Library.
 *** Download it from ftp://ftp.gnu.org/gnu/pth/
 *** On a Debian GNU/Linux system you might want to try 
 ***   apt-get install libpth-dev
 ***]])
   else
     GNUPG_PTH_VERSION_CHECK([1.3.7])
     if test $have_pth = yes; then      
        PTH_CFLAGS=`$PTH_CONFIG --cflags`
        PTH_LIBS=`$PTH_CONFIG --ldflags`
        PTH_LIBS="$PTH_LIBS `$PTH_CONFIG --libs --all`"
        AC_DEFINE(USE_GNU_PTH, 1,
                 [Defined if the GNU Portable Thread Library should be used])
        AC_DEFINE(HAVE_PTH, 1,
                 [Defined if the GNU Pth is available])
     fi
   fi
 fi
 AC_SUBST(PTH_CFLAGS)
 AC_SUBST(PTH_LIBS)
 
 
 # Solaris needs -lsocket and -lnsl. Unisys system includes
 # gethostbyname in libsocket but needs libnsl for socket.
 AC_SEARCH_LIBS(setsockopt, [socket], ,
 	[AC_SEARCH_LIBS(setsockopt, [socket], , , [-lnsl])])
 AC_SEARCH_LIBS(setsockopt, [nsl])
 
 ##################################
 #### Checks for header files. ####
 ##################################
 
 AC_HEADER_STDC
 AC_CHECK_HEADERS(unistd.h sys/select.h)
 
 ##########################################
 #### Checks for typedefs, structures, ####
 ####  and compiler characteristics.   ####
 ##########################################
 
 AC_C_CONST
 AC_C_INLINE
 AC_TYPE_SIZE_T
 AC_TYPE_SIGNAL
 AC_DECL_SYS_SIGLIST
 
 GNUPG_CHECK_TYPEDEF(byte, HAVE_BYTE_TYPEDEF)
 GNUPG_CHECK_TYPEDEF(ushort, HAVE_USHORT_TYPEDEF)
 GNUPG_CHECK_TYPEDEF(ulong, HAVE_ULONG_TYPEDEF)
 GNUPG_CHECK_TYPEDEF(u16, HAVE_U16_TYPEDEF)
 GNUPG_CHECK_TYPEDEF(u32, HAVE_U32_TYPEDEF)
 
 gl_TYPE_SOCKLEN_T
 case "${host}" in
   *-*-mingw32*)
     # socklen_t may or may not be defined depending on what headers
     # are included.  To be safe we use int as this is the actual type.
     FALLBACK_SOCKLEN_T="typedef int gcry_socklen_t;"
     ;;
   *)
     if test ".$gl_cv_socklen_t_equiv" = "."; then
       FALLBACK_SOCKLEN_T="typedef socklen_t gcry_socklen_t;"
     else
       FALLBACK_SOCKLEN_T="typedef ${gl_cv_socklen_t_equiv} gcry_socklen_t;"
     fi
 esac
 AC_SUBST(FALLBACK_SOCKLEN_T)
             
 #            
 # Check for ELF visibility support.
 #
 AC_CACHE_CHECK(whether the visibility attribute is supported,
        gcry_cv_visibility_attribute,
        [gcry_cv_visibility_attribute=no
         AC_LANG_CONFTEST([AC_LANG_SOURCE(
           [[int foo __attribute__ ((visibility ("hidden"))) = 1;
             int bar __attribute__ ((visibility ("protected"))) = 1;
           ]])])
         
         if ${CC-cc} -Werror -S conftest.c -o conftest.s \
                   1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ; then
             if grep '\.hidden.*foo' conftest.s >/dev/null 2>&1 ; then
                 if grep '\.protected.*bar' conftest.s >/dev/null 2>&1; then
                     gcry_cv_visibility_attribute=yes
                 fi
             fi  
         fi  
        ])
 if test "$gcry_cv_visibility_attribute" = "yes"; then
     AC_CACHE_CHECK(for broken visibility attribute,
        gcry_cv_broken_visibility_attribute,
        [gcry_cv_broken_visibility_attribute=yes
         AC_LANG_CONFTEST([AC_LANG_SOURCE(
           [[int foo (int x);
             int bar (int x) __asm__ ("foo")
                             __attribute__ ((visibility ("hidden")));
             int bar (int x) { return x; }
           ]])])
                   
         if ${CC-cc} -Werror -S conftest.c -o conftest.s \
                   1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ; then
            if grep '\.hidden@<:@ 	_@:>@foo' conftest.s >/dev/null 2>&1;
             then
                gcry_cv_broken_visibility_attribute=no
            fi
         fi
        ])
 fi
 if test "$gcry_cv_visibility_attribute" = "yes"; then
     AC_CACHE_CHECK(for broken alias attribute,
        gcry_cv_broken_alias_attribute,
        [gcry_cv_broken_alias_attribute=yes
         AC_LANG_CONFTEST([AC_LANG_SOURCE(
           [[extern int foo (int x) __asm ("xyzzy");
             int bar (int x) { return x; }
             extern __typeof (bar) foo __attribute ((weak, alias ("bar")));
             extern int dfoo;
             extern __typeof (dfoo) dfoo __asm ("abccb");
             int dfoo = 1;
           ]])])
 
         if ${CC-cc} -Werror -S conftest.c -o conftest.s \
                   1>&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD ; then
            if grep 'xyzzy' conftest.s >/dev/null 2>&1 && \
               grep 'abccb' conftest.s >/dev/null 2>&1; then
               gcry_cv_broken_alias_attribute=no
            fi
         fi
         ])
 fi
 if test "$gcry_cv_visibility_attribute" = "yes"; then
     AC_CACHE_CHECK(if gcc supports -fvisibility=hidden,
        gcry_cv_gcc_has_f_visibility,
        [gcry_cv_gcc_has_f_visibility=no
         _gcc_cflags_save=$CFLAGS
         CFLAGS="-fvisibility=hidden"
         AC_COMPILE_IFELSE(AC_LANG_PROGRAM([]),
                           gcry_cv_gcc_has_f_visibility=yes)
         CFLAGS=$_gcc_cflags_save;
        ])
 fi
 if test "$gcry_cv_visibility_attribute" = "yes" \
    && test "$gcry_cv_broken_visibility_attribute" != "yes" \
    && test "$gcry_cv_broken_alias_attribute" != "yes" \
    && test "$gcry_cv_gcc_has_f_visibility" = "yes"  
  then
    AC_DEFINE(GCRY_USE_VISIBILITY, 1,
                [Define to use the GNU C visibility attribute.])
    CFLAGS="$CFLAGS -fvisibility=hidden"
 fi
 
 
 #######################################
 #### Checks for library functions. ####
 #######################################
 
 AC_FUNC_VPRINTF
 # We have replacements for these in src/missing-string.c
 AC_CHECK_FUNCS(stpcpy strcasecmp)
 # We have replacements for these in src/g10lib.h
 AC_CHECK_FUNCS(strtoul memmove stricmp atexit raise)
 # Other checks
 AC_CHECK_FUNCS(strerror rand mmap getpagesize sysconf waitpid wait4)
 AC_CHECK_FUNCS(gettimeofday getrusage gethrtime clock_gettime)
 AC_CHECK_FUNCS(fcntl ftruncate)
 
 GNUPG_CHECK_MLOCK
 
 
 #
 # Check wether it is necessary to link against libdl.
 #
 DL_LIBS=""
 if test "$use_hmac_binary_check" = yes ; then
   _gcry_save_libs="$LIBS"
   LIBS=""
   AC_SEARCH_LIBS(dlopen, c dl,,,)
   DL_LIBS=$LIBS
   LIBS="$_gcry_save_libs"
   LIBGCRYPT_CONFIG_LIBS="${LIBGCRYPT_CONFIG_LIBS} ${DL_LIBS}"
 fi
 AC_SUBST(DL_LIBS)
 
 
 #
 # Check whether we can use Linux capabilities as requested.
 #
 if test "$use_capabilities" = "yes" ; then
 use_capabilities=no
 AC_CHECK_HEADERS(sys/capability.h)
 if test "$ac_cv_header_sys_capability_h" = "yes" ; then
   AC_CHECK_LIB(cap, cap_init, ac_need_libcap=1)
   if test "$ac_cv_lib_cap_cap_init" = "yes"; then
      AC_DEFINE(USE_CAPABILITIES,1,
                [define if capabilities should be used])
      LIBS="$LIBS -lcap"
      use_capabilities=yes
   fi
 fi
 if test "$use_capabilities" = "no" ; then
     AC_MSG_WARN([[
 ***
 *** The use of capabilities on this system is not possible.
 *** You need a recent Linux kernel and some patches:
 ***   fcaps-2.2.9-990610.patch      (kernel patch for 2.2.9)
 ***   fcap-module-990613.tar.gz     (kernel module)
 ***   libcap-1.92.tar.gz            (user mode library and utilities)
 *** And you have to configure the kernel with CONFIG_VFS_CAP_PLUGIN
 *** set (filesystems menu). Be warned: This code is *really* ALPHA.
 ***]])
 fi
 fi
 
 # Check whether a random device is available.
 if test "$try_dev_random" = yes ; then
     AC_CACHE_CHECK(for random device, ac_cv_have_dev_random,
     [if test -r "$NAME_OF_DEV_RANDOM" && test -r "$NAME_OF_DEV_URANDOM" ; then
       ac_cv_have_dev_random=yes; else ac_cv_have_dev_random=no; fi])
     if test "$ac_cv_have_dev_random" = yes; then
         AC_DEFINE(HAVE_DEV_RANDOM,1,
                  [defined if the system supports a random device] )
     fi
 else
     AC_MSG_CHECKING(for random device)
     ac_cv_have_dev_random=no
     AC_MSG_RESULT(has been disabled)
 fi
 
 # Figure out the random modules for this configuration.
 if test "$random" = "default"; then
 
     # Select default value.
     if test "$ac_cv_have_dev_random" = yes; then
         # Try Linuxish random device.
         random_modules="linux"
     else
         case "${host}" in
         *-*-mingw32*|*-*-cygwin*)
           # Windows random device.
           random_modules="w32"
           ;;
         *)
           # Build everything, allow to select at runtime.
           random_modules="$auto_random_modules"
           ;;
         esac    
     fi
 else
     if test "$random" = "auto"; then
         # Build everything, allow to select at runtime.
         random_modules="$auto_random_modules"
     else
         random_modules="$random"
     fi
 fi
 
 
 #
 # Setup assembler stuff.
 #
 GNUPG_SYS_SYMBOL_UNDERSCORE()
 AC_ARG_ENABLE(mpi-path,
               AC_HELP_STRING([--enable-mpi-path=EXTRA_PATH],
 	      [prepend EXTRA_PATH to list of CPU specific optimizations]),
 	      mpi_extra_path="$enableval",mpi_extra_path="")
 AC_MSG_CHECKING(for mpi assembler functions)
 if test -f $srcdir/mpi/config.links ; then
     . $srcdir/mpi/config.links
     AC_CONFIG_LINKS("$mpi_ln_list")
     ac_cv_mpi_sflags="$mpi_sflags"
     AC_MSG_RESULT(done)
 else
     AC_MSG_RESULT(failed)
     AC_MSG_ERROR([mpi/config.links missing!])
 fi
 MPI_SFLAGS="$ac_cv_mpi_sflags"
 AC_SUBST(MPI_SFLAGS)
 
 AM_CONDITIONAL(MPI_MOD_ASM_MPIH_ADD1, test "$mpi_mod_asm_mpih_add1" = yes)
 AM_CONDITIONAL(MPI_MOD_ASM_MPIH_SUB1, test "$mpi_mod_asm_mpih_sub1" = yes)
 AM_CONDITIONAL(MPI_MOD_ASM_MPIH_MUL1, test "$mpi_mod_asm_mpih_mul1" = yes)
 AM_CONDITIONAL(MPI_MOD_ASM_MPIH_MUL2, test "$mpi_mod_asm_mpih_mul2" = yes)
 AM_CONDITIONAL(MPI_MOD_ASM_MPIH_MUL3, test "$mpi_mod_asm_mpih_mul3" = yes)
 AM_CONDITIONAL(MPI_MOD_ASM_MPIH_LSHIFT, test "$mpi_mod_asm_mpih_lshift" = yes)
 AM_CONDITIONAL(MPI_MOD_ASM_MPIH_RSHIFT, test "$mpi_mod_asm_mpih_rshift" = yes)
 AM_CONDITIONAL(MPI_MOD_ASM_UDIV, test "$mpi_mod_asm_udiv" = yes)
 AM_CONDITIONAL(MPI_MOD_ASM_UDIV_QRNND, test "$mpi_mod_asm_udiv_qrnnd" = yes)
 AM_CONDITIONAL(MPI_MOD_C_MPIH_ADD1, test "$mpi_mod_c_mpih_add1" = yes)
 AM_CONDITIONAL(MPI_MOD_C_MPIH_SUB1, test "$mpi_mod_c_mpih_sub1" = yes)
 AM_CONDITIONAL(MPI_MOD_C_MPIH_MUL1, test "$mpi_mod_c_mpih_mul1" = yes)
 AM_CONDITIONAL(MPI_MOD_C_MPIH_MUL2, test "$mpi_mod_c_mpih_mul2" = yes)
 AM_CONDITIONAL(MPI_MOD_C_MPIH_MUL3, test "$mpi_mod_c_mpih_mul3" = yes)
 AM_CONDITIONAL(MPI_MOD_C_MPIH_LSHIFT, test "$mpi_mod_c_mpih_lshift" = yes)
 AM_CONDITIONAL(MPI_MOD_C_MPIH_RSHIFT, test "$mpi_mod_c_mpih_rshift" = yes)
 AM_CONDITIONAL(MPI_MOD_C_UDIV, test "$mpi_mod_c_udiv" = yes)
 AM_CONDITIONAL(MPI_MOD_C_UDIV_QRNND, test "$mpi_mod_c_udiv_qrnnd" = yes)
 
 if test "$is_development_version" = "yes"; then
     AC_DEFINE(IS_DEVELOPMENT_VERSION,1,
               [Defined if this is not a regular release])
 fi
 
 
 AM_CONDITIONAL(CROSS_COMPILING, test x$cross_compiling = xyes)
 
 
 # This is handy for debugging so the compiler doesn't rearrange
 # things and eliminate variables.
 AC_ARG_ENABLE(optimization,
        AC_HELP_STRING([--disable-optimization],
 		      [disable compiler optimization]),
                       [if test $enableval = no ; then
                          CFLAGS=`echo $CFLAGS | sed 's/-O[[0-9]]//'`
                        fi])
 
 AC_ARG_ENABLE(gcc-warnings,
 	      AC_HELP_STRING([--enable-gcc-warnings],
 			     [enable more verbose gcc warnings]),
 	      [more_gcc_warnings="$enableval"],
 	      [more_gcc_warnings="no"])
 
 if test "$GCC" = yes; then
     if test "$USE_MAINTAINER_MODE" = "yes" ||
        test "$more_gcc_warnings" = "yes"; then
         CFLAGS="$CFLAGS -Wall -Wcast-align -Wshadow -Wstrict-prototypes"
         if test "$more_gcc_warnings" = "yes"; then
             CFLAGS="$CFLAGS -W -Wextra -Wbad-function-cast"
             CFLAGS="$CFLAGS -Wwrite-strings"
             CFLAGS="$CFLAGS -Wdeclaration-after-statement"
             CFLAGS="$CFLAGS -Wno-missing-field-initializers"
             CFLAGS="$CFLAGS -Wno-sign-compare"
             # Note: We don't use -Wunreachable-code because this gives
             # warnings for all asserts and many inline functions like
             # gpg_error (gcc 4.1.2 20060928).
         fi
     else
         CFLAGS="$CFLAGS -Wall"
     fi
 
     AC_MSG_CHECKING([if gcc supports -Wpointer-arith])
     _gcc_cflags_save=$CFLAGS
     CFLAGS="-Wpointer-arith"
     AC_COMPILE_IFELSE(AC_LANG_PROGRAM([]),_gcc_wopt=yes,_gcc_wopt=no)
     AC_MSG_RESULT($_gcc_wopt)
     CFLAGS=$_gcc_cflags_save;
     if test x"$_gcc_wopt" = xyes ; then
        CFLAGS="$CFLAGS -Wpointer-arith"
     fi
 fi
 
 # Check whether as(1) supports a noeexecstack feature.  This test
 # includes an override option.
 CL_AS_NOEXECSTACK
 
 
 AC_SUBST(LIBGCRYPT_CONFIG_API_VERSION)
 AC_SUBST(LIBGCRYPT_CONFIG_LIBS)
 AC_SUBST(LIBGCRYPT_CONFIG_CFLAGS)
 AC_SUBST(LIBGCRYPT_THREAD_MODULES)
 
 AC_CONFIG_COMMANDS([gcrypt-conf],[[
 chmod +x src/libgcrypt-config
 ]],[[
 prefix=$prefix
 exec_prefix=$exec_prefix
 libdir=$libdir
 datadir=$datadir
 DATADIRNAME=$DATADIRNAME
 ]])
 
 #####################
 #### Conclusion. ####
 #####################
 
 # Define conditional sources and config.h symbols depending on the
 # selected ciphers, pubkey-ciphers, digests and random modules.
 
 LIST_MEMBER(arcfour, $enabled_ciphers)
 if test "$found" = "1"; then 
    GCRYPT_CIPHERS="$GCRYPT_CIPHERS arcfour.lo"
    AC_DEFINE(USE_ARCFOUR, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(blowfish, $enabled_ciphers)
 if test "$found" = "1" ; then
    GCRYPT_CIPHERS="$GCRYPT_CIPHERS blowfish.lo"
    AC_DEFINE(USE_BLOWFISH, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(cast5, $enabled_ciphers)
 if test "$found" = "1" ; then
    GCRYPT_CIPHERS="$GCRYPT_CIPHERS cast5.lo"
    AC_DEFINE(USE_CAST5, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(des, $enabled_ciphers)
 if test "$found" = "1" ; then
    GCRYPT_CIPHERS="$GCRYPT_CIPHERS des.lo"
    AC_DEFINE(USE_DES, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(aes, $enabled_ciphers)
 if test "$found" = "1" ; then
    GCRYPT_CIPHERS="$GCRYPT_CIPHERS rijndael.lo"
    AC_DEFINE(USE_AES, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(twofish, $enabled_ciphers)
 if test "$found" = "1" ; then
    GCRYPT_CIPHERS="$GCRYPT_CIPHERS twofish.lo"
    AC_DEFINE(USE_TWOFISH, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(serpent, $enabled_ciphers)
 if test "$found" = "1" ; then
    GCRYPT_CIPHERS="$GCRYPT_CIPHERS serpent.lo"
    AC_DEFINE(USE_SERPENT, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(rfc2268, $enabled_ciphers)
 if test "$found" = "1" ; then
    GCRYPT_CIPHERS="$GCRYPT_CIPHERS rfc2268.lo"
    AC_DEFINE(USE_RFC2268, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(seed, $enabled_ciphers)
 if test "$found" = "1" ; then
    GCRYPT_CIPHERS="$GCRYPT_CIPHERS seed.lo"
    AC_DEFINE(USE_SEED, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(camellia, $enabled_ciphers)
 if test "$found" = "1" ; then
    GCRYPT_CIPHERS="$GCRYPT_CIPHERS camellia.lo camellia-glue.lo"
    AC_DEFINE(USE_CAMELLIA, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(dsa, $enabled_pubkey_ciphers)
 if test "$found" = "1" ; then
    GCRYPT_PUBKEY_CIPHERS="$GCRYPT_PUBKEY_CIPHERS dsa.lo"
    AC_DEFINE(USE_DSA, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(rsa, $enabled_pubkey_ciphers)
 if test "$found" = "1" ; then
    GCRYPT_PUBKEY_CIPHERS="$GCRYPT_PUBKEY_CIPHERS rsa.lo"
    AC_DEFINE(USE_RSA, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(elgamal, $enabled_pubkey_ciphers)
 if test "$found" = "1" ; then
    GCRYPT_PUBKEY_CIPHERS="$GCRYPT_PUBKEY_CIPHERS elgamal.lo"
    AC_DEFINE(USE_ELGAMAL, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(ecc, $enabled_pubkey_ciphers)
 if test "$found" = "1" ; then
    GCRYPT_PUBKEY_CIPHERS="$GCRYPT_PUBKEY_CIPHERS ecc.lo"
    AC_DEFINE(USE_ECC, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(crc, $enabled_digests)
 if test "$found" = "1" ; then
    GCRYPT_DIGESTS="$GCRYPT_DIGESTS crc.lo"
    AC_DEFINE(USE_CRC, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(md4, $enabled_digests)
 if test "$found" = "1" ; then
    GCRYPT_DIGESTS="$GCRYPT_DIGESTS md4.lo"
    AC_DEFINE(USE_MD4, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(md5, $enabled_digests)
 if test "$found" = "1" ; then
    GCRYPT_DIGESTS="$GCRYPT_DIGESTS md5.lo"
    AC_DEFINE(USE_MD5, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(sha256, $enabled_digests)
 if test "$found" = "1" ; then
    GCRYPT_DIGESTS="$GCRYPT_DIGESTS sha256.lo"
    AC_DEFINE(USE_SHA256, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(sha512, $enabled_digests)
 if test "$found" = "1" ; then
    GCRYPT_DIGESTS="$GCRYPT_DIGESTS sha512.lo"
    AC_DEFINE(USE_SHA512, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(tiger, $enabled_digests)
 if test "$found" = "1" ; then
    GCRYPT_DIGESTS="$GCRYPT_DIGESTS tiger.lo"
    AC_DEFINE(USE_TIGER, 1, [Defined if this module should be included])
 fi
 
 LIST_MEMBER(whirlpool, $enabled_digests)
 if test "$found" = "1" ; then
    GCRYPT_DIGESTS="$GCRYPT_DIGESTS whirlpool.lo"
    AC_DEFINE(USE_WHIRLPOOL, 1, [Defined if this module should be included])
 fi
 
 # rmd160 and sha1 should be included always.
 GCRYPT_DIGESTS="$GCRYPT_DIGESTS rmd160.lo sha1.lo"
 AC_DEFINE(USE_RMD160, 1, [Defined if this module should be included])
 AC_DEFINE(USE_SHA1, 1,   [Defined if this module should be included])
 
 LIST_MEMBER(linux, $random_modules)
 if test "$found" = "1" ; then
    GCRYPT_RANDOM="$GCRYPT_RANDOM rndlinux.lo"
    AC_DEFINE(USE_RNDLINUX, 1, [Defined if the /dev/random RNG should be used.])
 fi
 
 LIST_MEMBER(unix, $random_modules)
 if test "$found" = "1" ; then
    GCRYPT_RANDOM="$GCRYPT_RANDOM rndunix.lo"
    AC_DEFINE(USE_RNDUNIX, 1, [Defined if the default Unix RNG should be used.])
    print_egd_notice=yes
 fi
 
 LIST_MEMBER(egd, $random_modules)
 if test "$found" = "1" ; then
    GCRYPT_RANDOM="$GCRYPT_RANDOM rndegd.lo"
    AC_DEFINE(USE_RNDEGD, 1, [Defined if the EGD based RNG should be used.])
 fi
 
 LIST_MEMBER(w32, $random_modules)
 if test "$found" = "1" ; then
    GCRYPT_RANDOM="$GCRYPT_RANDOM rndw32.lo"
    AC_DEFINE(USE_RNDW32, 1, 
              [Defined if the Windows specific RNG should be used.])
 fi
 
 AC_SUBST([GCRYPT_CIPHERS])
 AC_SUBST([GCRYPT_PUBKEY_CIPHERS])
 AC_SUBST([GCRYPT_DIGESTS])
 AC_SUBST([GCRYPT_RANDOM])
 
 AC_SUBST(LIBGCRYPT_CIPHERS, $enabled_ciphers)
 AC_SUBST(LIBGCRYPT_PUBKEY_CIPHERS, $enabled_pubkey_ciphers)
 AC_SUBST(LIBGCRYPT_DIGESTS, $enabled_digests)
 
 # For printing the configuration we need a colon separated list of
 # algorithm names.
 tmp=`echo "$enabled_ciphers" | tr ' ' : `
 AC_DEFINE_UNQUOTED(LIBGCRYPT_CIPHERS, "$tmp", 
                    [List of available cipher algorithms])
 tmp=`echo "$enabled_pubkey_ciphers" | tr ' ' : `
 AC_DEFINE_UNQUOTED(LIBGCRYPT_PUBKEY_CIPHERS, "$tmp", 
                    [List of available public key cipher algorithms])
 tmp=`echo "$enabled_digests" | tr ' ' : `
 AC_DEFINE_UNQUOTED(LIBGCRYPT_DIGESTS, "$tmp", 
                    [List of available digest algorithms])
 
 
 
 # Generate extended version information for W32.
 if test "$have_w32_system" = yes; then
    BUILD_TIMESTAMP=`date --iso-8601=minutes`
    changequote(,)dnl 
    BUILD_FILEVERSION=`echo "$VERSION" | sed 's/\([0-9.]*\).*/\1./;s/\./,/g'`
    changequote([,])dnl
    BUILD_FILEVERSION="${BUILD_FILEVERSION}${BUILD_REVISION}"
 fi
 AC_SUBST(BUILD_REVISION)
 AC_SUBST(BUILD_TIMESTAMP)
 AC_SUBST(BUILD_FILEVERSION)
 AC_DEFINE_UNQUOTED(BUILD_REVISION, "$BUILD_REVISION", 
                    [Subversion revision used to build this package])
 
 
 
 # And create the files.
 AC_CONFIG_FILES([
 Makefile
 m4/Makefile
 mpi/Makefile
 cipher/Makefile
 random/Makefile
 doc/Makefile
 src/Makefile
 src/gcrypt.h
 src/libgcrypt-config
 src/versioninfo.rc
 tests/Makefile
 ])
 AC_OUTPUT
 
 # Give some feedback
 echo "
         Libgcrypt v${VERSION} has been configured as follows:
         
         Platform:  $PRINTABLE_OS_NAME ($host)
 "
 
 
 if test "$print_egd_notice" = "yes"; then
 cat <<G10EOF
   
    The performance of the Unix random gatherer module (rndunix) is not
    very good and it does not keep the entropy pool over multiple
    invocations of Libgcrypt base applications.  The suggested way to
    overcome this problem is to use the
   
                  Entropy Gathering Daemon (EGD)
   
    which provides a entropy source for the whole system.  It is written
    in Perl and available at the GnuPG FTP servers.  To enable EGD you
    should rerun configure with the option "--enable-static-rnd=egd".
    For more information consult the GnuPG webpages:
   
              http://www.gnupg.org/download.html#egd
 
 G10EOF
 fi
 
 if test -n "$gpl"; then
   echo "Please note that you are building a version of Libgcrypt with"
   echo "  $gpl"
   echo "included.  These parts are licensed under the GPL and thus the"
   echo "use of this library has to comply with the conditions of the GPL."
 fi
 
diff --git a/doc/announce.txt b/doc/announce.txt
index c0687840..398278da 100644
--- a/doc/announce.txt
+++ b/doc/announce.txt
@@ -1,78 +1,99 @@
 To: gnupg-announce@gnupg.org, info-gnu@gnu.org
 Cc: gcrypt-devel@gnupg.org
 
 
 Hello! 
 
 The GNU project is pleased to announce the availability of Libgcrypt
-version 1.4.1.  This is a maintenance release to fix a few problems.
+version 1.4.2.
 
 Libgcrypt is a general purpose library of cryptographic building
 blocks.  It is originally based on code used by GnuPG.  It does not
 provide any implementation of OpenPGP or other protocols.  Thorough
 understanding of applied cryptography is required to use Libgcrypt.
 
-Noteworthy changes in version 1.4.1 (2008-04-25)
-------------------------------------------------
+Noteworthy changes in version 1.4.2:
 
- * Fixed a bug introduced by 1.3.1 which led to the comsumption of far
-   too much entropy for the intial seeding.
+ * The long missing gcry_mpi_lshift function has been added.
 
- * Improved AES performance for CFB and CBC modes.
+ * RSA key generation now supports a "transient-key" flag.
 
- * Removed build problems for the Padlock support.
+ * The keygrip computation for ECDSA has been implemented thus ECDSA
+   is now fully supported.
+
+ * A few macros have been replaced by functions for better type
+   checking.
+
+ * The thread initialization structure now carries version
+   information.
+
+ * The manual describes more clearly how to initialize Libgcrypt.
+
+ * The library may now be switched into a FIPS mode.
+
+ * Interface changes relative to the 1.3.0 release:
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ GCRYCTL_OPERATIONAL_P   NEW.
+ GCRYCTL_FIPS_MODE_P     NEW.
+ GCRYCTL_FORCE_FIPS_MODE NEW.
+ gcry_cipher_setkey      NEW: Replaces macro.
+ gcry_cipher_setiv       NEW: Replaces macro.
+ gcry_cipher_setctr      NEW: Replaces macro.
+ gcry_mpi_lshift         NEW.
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
 
 Source code is hosted at the GnuPG FTP server and its mirrors as
 listed at http://www.gnupg.org/download/mirrors.html .  On the primary
 server the source file and its digital signatures is:
 
- ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.4.1.tar.bz2 (946k)
- ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.4.1.tar.bz2.sig
+ ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.4.2.tar.bz2 (1049k)
+ ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.4.2.tar.bz2.sig
 
 This file is bzip2 compressed.  A gzip compressed version is also
 available:
 
- ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.4.1.tar.gz (1179k)
+ ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.4.1.tar.gz (1301k)
  ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.4.1.tar.gz.sig
 
-Alternativley you may upgrade version 1.4.0 using this patch file:
+Alternativley you may upgrade version 1.4.1 using this patch file:
 
- ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.4.0-1.4.1.diff.bz2 (49k)
+ ftp://ftp.gnupg.org/gcrypt/libgcrypt/libgcrypt-1.4.1-1.4.2.diff.bz2 (171k)
 
 The SHA-1 checksums are:
 
-367fe7fecd2ed4ab743849279dbc2f7e148f9956  libgcrypt-1.4.1.tar.bz2
-36f1c6632fa06a6d3c92f83c3cdca8c7731a4220  libgcrypt-1.4.1.tar.gz
-458fa5939df46da383df64b27ed8f8f580931618  libgcrypt-1.4.0-1.4.1.diff.bz2
+f4eda0d4a63905aef3bcdf24bb3dad787ef4b918  libgcrypt-1.4.2.tar.gz
+e9c65688e3191c4cad2910bda2f6c69fc05997a2  libgcrypt-1.4.2.tar.bz2
+e0e5e4192f144ae0fc093d08aff50b725f46c0f9  libgcrypt-1.4.1-1.4.2.diff.bz2
 
 
 For help on developing with Libgcrypt you should read the included
 manual and optional ask on the gcrypt-devel mailing list [1].
 
 Improving Libgcrypt is costly, but you can help!  We are looking for
 organizations that find Libgcrypt useful and wish to contribute back.
 You can contribute by reporting bugs, improve the software [2], order
 extensions or support or more general by donating money to the Free
 Software movement [3].
 
 Commercial support contracts for Libgcrypt are available [4], and they
 help finance continued maintenance.  g10 Code GmbH, a Duesseldorf
 based company, is currently funding Libgcrypt development.  We are
 always looking for interesting development projects.
 
 Many thanks to all who contributed to Libgcrypt development, be it bug
 fixes, code, documentation, testing or helping users.
 
+
 Happy hacking,
 
   Werner
 
 
 
 
 [1] See http://www.gnupg.org/documentation/mailing-lists.html .
 [2] Note that copyright assignments to the FSF are required.
-[3] For example http://www.fsfeurope.org/help/donate.en.html .
+[3] For example see http://donate.fsf.org .
 [4] See the service directory at http://www.gnupg.org/service.html .
 
diff --git a/tests/ChangeLog b/tests/ChangeLog
index 7d91d096..bf3b6b21 100644
--- a/tests/ChangeLog
+++ b/tests/ChangeLog
@@ -1,597 +1,601 @@
+2008-09-09  Werner Koch  <wk@g10code.com>
+
+	* basic.c (main): New option --selftest.
+
 2008-08-29  Werner Koch  <wk@g10code.com>
 
 	* keygrip.c: Update to also check ECDSA.
 
 2008-08-28  Werner Koch  <wk@g10code.com>
 
 	* rsa-16k.key: New sample key.
 
 2008-08-27  Werner Koch  <wk@g10code.com>
 
 	* pkbench.c (read_file): New.
 	(process_key_pair_file): Replace mmap by read_file.
 	(main): Add a --fips option.
 	* Makefile.am (EXTRA_DIST): Remove.
 	(EXTRA_PROGRAMS): Add pkbench.
 
 	* basic.c (main): Extended FIPS self-test test.
 
 2008-08-26  Werner Koch  <wk@g10code.com>
 
 	* basic.c (get_keys_new): Use transient-key flag. 
 	* benchmark.c (main): First check options then do the libgcrypt
 	initialization.
 	(rsa_bench): Use transient-key flag if not in fips mode.
 
 2008-08-20  Werner Koch  <wk@g10code.com>
 
 	* t-mpi-bit.c (test_lshift): New.
 	(mpi2bitstr_nlz, lshiftbitstring): New.
 	(main): Run test.
 
 2008-08-18  Werner Koch  <wk@g10code.com>
 
 	* basic.c (main): Add option --fips.
 
 2008-08-15  Werner Koch  <wk@g10code.com>
 
 	* register.c (main): Check for fips mode.
 	(check_run): Take care of fips mode.
 
 	* basic.c (check_cbc_mac_cipher, check_ciphers, check_digests)
 	(check_hmac, check_pubkey): Do not test unavalaible algorithms in
 	fips mode.
 	(main): Check for fips mode.
 
 2008-04-22  Werner Koch  <wk@g10code.com>
 
 	* basic.c (check_one_cipher): Also check in-place encryption.
 
 2008-03-17  Werner Koch  <wk@g10code.com>
 
 	* benchmark.c (main): Add option --cipher-repetition.
 	(cipher_bench): Use it.
 
 2008-03-12  Werner Koch  <wk@g10code.com>
 
 	* benchmark.c (rsa_bench): Add arg NO_BLINDING.
 	(main): Add option --no-blinding.
 
 2007-12-05  Werner Koch  <wk@g10code.com>
 
 	* pubkey.c (sample_private_key_1_1,sample_private_key_1_2): New.
 	(get_keys_sample): Add arg SECRET_VARIANT.
 	(check_run): Check all variants.  Also check gcry_pk_testkey.
 	(check_keys_crypt): Add DECRYPT_FAIL_CODE.
 	(check_keys): Ditto.
 
 2007-11-30  Werner Koch  <wk@g10code.com>
 
 	* benchmark.c (main): Add optione --verbose and reworked the
 	option parsing.
 	(random_bench): Dump random stats.
 
 2007-10-31  Werner Koch  <wk@g10code.com>
 
 	* benchmark.c (start_timer, stop_timer, elapsed_time) [W32]: Fixed.
 
 2007-06-20  Werner Koch  <wk@g10code.com>
 
 	* benchmark.c (rsa_bench): New.
 	(main): New command "rsa".
 
 2007-05-03  Werner Koch  <wk@g10code.com>
 
 	* Makefile.am (EXTRA_DIST): Do not build pkbench.c
 
 2007-05-02  David Shaw  <dshaw@jabberwocky.com>
 
 	* basic.c (check_ciphers): Add Camellia.
 
 2007-04-30  David Shaw  <dshaw@jabberwocky.com>
 
 	* basic.c (check_ciphers): #if out ciphers we don't have.  Add
 	test for GCRY_CIPHER_RFC2268_40.
 
 2007-04-30  Werner Koch  <wk@g10code.com>
 
 	* version.c: New.
 	* Makefile.am (TESTS): Add version.
 
 2007-04-30  Marcus Brinkmann  <marcus@g10code.de>
 
 	* benchmark.c (ecc_bench): Release KEY_SPEC.
 
 2007-04-28  Marcus Brinkmann  <marcus@g10code.de>
 
 	* ac-data.c (check_run): Don't give redundant GCRY_AC_FLAG_DEALLOC
 	in addition to GCRY_AC_FLAG_COPY.  Don't release LABEL1 or MPI0,
 	as those are donated to libgcrypt, but do release MPI0 and MPI2.
 
 2007-04-12  Marcus Brinkmann  <marcus@g10code.de>
 
 	* ac-schemes.c (scheme_spec): Revert last change.
 	
 	* ac-schemes.c (scheme_spec): Remove const qualifier from member M.
 	(es_check): Remove const qualifier from C and M2.
 
 2007-03-28  Werner Koch  <wk@g10code.com>
 
 	* pkbench.c (generate_key): Support named curves.
 
 	* benchmark.c (dsa_bench): New args ITERATIONS and PRINT_HEADER.
 	(main): Call dsa and ecc benchs.
 	(show_sexp): New.
 
 	* Makefile.am (TESTS): Move pkbench to EXTRA_PROGRAMS.
 
 2007-03-22  Werner Koch  <wk@g10code.com>
 
 	* benchmark.c (die): New.
 	(ecc_bench): New.
 
 	* pkbench.c (main): Reworked to provide proper option handling.
 
 2007-03-13  Werner Koch  <wk@g10code.com>
 
 	* mpitests.c: Reformatted to GNU standards.
 	(main): Add options --verbose and --debug for future use.
 
 2007-03-13  Werner Dittmann <Werner.Dittmann@t-online.de>  (wk)
 
 	* mpitests.c: New.
 
 2007-02-23  Werner Koch  <wk@g10code.com>
 
 	* Makefile.am (TEST): Run benchmark as last. 
 
 	* ac-data.c (check_sexp_conversion): Print label only in verbose
 	mode.
 
 	* pubkey.c (main): Run test just 2 times instead of 10.
 	(get_elg_key_new): New.
 	(check_run): Also run tests with Elgamal keys.
 	(check_keys): New arg NBITS_DATA.
 	(get_elg_key_new): Use only 400 for the 512 bit Elgamal test.
 
 	* random.c: New.
 
 2007-02-22  Werner Koch  <wk@g10code.com>
 
 	* basic.c (check_pubkey_sign): Also try signing using an OID.
 
 	* Makefile.am (TESTS) [W32]: Removed pkbench for now.
 	* pkbench.c (benchmark): Fixed for W32.
 
 2007-02-21  Werner Koch  <wk@g10code.com>
 
 	* hmac.c (check_one_mac): Make pointer args const.
 	* basic.c (check_one_md): Ditto.
 	(check_one_hmac): Ditto.
 
 	* keygen.c (progress_cb): Filter out line feeds.
 	* basic.c (progress_handler): Ditto.
 
 2006-12-18  Werner Koch  <wk@g10code.com>
 
 	* Makefile.am (AM_CFLAGS, AM_CPPFLAGS): Splitted and merged with
 	Moritz' changes.
 	(INCLUDES): Removed.
 
 	* keygen.c (progress_handler): New.
 	(main): Use it in verbose mode.
 
 2006-11-05  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am (AM_CFLAGS): Added -I$(top_builddir)/src so that the
 	new gcrypt.h is used, not the one installed in the system.
 
 2006-10-17  Werner Koch  <wk@g10code.com>
 
 	* keygen.c (check_rsa_keys): Also create an 1536 bit DSA key.
 
 2006-08-03  Werner Koch  <wk@g10code.com>
 
 	* t-mpi-bit.c: New.
 
 2006-07-06  Werner Koch  <wk@g10code.com>
 
 	* benchmark.c (main): New option --use-random-daemon.  New command
 	strongrandom.
 	(random_bench): New arg VERY_STRONG.
 
 2006-03-14  Werner Koch  <wk@g10code.com>
 
 	* benchmark.c (main): Allow for seed file argument to random bench.
 
 	* basic.c (main): Use progress handler only in verbose mode.
 	(main): Speed up test key generation.
 	* ac-data.c (check_sexp_conversion, check_run): Take care of VERBOSE.
 	* ac.c (main): Ditto.
 	* pubkey.c (main): Ditto.
 	* pkbench.c (main): Ditto.
 	* keygen.c (main): Ditto.
 	(check_rsa_keys): Print key only in verbose mode.
 
 2006-03-10  Brad Hards  <bradh@frogmouth.net>  (wk, patch 2006-02-18)
 
 	* basic.c (check_one_hmac, check_hmac): New.
 
 2006-03-07  Werner Koch  <wk@g10code.com>
 
 	* benchmark.c (cipher_bench): Add OFB mode.
 
 2006-01-18  Brad Hards  <bradh@frogmouth.net> (wk 2006-03-07)
 
 	* basic.c: Added test cases for OFB and CFB modes. Fixed some
 	compiler warnings for signedness. 
 
 2005-11-12  Moritz Schulte  <moritz@g10code.com>
 
 	* ac-data.c: Added way more test cases.
 
 2005-09-15  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am (TESTS): Added keygrip.
 	* keygrip.c: New.
 
 2005-09-19  Werner Koch  <wk@g10code.com>
 
 	* benchmark.c (dsa_bench): New.
 
 2005-08-19  Werner Koch  <wk@g10code.com>
 
 	* hmac.c (main): Added all FIPS tests.
 
 2005-08-18  Werner Koch  <wk@g10code.com>
 
 	* hmac.c: New.
 
 2005-04-22  Moritz Schulte  <moritz@g10code.com>
 
 	* tsexp.c: Include <config.h> in case HAVE_CONFIG_H is defined;
 	thanks to Albert Chin.
 	* testapi.c: Likewise.
 	* register.c: Likewise.
 	* pubkey.c: Likewise.
 	* prime.c: Likewise.
 	* pkbench.c: Likewise.
 	* keygen.c: Likewise.
 	* benchmark.c: Likewise.
 	* basic.c: Likewise.
 	* ac-schemes.c: Likewise.
 	* ac-data.c: Likewise.
 	* ac.c: Likewise.
 
 2005-04-16  Moritz Schulte  <moritz@g10code.com>
 
 	* ac-data.c (check_run): Include new test.
 
 2005-04-11  Moritz Schulte  <moritz@g10code.com>
 
 	* basic.c (check_digests): Add tests for Whirlpool.
 
 2005-03-30  Moritz Schulte  <moritz@g10code.com>
 
 	* ac-schemes.c: New file.
 	* ac-data.c: New file.
 	* Makefile.am (TESTS): Added ac-schemes and ac-data.
 
 2004-09-15  Moritz Schulte  <moritz@g10code.com>
 
 	* pkbench.c: Include <time.h>.
 
 2004-08-24  Moritz Schulte  <moritz@g10code.com>
 
 	* pkbench.c (context_init): Improve generation of test data.
 
 2004-08-23  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am (TESTS): Added: pkbench.
 	* pkbench.c: New file.
 
 2004-02-25  Werner Koch  <wk@gnupg.org>
 
 	* Makefile.am (TEST): Add benchmark.
 
 	* benchmark.c (md_bench, cipher_bench): Allow NULL arg to to run
 	tests for all algorithms.
 	(main): Run all tests by default.
 
 2004-02-03  Werner Koch  <wk@gnupg.org>
 
 	* tsexp.c (basic): New pass to check secure memory switching.
 
 2004-01-12  Moritz Schulte  <mo@g10code.com>
 
 	* ac.c (check_one): Adjust to new ac API.
 
 2003-11-22  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c (check_keys_crypt): Fixed my last patch.
 
 2003-11-11  Werner Koch  <wk@gnupg.org>
 
 	* tsexp.c (basic): Add pass structure and a test for the %b
 	format. 
 
 2003-11-04  Werner Koch  <wk@gnupg.org>
 
 	* Makefile.am (noinst_PROGRAMS): Use this so that test programs
 	get always build.
 
 	* keygen.c (check_nonce): New.
 	(main): Add a basic check for the nocen function.
 
 2003-10-31  Werner Koch  <wk@gnupg.org>
 
 	* basic.c (check_aes128_cbc_cts_cipher): Make it a prototype
 
 	* ac.c (check_run): Comment unused variable.
 
 2003-10-10  Werner Koch  <wk@gnupg.org>
 
 	* prime.c (check_primes): Generate a generator and avoid printing
 	unless in verbose mode.
 
 2003-10-07  Werner Koch  <wk@gnupg.org>
 
 	* tsexp.c (check_sscan): New.
 
 2003-09-04  Werner Koch  <wk@gnupg.org>
 
 	* pubkey.c (check_keys_crypt): Fix for compatibility mode.
 
 2003-09-02  Moritz Schulte  <mo@g10code.com>
 
 	* Makefile.am (TESTS): Added: prime.
 
 	* prime.c: New file.
 
 2003-08-27  Moritz Schulte  <mo@g10code.com>
 
 	* basic.c (check_ciphers): Added: Serpent.
 	Write braces around flags.
 
 2003-08-04  Moritz Schulte  <moritz@g10code.com>
 
 	* benchmark.c (do_powm): Adjust for new gcry_mpi_scan interface.
 
 2003-07-23  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c (key_copy): New function...
 	(check_one): ... use it.
 
 2003-07-22  Moritz Schulte  <moritz@g10code.com>
 
 	* basic.c (check_ciphers): Use gcry_cipher_map_name.
 
 2003-07-18  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c (check_run): Renamed to ...
 	(check_one): ... this, changed calling interface.
 	(check_run): New function.
 
 	* register.c: Adjust gcry_cipher_spec_t structure.
 
 2003-07-14  Moritz Schulte  <moritz@g10code.com>
 
 	* register.c: Adjust cipher specification structure.
 
 	* benchmark.c: New file.
 	* testapi.c: New file.
 
 	* Makefile.am (EXTRA_PROGRAMS): Set to: benchmark testapi.
 	(check_PROGRAMS): Set to: $(TESTS).
 
 2003-07-12  Moritz Schulte  <moritz@g10code.com>
 
 	* ac.c, basic.c, keygen.c, register.c, sexp.c, tsexp.c: Used
 	gcry_err* wrappers for libgpg symbols.
 
 	* basic.c (check_ciphers): Added: GCRY_CIPHER_TWOFISH128.
 
 2003-07-08  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am (LIBS): Remove: -lpthread.
 
 	* basic.c (check_one_cipher): Fix variable initialization.  Thanks
 	to Simon Joseffson <jas@extundo.com>.
 
 2003-07-07  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am (TESTS): Added: register.
 
 2003-07-05  Moritz Schulte  <moritz@g10code.com>
 
 	* register.c (check_run): Adjusted for new gcry_cipher_register API.
 
 2003-07-02  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am (TESTS): Added: ac.
 	* ac.c: New file.
 
 2003-06-18  Werner Koch  <wk@gnupg.org>
 
 	* basic.c (check_cbc_mac_cipher): Adjusted for new API of get_blklen
 	and get_keylen.
 	(check_ctr_cipher): Ditto.
 	(check_one_cipher): Ditto.
 	(check_one_md): Adjusted for new API of gcry_md_copy.
 
 2003-06-18  Moritz Schulte  <moritz@g10code.com>
 
 	* register.c: Replace old type GcryModule with newer one:
 	gcry_module_t.
 	Adjusted for new API.
 
 	* Makefile.am (AM_CFLAGS): Added: @GPG_ERROR_CFLAGS@.
 
 2003-06-15  Moritz Schulte  <moritz@g10code.com>
 
 	* basic.c (get_keys_new): New function.
 	(do_check_one_pubkey): New function ...
 	(check_one_pubkey): ... use it.
 	(progress_handler): New function.
 	(main): Use gcry_set_progress_handler.
 
 2003-06-14  Moritz Schulte  <moritz@g10code.com>
 
 	* basic.c: Replaced calls to gcry_strerror with calls to
 	gpg_strerror.
 	(check_one_md): Adjust for new gcry_md_copy API.
 
 	* tsexp.c: Likewise.
 	* keygen.c: Likewise.
 
 2003-06-12  Moritz Schulte  <moritz@g10code.com>
 
 	* basic.c: Changed here and there, reorganized pubkey checks,
 	added DSA and ELG keys.
 
 2003-06-09  Moritz Schulte  <moritz@g10code.com>
 
 	* basic.c, keygen.c, pubkey.c, register.c, tsexp.c: Changed to use
 	new API.
 	
 2003-06-01  Moritz Schulte  <moritz@g10code.com>
 
 	* tsexp.c (canon_len): Adjust for new gcry_sexp_canon_len API.
 
 2003-05-26  Moritz Schulte  <moritz@g10code.com>
 
 	* basic.c (verify_one_signature): Adjust for libgpg-error.
 	(check_pubkey_sign): Likewise.
 	(check_pubkey): Likewise.
 	* basic.c (check_pubkey_sign): Likewise.
 	* tsexp.c (canon_len): Likewise.
 	(back_and_forth_one): Likewise.
 
 2003-04-27  Moritz Schulte  <moritz@g10code.com>
 
 	* pubkey.c: Changed the sample private key to contain the
 	identifier `openpgp-rsa' instead of `rsa'.
 
 	* basic.c (check_digests): Enabled/fixed some tests for TIGER.
 
 2003-04-17  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am (TESTS): Removed `register' for now.
 
 2003-04-17  Moritz Schulte  <moritz@g10code.com>
 
 	* basic.c (check_digests): Include checks for SHA512 and SHA384.
 
 2003-04-16  Moritz Schulte  <moritz@g10code.com>
 
 	* basic.c (check_one_md): Also test md_copy.
 
 2003-04-07  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am (TESTS): Added register.
 
 	* register.c: New file.
 
 2003-03-30  Simon Josefsson  <jas@extundo.com>
 
 	* basic.c (check_one_cipher): New.  Test CTR.
 	(main): Call it.
 	(check_ciphers): Check CTR mode.
 
 2003-03-26  Moritz Schulte  <moritz@g10code.com>
 
 	* Makefile.am (TESTS): Added pubkey.
 
 	* pubkey.c: New file.
 
 2003-03-22  Simon Josefsson  <jas@extundo.com>
 
 	* basic.c (check_cbc_mac_cipher): New.
 	(main): Use it.
 
 2003-03-19  Werner Koch  <wk@gnupg.org>
 
 	* keygen.c (check_rsa_keys): Don't expect an exponent when asking
 	for e=0.
 	(check_generated_rsa_key): Just print exponent if EXPECTED_E is 0.
 
 2003-03-02  Moritz Schulte  <moritz@g10code.com>
 
 	* basic.c (check_one_cipher): Use gcry_cipher_reset() instead of
 	gcry_cipher_close(), gcry_cipher_open and gcry_cipher_setkey().
 
 2003-01-23  Werner Koch  <wk@gnupg.org>
 
 	* keygen.c: New. 
 
 2003-01-20  Simon Josefsson  <jas@extundo.com>
 
 	* basic.c (check_digests): Add CRC.
 	(check_one_md): Print computed and expected values on error.
 
 2003-01-20  Werner Koch  <wk@gnupg.org>
 
 	* basic.c (check_one_md): Kludge to check a one million "a".
 	(check_digests): Add checks for SHA-256.
 
 2003-01-20  Werner Koch  <wk@gnupg.org>
 
 	* basic.c (check_pubkey): Check the keygrip for the sample key.
 
 2003-01-15  Werner Koch  <wk@gnupg.org>
 
 	* basic.c (verify_one_signature,check_pubkey_sign)
 	(check_pubkey): New.
 	(main): Check public key functions. Add a --debug option.
 
 2002-11-23  Werner Koch  <wk@gnupg.org>
 
 	* basic.c (check_digests): Add another test for MD4.  By Simon
 	Josefsson.
 
 2002-11-10  Simon Josefsson  <jas@extundo.com>
 
 	* basic.c (check_aes128_cbc_cts_cipher): New function.
 	(check_one_cipher): Add flags parameter.
 	(check_ciphers): Support flags parameter.
 	(main): Check CTS.
 
 2002-11-10  Werner Koch  <wk@gnupg.org>
 
 	* basic.c (check_one_md): New.  By Simon Josefsson.
 	(check_digests): New tests for MD4.  By Simon.
 
 2002-08-26  Werner Koch  <wk@gnupg.org>
 
 	* basic.c (check_ciphers): Check simple DES.
 
 2002-05-16  Werner Koch  <wk@gnupg.org>
 
 	* tsexp.c (back_and_forth): Very minimal test of the new functions.
 
 2002-05-14  Werner Koch  <wk@gnupg.org>
 
 	Changed license of all files to the LGPL.
 
 2002-05-02  Werner Koch  <wk@gnupg.org>
 
 	* basic.c: Add option --verbose.
 
 2002-01-11  Werner Koch  <wk@gnupg.org>
 
 	* tsexp.c (canon_len): Fixed tests.
 
 2001-12-18  Werner Koch  <wk@gnupg.org>
 
 	* tsexp.c: New.
 
 	
  Copyright 2001, 2002, 2003 Free Software Foundation, Inc.
 
  This file is free software; as a special exception the author gives
  unlimited permission to copy and/or distribute it, with or without
  modifications, as long as this notice is preserved.
 
  This file is distributed in the hope that it will be useful, but
  WITHOUT ANY WARRANTY, to the extent permitted by law; without even the
  implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
diff --git a/tests/basic.c b/tests/basic.c
index 7904b8fe..97ac2d9e 100644
--- a/tests/basic.c
+++ b/tests/basic.c
@@ -1,2162 +1,2172 @@
 /* basic.c  -  basic regression tests
  * Copyright (C) 2001, 2002, 2003, 2005, 2008 Free Software Foundation, Inc.
  *
  * This file is part of Libgcrypt.
  *
  * Libgcrypt 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.
  *
  * Libgcrypt 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 program; if not, see <http://www.gnu.org/licenses/>.
  */
 
 #ifdef HAVE_CONFIG_H
 #include <config.h>
 #endif
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdarg.h>
 
 #include "../src/gcrypt.h"
 
 typedef struct test_spec_pubkey_key
 {
   const char *secret;
   const char *public;
   const char *grip;
 }
 test_spec_pubkey_key_t;
 
 typedef struct test_spec_pubkey
 {
   int id;
   int flags;
   test_spec_pubkey_key_t key;
 }
 test_spec_pubkey_t;
 
 #define FLAG_CRYPT (1 << 0)
 #define FLAG_SIGN  (1 << 1)
 #define FLAG_GRIP  (1 << 2)
 
 static int verbose;
 static int error_count;
 static int in_fips_mode;
 
 static void
 fail (const char *format, ...)
 {
   va_list arg_ptr;
 
   va_start (arg_ptr, format);
   vfprintf (stderr, format, arg_ptr);
   va_end (arg_ptr);
   error_count++;
 }
 
 static void
 die (const char *format, ...)
 {
   va_list arg_ptr;
 
   va_start (arg_ptr, format);
   vfprintf (stderr, format, arg_ptr);
   va_end (arg_ptr);
   exit (1);
 }
 
 #define MAX_DATA_LEN 100
 
 void
 progress_handler (void *cb_data, const char *what, int printchar,
 		  int current, int total)
 {
   (void)cb_data;
   (void)what;
   (void)current;
   (void)total;
   
   if (printchar == '\n')
     fputs ( "<LF>", stdout);
   else
     putchar (printchar);
   fflush (stdout);
 }
 
 static void
 check_cbc_mac_cipher (void)
 {
   struct tv
   {
     int algo;
     char key[MAX_DATA_LEN];
     unsigned char plaintext[MAX_DATA_LEN];
     size_t plaintextlen;
     char mac[MAX_DATA_LEN];
   }
   tv[] =
     {
       { GCRY_CIPHER_AES,
 	"chicken teriyaki",
 	"This is a sample plaintext for CBC MAC of sixtyfour bytes.......",
 	0, "\x23\x8f\x6d\xc7\x53\x6a\x62\x97\x11\xc4\xa5\x16\x43\xea\xb0\xb6" },
       { GCRY_CIPHER_3DES,
 	"abcdefghABCDEFGH01234567",
 	"This is a sample plaintext for CBC MAC of sixtyfour bytes.......",
 	0, "\x5c\x11\xf0\x01\x47\xbd\x3d\x3a" },
       { GCRY_CIPHER_DES,
 	"abcdefgh",
 	"This is a sample plaintext for CBC MAC of sixtyfour bytes.......",
 	0, "\xfa\x4b\xdf\x9d\xfa\xab\x01\x70" }
     };
   gcry_cipher_hd_t hd;
   unsigned char out[MAX_DATA_LEN];
   int i, blklen, keylen;
   gcry_error_t err = 0;
 
   if (verbose)
     fprintf (stderr, "Starting CBC MAC checks.\n");
 
   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
     {
       if (gcry_cipher_test_algo (tv[i].algo) && in_fips_mode)
         {
           if (verbose)
             fprintf (stderr, "  algorithm %d not available in fips mode\n",
                      tv[i].algo);
           continue;
         }
 
       err = gcry_cipher_open (&hd,
 			      tv[i].algo,
 			      GCRY_CIPHER_MODE_CBC, GCRY_CIPHER_CBC_MAC);
       if (!hd)
 	{
 	  fail ("cbc-mac algo %d, grcy_open_cipher failed: %s\n",
 		tv[i].algo, gpg_strerror (err));
 	  return;
 	}
 
       blklen = gcry_cipher_get_algo_blklen(tv[i].algo);
       if (!blklen)
 	{
 	  fail ("cbc-mac algo %d, gcry_cipher_get_algo_blklen failed\n",
 		 tv[i].algo);
 	  gcry_cipher_close (hd);
 	  return;
 	}
 
       keylen = gcry_cipher_get_algo_keylen (tv[i].algo);
       if (!keylen)
 	{
 	  fail ("cbc-mac algo %d, gcry_cipher_get_algo_keylen failed\n",
 		tv[i].algo);
 	  return;
 	}
 
       err = gcry_cipher_setkey (hd, tv[i].key, keylen);
       if (err)
 	{
 	  fail ("cbc-mac algo %d, gcry_cipher_setkey failed: %s\n",
 		tv[i].algo, gpg_strerror (err));
 	  gcry_cipher_close (hd);
 	  return;
 	}
 
       err = gcry_cipher_setiv (hd, NULL, 0);
       if (err)
 	{
 	  fail ("cbc-mac algo %d, gcry_cipher_setiv failed: %s\n",
 		tv[i].algo, gpg_strerror (err));
 	  gcry_cipher_close (hd);
 	  return;
 	}
 
       if (verbose)
 	fprintf (stderr, "  checking CBC MAC for %s [%i]\n", 
 		 gcry_cipher_algo_name (tv[i].algo),
 		 tv[i].algo);
       err = gcry_cipher_encrypt (hd,
 				 out, blklen,
 				 tv[i].plaintext,
 				 tv[i].plaintextlen ?
 				 tv[i].plaintextlen :
 				 strlen ((char*)tv[i].plaintext));
       if (err)
 	{
 	  fail ("cbc-mac algo %d, gcry_cipher_encrypt failed: %s\n",
 		tv[i].algo, gpg_strerror (err));
 	  gcry_cipher_close (hd);
 	  return;
 	}
 
 #if 0
       {
 	int j;
 	for (j = 0; j < gcry_cipher_get_algo_blklen (tv[i].algo); j++)
 	  printf ("\\x%02x", out[j] & 0xFF);
 	printf ("\n");
       }
 #endif
 
       if (memcmp (tv[i].mac, out, blklen))
 	fail ("cbc-mac algo %d, encrypt mismatch entry %d\n", tv[i].algo, i);
 
       gcry_cipher_close (hd);
     }
   if (verbose)
     fprintf (stderr, "Completed CBC MAC checks.\n");
 }
 
 static void
 check_aes128_cbc_cts_cipher (void)
 {
   char key[128 / 8] = "chicken teriyaki";
   unsigned char plaintext[] =
     "I would like the General Gau's Chicken, please, and wonton soup.";
   struct tv
   {
     unsigned char out[MAX_DATA_LEN];
     int inlen;
   } tv[] =
     {
       { "\xc6\x35\x35\x68\xf2\xbf\x8c\xb4\xd8\xa5\x80\x36\x2d\xa7\xff\x7f"
 	"\x97",
 	17 },
       { "\xfc\x00\x78\x3e\x0e\xfd\xb2\xc1\xd4\x45\xd4\xc8\xef\xf7\xed\x22"
 	"\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5",
 	31 },
       { "\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
 	"\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84",
 	32 },
       { "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
 	"\xb3\xff\xfd\x94\x0c\x16\xa1\x8c\x1b\x55\x49\xd2\xf8\x38\x02\x9e"
 	"\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5",
 	47 },
       { "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
 	"\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8"
 	"\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8",
 	48 },
       { "\x97\x68\x72\x68\xd6\xec\xcc\xc0\xc0\x7b\x25\xe2\x5e\xcf\xe5\x84"
 	"\x39\x31\x25\x23\xa7\x86\x62\xd5\xbe\x7f\xcb\xcc\x98\xeb\xf5\xa8"
 	"\x48\x07\xef\xe8\x36\xee\x89\xa5\x26\x73\x0d\xbc\x2f\x7b\xc8\x40"
 	"\x9d\xad\x8b\xbb\x96\xc4\xcd\xc0\x3b\xc1\x03\xe1\xa1\x94\xbb\xd8",
 	64 },
     };
   gcry_cipher_hd_t hd;
   unsigned char out[MAX_DATA_LEN];
   int i;
   gcry_error_t err = 0;
 
   if (verbose)
     fprintf (stderr, "Starting AES128 CBC CTS checks.\n");
   err = gcry_cipher_open (&hd,
 			  GCRY_CIPHER_AES,
 			  GCRY_CIPHER_MODE_CBC, GCRY_CIPHER_CBC_CTS);
   if (err)
     {
       fail ("aes-cbc-cts, grcy_open_cipher failed: %s\n", gpg_strerror (err));
       return;
     }
 
   err = gcry_cipher_setkey (hd, key, 128 / 8);
   if (err)
     {
       fail ("aes-cbc-cts, gcry_cipher_setkey failed: %s\n",
 	    gpg_strerror (err));
       gcry_cipher_close (hd);
       return;
     }
 
   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
     {
       err = gcry_cipher_setiv (hd, NULL, 0);
       if (err)
 	{
 	  fail ("aes-cbc-cts, gcry_cipher_setiv failed: %s\n",
 		gpg_strerror (err));
 	  gcry_cipher_close (hd);
 	  return;
 	}
 
       if (verbose)
 	fprintf (stderr, "  checking encryption for length %i\n", tv[i].inlen);
       err = gcry_cipher_encrypt (hd, out, MAX_DATA_LEN,
 				 plaintext, tv[i].inlen);
       if (err)
 	{
 	  fail ("aes-cbc-cts, gcry_cipher_encrypt failed: %s\n",
 		gpg_strerror (err));
 	  gcry_cipher_close (hd);
 	  return;
 	}
 
       if (memcmp (tv[i].out, out, tv[i].inlen))
 	fail ("aes-cbc-cts, encrypt mismatch entry %d\n", i);
 
       err = gcry_cipher_setiv (hd, NULL, 0);
       if (err)
 	{
 	  fail ("aes-cbc-cts, gcry_cipher_setiv failed: %s\n",
 		gpg_strerror (err));
 	  gcry_cipher_close (hd);
 	  return;
 	}
       if (verbose)
 	fprintf (stderr, "  checking decryption for length %i\n", tv[i].inlen);
       err = gcry_cipher_decrypt (hd, out, tv[i].inlen, NULL, 0);
       if (err)
 	{
 	  fail ("aes-cbc-cts, gcry_cipher_decrypt failed: %s\n",
 		gpg_strerror (err));
 	  gcry_cipher_close (hd);
 	  return;
 	}
 
       if (memcmp (plaintext, out, tv[i].inlen))
 	fail ("aes-cbc-cts, decrypt mismatch entry %d\n", i);
     }
 
   gcry_cipher_close (hd);
   if (verbose)
     fprintf (stderr, "Completed AES128 CBC CTS checks.\n");
 }
 
 static void
 check_ctr_cipher (void)
 {
   struct tv
   {
     int algo;
     char key[MAX_DATA_LEN];
     char ctr[MAX_DATA_LEN];
     struct data
     {
       unsigned char plaintext[MAX_DATA_LEN];
       int inlen;
       char out[MAX_DATA_LEN];
     }
     data[MAX_DATA_LEN];
   } tv[] =
     {
       /* http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf */
       {	GCRY_CIPHER_AES,
 	"\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
 	"\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
 	{ { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
 	    16,
 	    "\x87\x4d\x61\x91\xb6\x20\xe3\x26\x1b\xef\x68\x64\x99\x0d\xb6\xce" },
 	  { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
 	    16,
 	    "\x98\x06\xf6\x6b\x79\x70\xfd\xff\x86\x17\x18\x7b\xb9\xff\xfd\xff" },
 	  { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
 	    16,
 	    "\x5a\xe4\xdf\x3e\xdb\xd5\xd3\x5e\x5b\x4f\x09\x02\x0d\xb0\x3e\xab" },
 	  { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
 	    16,
 	    "\x1e\x03\x1d\xda\x2f\xbe\x03\xd1\x79\x21\x70\xa0\xf3\x00\x9c\xee" },
 	}
       },
       {	GCRY_CIPHER_AES192,
 	"\x8e\x73\xb0\xf7\xda\x0e\x64\x52\xc8\x10\xf3\x2b"
 	"\x80\x90\x79\xe5\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
 	"\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
 	{ { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
 	    16,
 	    "\x1a\xbc\x93\x24\x17\x52\x1c\xa2\x4f\x2b\x04\x59\xfe\x7e\x6e\x0b" },
 	  { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
 	    16,
 	    "\x09\x03\x39\xec\x0a\xa6\xfa\xef\xd5\xcc\xc2\xc6\xf4\xce\x8e\x94" },
 	  { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
 	    16,
 	    "\x1e\x36\xb2\x6b\xd1\xeb\xc6\x70\xd1\xbd\x1d\x66\x56\x20\xab\xf7" },
 	  { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
 	    16,
 	    "\x4f\x78\xa7\xf6\xd2\x98\x09\x58\x5a\x97\xda\xec\x58\xc6\xb0\x50" },
 	}
       },
       {	GCRY_CIPHER_AES256,
 	"\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81"
 	"\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
 	"\xf0\xf1\xf2\xf3\xf4\xf5\xf6\xf7\xf8\xf9\xfa\xfb\xfc\xfd\xfe\xff",
 	{ { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
 	    16,
 	    "\x60\x1e\xc3\x13\x77\x57\x89\xa5\xb7\xa7\xf5\x04\xbb\xf3\xd2\x28" },
 	  { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
 	    16,
 	    "\xf4\x43\xe3\xca\x4d\x62\xb5\x9a\xca\x84\xe9\x90\xca\xca\xf5\xc5" },
 	  { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
 	    16,
 	    "\x2b\x09\x30\xda\xa2\x3d\xe9\x4c\xe8\x70\x17\xba\x2d\x84\x98\x8d" },
 	  { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
 	    16,
 	    "\xdf\xc9\xc5\x8d\xb6\x7a\xad\xa6\x13\xc2\xdd\x08\x45\x79\x41\xa6" }
 	}
       }
     };
   gcry_cipher_hd_t hde, hdd;
   unsigned char out[MAX_DATA_LEN];
   int i, j, keylen, blklen;
   gcry_error_t err = 0;
 
   if (verbose)
     fprintf (stderr, "Starting CTR cipher checks.\n");
   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
     {
       err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_CTR, 0);
       if (!err)
 	err = gcry_cipher_open (&hdd, tv[i].algo, GCRY_CIPHER_MODE_CTR, 0);
       if (err)
 	{
 	  fail ("aes-ctr, grcy_open_cipher failed: %s\n", gpg_strerror (err));
 	  return;
 	}
 
       keylen = gcry_cipher_get_algo_keylen(tv[i].algo);
       if (!keylen)
 	{
 	  fail ("aes-ctr, gcry_cipher_get_algo_keylen failed\n");
 	  return;
 	}
 
       err = gcry_cipher_setkey (hde, tv[i].key, keylen);
       if (!err)
 	err = gcry_cipher_setkey (hdd, tv[i].key, keylen);
       if (err)
 	{
 	  fail ("aes-ctr, gcry_cipher_setkey failed: %s\n",
 		gpg_strerror (err));
 	  gcry_cipher_close (hde);
 	  gcry_cipher_close (hdd);
 	  return;
 	}
 
       blklen = gcry_cipher_get_algo_blklen(tv[i].algo);
       if (!blklen)
 	{
 	  fail ("aes-ctr, gcry_cipher_get_algo_blklen failed\n");
 	  return;
 	}
 
       err = gcry_cipher_setctr (hde, tv[i].ctr, blklen);
       if (!err)
 	err = gcry_cipher_setctr (hdd, tv[i].ctr, blklen);
       if (err)
 	{
 	  fail ("aes-ctr, gcry_cipher_setctr failed: %s\n",
 		gpg_strerror (err));
 	  gcry_cipher_close (hde);
 	  gcry_cipher_close (hdd);
 	  return;
 	}
 
       if (verbose)
 	fprintf (stderr, "  checking CTR mode for for %s [%i]\n", 
 		 gcry_cipher_algo_name (tv[i].algo),
 		 tv[i].algo);
       for (j = 0; tv[i].data[j].inlen; j++)
 	{
 	  err = gcry_cipher_encrypt (hde, out, MAX_DATA_LEN,
 				     tv[i].data[j].plaintext,
 				     tv[i].data[j].inlen == -1 ?
 				     strlen ((char*)tv[i].data[j].plaintext) :
 				     tv[i].data[j].inlen);
 	  if (err)
 	    {
 	      fail ("aes-ctr, gcry_cipher_encrypt (%d, %d) failed: %s\n",
 		    i, j, gpg_strerror (err));
 	      gcry_cipher_close (hde);
 	      gcry_cipher_close (hdd);
 	      return;
 	    }
 
 	  if (memcmp (tv[i].data[j].out, out, tv[i].data[j].inlen))
 	    fail ("aes-ctr, encrypt mismatch entry %d:%d\n", i, j);
 
 	  err = gcry_cipher_decrypt (hdd, out, tv[i].data[j].inlen, NULL, 0);
 	  if (err)
 	    {
 	      fail ("aes-ctr, gcry_cipher_decrypt (%d, %d) failed: %s\n",
 		    i, j, gpg_strerror (err));
 	      gcry_cipher_close (hde);
 	      gcry_cipher_close (hdd);
 	      return;
 	    }
 
 	  if (memcmp (tv[i].data[j].plaintext, out, tv[i].data[j].inlen))
 	    fail ("aes-ctr, decrypt mismatch entry %d:%d\n", i, j);
 	}
 
       gcry_cipher_close (hde);
       gcry_cipher_close (hdd);
     }
   if (verbose)
     fprintf (stderr, "Completed CTR cipher checks.\n");
 }
 
 static void
 check_cfb_cipher (void)
 {
   struct tv
   {
     int algo;
     char key[MAX_DATA_LEN];
     char iv[MAX_DATA_LEN];
     struct data
     {
       unsigned char plaintext[MAX_DATA_LEN];
       int inlen;
       char out[MAX_DATA_LEN];
     }
     data[MAX_DATA_LEN];
   } tv[] =
     {
       /* http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf */
       { GCRY_CIPHER_AES,
         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
             16,
             "\x3b\x3f\xd9\x2e\xb7\x2d\xad\x20\x33\x34\x49\xf8\xe8\x3c\xfb\x4a" },
           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
             16,
             "\xc8\xa6\x45\x37\xa0\xb3\xa9\x3f\xcd\xe3\xcd\xad\x9f\x1c\xe5\x8b"},
           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
             16,
             "\x26\x75\x1f\x67\xa3\xcb\xb1\x40\xb1\x80\x8c\xf1\x87\xa4\xf4\xdf" },
           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
             16,
             "\xc0\x4b\x05\x35\x7c\x5d\x1c\x0e\xea\xc4\xc6\x6f\x9f\xf7\xf2\xe6" },
         }
       },
       { GCRY_CIPHER_AES192,
         "\x8e\x73\xb0\xf7\xda\x0e\x64\x52\xc8\x10\xf3\x2b"
         "\x80\x90\x79\xe5\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
             16,
             "\xcd\xc8\x0d\x6f\xdd\xf1\x8c\xab\x34\xc2\x59\x09\xc9\x9a\x41\x74" },
           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
             16,
             "\x67\xce\x7f\x7f\x81\x17\x36\x21\x96\x1a\x2b\x70\x17\x1d\x3d\x7a" },
           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
             16,
             "\x2e\x1e\x8a\x1d\xd5\x9b\x88\xb1\xc8\xe6\x0f\xed\x1e\xfa\xc4\xc9" },
           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
             16,
             "\xc0\x5f\x9f\x9c\xa9\x83\x4f\xa0\x42\xae\x8f\xba\x58\x4b\x09\xff" },
         }
       },
       { GCRY_CIPHER_AES256,
         "\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81"
         "\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
             16,
             "\xdc\x7e\x84\xbf\xda\x79\x16\x4b\x7e\xcd\x84\x86\x98\x5d\x38\x60" },
           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
             16,
             "\x39\xff\xed\x14\x3b\x28\xb1\xc8\x32\x11\x3c\x63\x31\xe5\x40\x7b" },
           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
             16,
             "\xdf\x10\x13\x24\x15\xe5\x4b\x92\xa1\x3e\xd0\xa8\x26\x7a\xe2\xf9" },
           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
             16,
             "\x75\xa3\x85\x74\x1a\xb9\xce\xf8\x20\x31\x62\x3d\x55\xb1\xe4\x71" }
         }
       }
     };
   gcry_cipher_hd_t hde, hdd;
   unsigned char out[MAX_DATA_LEN];
   int i, j, keylen, blklen;
   gcry_error_t err = 0;
 
   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
     {
       err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_CFB, 0);
       if (!err)
         err = gcry_cipher_open (&hdd, tv[i].algo, GCRY_CIPHER_MODE_CFB, 0);
       if (err)
         {
           fail ("aes-cfb, grcy_open_cipher failed: %s\n", gpg_strerror (err));
           return;
         }
 
       keylen = gcry_cipher_get_algo_keylen(tv[i].algo);
       if (!keylen)
         {
           fail ("aes-cfb, gcry_cipher_get_algo_keylen failed\n");
           return;
         }
 
       err = gcry_cipher_setkey (hde, tv[i].key, keylen);
       if (!err)
         err = gcry_cipher_setkey (hdd, tv[i].key, keylen);
       if (err)
         {
           fail ("aes-cfb, gcry_cipher_setkey failed: %s\n",
                 gpg_strerror (err));
           gcry_cipher_close (hde);
           gcry_cipher_close (hdd);
           return;
         }
 
       blklen = gcry_cipher_get_algo_blklen(tv[i].algo);
       if (!blklen)
         {
           fail ("aes-cfb, gcry_cipher_get_algo_blklen failed\n");
           return;
         }
 
       err = gcry_cipher_setiv (hde, tv[i].iv, blklen);
       if (!err)
         err = gcry_cipher_setiv (hdd, tv[i].iv, blklen);
       if (err)
         {
           fail ("aes-cfb, gcry_cipher_setiv failed: %s\n",
                 gpg_strerror (err));
           gcry_cipher_close (hde);
           gcry_cipher_close (hdd);
           return;
         }
 
       for (j = 0; tv[i].data[j].inlen; j++)
         {
           err = gcry_cipher_encrypt (hde, out, MAX_DATA_LEN,
                                      tv[i].data[j].plaintext,
                                      tv[i].data[j].inlen);
           if (err)
             {
               fail ("aes-cfb, gcry_cipher_encrypt (%d, %d) failed: %s\n",
                     i, j, gpg_strerror (err));
               gcry_cipher_close (hde);
               gcry_cipher_close (hdd);
               return;
             }
 
           if (memcmp (tv[i].data[j].out, out, tv[i].data[j].inlen)) {
             fail ("aes-cfb, encrypt mismatch entry %d:%d\n", i, j);
 	  }
           err = gcry_cipher_decrypt (hdd, out, tv[i].data[j].inlen, NULL, 0);
           if (err)
             {
               fail ("aes-cfb, gcry_cipher_decrypt (%d, %d) failed: %s\n",
                     i, j, gpg_strerror (err));
               gcry_cipher_close (hde);
               gcry_cipher_close (hdd);
               return;
             }
 
           if (memcmp (tv[i].data[j].plaintext, out, tv[i].data[j].inlen))
             fail ("aes-cfb, decrypt mismatch entry %d:%d\n", i, j);
         }
 
       gcry_cipher_close (hde);
       gcry_cipher_close (hdd);
     }
 }
 
 static void
 check_ofb_cipher (void)
 {
   struct tv
   {
     int algo;
     char key[MAX_DATA_LEN];
     char iv[MAX_DATA_LEN];
     struct data
     {
       unsigned char plaintext[MAX_DATA_LEN];
       int inlen;
       char out[MAX_DATA_LEN];
     }
     data[MAX_DATA_LEN];
   } tv[] =
     {
       /* http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf */
       { GCRY_CIPHER_AES,
         "\x2b\x7e\x15\x16\x28\xae\xd2\xa6\xab\xf7\x15\x88\x09\xcf\x4f\x3c",
         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
             16,
             "\x3b\x3f\xd9\x2e\xb7\x2d\xad\x20\x33\x34\x49\xf8\xe8\x3c\xfb\x4a" },
           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
             16,
             "\x77\x89\x50\x8d\x16\x91\x8f\x03\xf5\x3c\x52\xda\xc5\x4e\xd8\x25"},
           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
             16,
             "\x97\x40\x05\x1e\x9c\x5f\xec\xf6\x43\x44\xf7\xa8\x22\x60\xed\xcc" },
           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
             16,
             "\x30\x4c\x65\x28\xf6\x59\xc7\x78\x66\xa5\x10\xd9\xc1\xd6\xae\x5e" },
         }
       },
       { GCRY_CIPHER_AES192,
         "\x8e\x73\xb0\xf7\xda\x0e\x64\x52\xc8\x10\xf3\x2b"
         "\x80\x90\x79\xe5\x62\xf8\xea\xd2\x52\x2c\x6b\x7b",
         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
             16,
             "\xcd\xc8\x0d\x6f\xdd\xf1\x8c\xab\x34\xc2\x59\x09\xc9\x9a\x41\x74" },
           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
             16,
             "\xfc\xc2\x8b\x8d\x4c\x63\x83\x7c\x09\xe8\x17\x00\xc1\x10\x04\x01" },
           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
             16,
             "\x8d\x9a\x9a\xea\xc0\xf6\x59\x6f\x55\x9c\x6d\x4d\xaf\x59\xa5\xf2" },
           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
             16,
             "\x6d\x9f\x20\x08\x57\xca\x6c\x3e\x9c\xac\x52\x4b\xd9\xac\xc9\x2a" },
         }
       },
       { GCRY_CIPHER_AES256,
         "\x60\x3d\xeb\x10\x15\xca\x71\xbe\x2b\x73\xae\xf0\x85\x7d\x77\x81"
         "\x1f\x35\x2c\x07\x3b\x61\x08\xd7\x2d\x98\x10\xa3\x09\x14\xdf\xf4",
         "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f",
         { { "\x6b\xc1\xbe\xe2\x2e\x40\x9f\x96\xe9\x3d\x7e\x11\x73\x93\x17\x2a",
             16,
             "\xdc\x7e\x84\xbf\xda\x79\x16\x4b\x7e\xcd\x84\x86\x98\x5d\x38\x60" },
           { "\xae\x2d\x8a\x57\x1e\x03\xac\x9c\x9e\xb7\x6f\xac\x45\xaf\x8e\x51",
             16,
             "\x4f\xeb\xdc\x67\x40\xd2\x0b\x3a\xc8\x8f\x6a\xd8\x2a\x4f\xb0\x8d" },
           { "\x30\xc8\x1c\x46\xa3\x5c\xe4\x11\xe5\xfb\xc1\x19\x1a\x0a\x52\xef",
             16,
             "\x71\xab\x47\xa0\x86\xe8\x6e\xed\xf3\x9d\x1c\x5b\xba\x97\xc4\x08" },
           { "\xf6\x9f\x24\x45\xdf\x4f\x9b\x17\xad\x2b\x41\x7b\xe6\x6c\x37\x10",
             16,
             "\x01\x26\x14\x1d\x67\xf3\x7b\xe8\x53\x8f\x5a\x8b\xe7\x40\xe4\x84" }
         }
       }
     };
   gcry_cipher_hd_t hde, hdd;
   unsigned char out[MAX_DATA_LEN];
   int i, j, keylen, blklen;
   gcry_error_t err = 0;
 
   for (i = 0; i < sizeof (tv) / sizeof (tv[0]); i++)
     {
       err = gcry_cipher_open (&hde, tv[i].algo, GCRY_CIPHER_MODE_OFB, 0);
       if (!err)
         err = gcry_cipher_open (&hdd, tv[i].algo, GCRY_CIPHER_MODE_OFB, 0);
       if (err)
         {
           fail ("aes-ofb, grcy_open_cipher failed: %s\n", gpg_strerror (err));
           return;
         }
 
       keylen = gcry_cipher_get_algo_keylen(tv[i].algo);
       if (!keylen)
         {
           fail ("aes-ofb, gcry_cipher_get_algo_keylen failed\n");
           return;
         }
 
       err = gcry_cipher_setkey (hde, tv[i].key, keylen);
       if (!err)
         err = gcry_cipher_setkey (hdd, tv[i].key, keylen);
       if (err)
         {
           fail ("aes-ofb, gcry_cipher_setkey failed: %s\n",
                 gpg_strerror (err));
           gcry_cipher_close (hde);
           gcry_cipher_close (hdd);
           return;
         }
 
       blklen = gcry_cipher_get_algo_blklen(tv[i].algo);
       if (!blklen)
         {
           fail ("aes-ofb, gcry_cipher_get_algo_blklen failed\n");
           return;
         }
 
       err = gcry_cipher_setiv (hde, tv[i].iv, blklen);
       if (!err)
         err = gcry_cipher_setiv (hdd, tv[i].iv, blklen);
       if (err)
         {
           fail ("aes-ofb, gcry_cipher_setiv failed: %s\n",
                 gpg_strerror (err));
           gcry_cipher_close (hde);
           gcry_cipher_close (hdd);
           return;
         }
 
       for (j = 0; tv[i].data[j].inlen; j++)
         {
           err = gcry_cipher_encrypt (hde, out, MAX_DATA_LEN,
                                      tv[i].data[j].plaintext,
                                      tv[i].data[j].inlen);
           if (err)
             {
               fail ("aes-ofb, gcry_cipher_encrypt (%d, %d) failed: %s\n",
                     i, j, gpg_strerror (err));
               gcry_cipher_close (hde);
               gcry_cipher_close (hdd);
               return;
             }
 
           if (memcmp (tv[i].data[j].out, out, tv[i].data[j].inlen))
             fail ("aes-ofb, encrypt mismatch entry %d:%d\n", i, j);
 
           err = gcry_cipher_decrypt (hdd, out, tv[i].data[j].inlen, NULL, 0);
           if (err)
             {
               fail ("aes-ofb, gcry_cipher_decrypt (%d, %d) failed: %s\n",
                     i, j, gpg_strerror (err));
               gcry_cipher_close (hde);
               gcry_cipher_close (hdd);
               return;
             }
 
           if (memcmp (tv[i].data[j].plaintext, out, tv[i].data[j].inlen))
             fail ("aes-ofb, decrypt mismatch entry %d:%d\n", i, j);
         }
 
       err = gcry_cipher_reset(hde);
       if (!err)
 	err = gcry_cipher_reset(hdd);
       if (err)
 	{
 	  fail ("aes-ofb, gcry_cipher_reset (%d, %d) failed: %s\n",
 		i, j, gpg_strerror (err));
 	  gcry_cipher_close (hde);
 	  gcry_cipher_close (hdd);
 	  return;
 	}
 
       /* gcry_cipher_reset clears the IV */
       err = gcry_cipher_setiv (hde, tv[i].iv, blklen);
       if (!err)
         err = gcry_cipher_setiv (hdd, tv[i].iv, blklen);
       if (err)
         {
           fail ("aes-ofb, gcry_cipher_setiv failed: %s\n",
                 gpg_strerror (err));
           gcry_cipher_close (hde);
           gcry_cipher_close (hdd);
           return;
         }
 
       /* this time we encrypt and decrypt one byte at a time */
       for (j = 0; tv[i].data[j].inlen; j++)
         {
 	  int byteNum;
 	  for (byteNum = 0; byteNum < tv[i].data[j].inlen; ++byteNum) 
 	    {
 	      err = gcry_cipher_encrypt (hde, out+byteNum, 1,
 					 (tv[i].data[j].plaintext) + byteNum,
 					 1);
 	      if (err)
 		{
 		  fail ("aes-ofb, gcry_cipher_encrypt (%d, %d) failed: %s\n",
 			i, j, gpg_strerror (err));
 		  gcry_cipher_close (hde);
 		  gcry_cipher_close (hdd);
 		  return;
 		}
 	    }
 
           if (memcmp (tv[i].data[j].out, out, tv[i].data[j].inlen))
             fail ("aes-ofb, encrypt mismatch entry %d:%d\n", i, j);
 
 	  for (byteNum = 0; byteNum < tv[i].data[j].inlen; ++byteNum) 
 	    {
 	      err = gcry_cipher_decrypt (hdd, out+byteNum, 1, NULL, 0);
 	      if (err)
 		{
 		  fail ("aes-ofb, gcry_cipher_decrypt (%d, %d) failed: %s\n",
 			i, j, gpg_strerror (err));
 		  gcry_cipher_close (hde);
 		  gcry_cipher_close (hdd);
 		  return;
 		}
 	    }
 
           if (memcmp (tv[i].data[j].plaintext, out, tv[i].data[j].inlen))
             fail ("aes-ofb, decrypt mismatch entry %d:%d\n", i, j);
         }
 
       gcry_cipher_close (hde);
       gcry_cipher_close (hdd);
     }
 }
 
 static void
 check_one_cipher (int algo, int mode, int flags)
 {
   gcry_cipher_hd_t hd;
   char key[32];
   unsigned char plain[16], in[16], out[16];
   int keylen;
   gcry_error_t err = 0;
 
   memcpy (key, "0123456789abcdef.,;/[]{}-=ABCDEF", 32);
   memcpy (plain, "foobar42FOOBAR17", 16);
 
   keylen = gcry_cipher_get_algo_keylen (algo);
   if (!keylen)
     {
       fail ("algo %d, mode %d, gcry_cipher_get_algo_keylen failed\n",
 	    algo, mode);
       return;
     }
 
   if (keylen < 40 / 8 || keylen > 32)
     {
       fail ("algo %d, mode %d, keylength problem (%d)\n", algo, mode, keylen);
       return;
     }
 
   err = gcry_cipher_open (&hd, algo, mode, flags);
   if (err)
     {
       fail ("algo %d, mode %d, grcy_open_cipher failed: %s\n",
 	    algo, mode, gpg_strerror (err));
       return;
     }
 
   err = gcry_cipher_setkey (hd, key, keylen);
   if (err)
     {
       fail ("algo %d, mode %d, gcry_cipher_setkey failed: %s\n",
 	    algo, mode, gpg_strerror (err));
       gcry_cipher_close (hd);
       return;
     }
 
   err = gcry_cipher_encrypt (hd, out, 16, plain, 16);
   if (err)
     {
       fail ("algo %d, mode %d, gcry_cipher_encrypt failed: %s\n",
 	    algo, mode, gpg_strerror (err));
       gcry_cipher_close (hd);
       return;
     }
 
   gcry_cipher_reset (hd);
 
   err = gcry_cipher_decrypt (hd, in, 16, out, 16);
   if (err)
     {
       fail ("algo %d, mode %d, gcry_cipher_decrypt failed: %s\n",
 	    algo, mode, gpg_strerror (err));
       gcry_cipher_close (hd);
       return;
     }
 
   if (memcmp (plain, in, 16))
     fail ("algo %d, mode %d, encrypt-decrypt mismatch\n", algo, mode);
 
   /* Again, using in-place encryption.  */
   gcry_cipher_reset (hd);
 
   memcpy (out, plain, 16);
   err = gcry_cipher_encrypt (hd, out, 16, NULL, 0);
   if (err)
     {
       fail ("algo %d, mode %d, in-place, gcry_cipher_encrypt failed: %s\n",
 	    algo, mode, gpg_strerror (err));
       gcry_cipher_close (hd);
       return;
     }
 
   gcry_cipher_reset (hd);
 
   err = gcry_cipher_decrypt (hd, out, 16, NULL, 0);
   if (err)
     {
       fail ("algo %d, mode %d, in-place, gcry_cipher_decrypt failed: %s\n",
 	    algo, mode, gpg_strerror (err));
       gcry_cipher_close (hd);
       return;
     }
 
   if (memcmp (plain, out, 16))
     fail ("algo %d, mode %d, in-place, encrypt-decrypt mismatch\n",algo, mode);
 
 
   gcry_cipher_close (hd);
 
 }
 
 
 static void
 check_ciphers (void)
 {
   static int algos[] = {
 #if USE_BLOWFISH
     GCRY_CIPHER_BLOWFISH,
 #endif
 #if USE_DES
     GCRY_CIPHER_DES,
     GCRY_CIPHER_3DES,
 #endif
 #if USE_CAST5
     GCRY_CIPHER_CAST5,
 #endif
 #if USE_AES
     GCRY_CIPHER_AES,
     GCRY_CIPHER_AES192,
     GCRY_CIPHER_AES256,
 #endif
 #if USE_TWOFISH
     GCRY_CIPHER_TWOFISH,
     GCRY_CIPHER_TWOFISH128,
 #endif
 #if USE_SERPENT
     GCRY_CIPHER_SERPENT128,
     GCRY_CIPHER_SERPENT192,
     GCRY_CIPHER_SERPENT256,
 #endif
 #if USE_RFC2268
     GCRY_CIPHER_RFC2268_40,
 #endif
 #if USE_SEED
     GCRY_CIPHER_SEED,
 #endif
 #if USE_CAMELLIA
     GCRY_CIPHER_CAMELLIA128,
     GCRY_CIPHER_CAMELLIA192,
     GCRY_CIPHER_CAMELLIA256,
 #endif
     0
   };
   static int algos2[] = {
 #if USE_ARCFOUR
     GCRY_CIPHER_ARCFOUR,
 #endif
     0
   };
   int i;
 
   if (verbose)
     fprintf (stderr, "Starting Cipher checks.\n");
   for (i = 0; algos[i]; i++)
     {
       if (gcry_cipher_test_algo (algos[i]) && in_fips_mode)
         {
           if (verbose)
             fprintf (stderr, "  algorithm %d not available in fips mode\n",
 		     algos[i]);
           continue;
         }
       if (verbose)
 	fprintf (stderr, "  checking %s [%i]\n",
 		 gcry_cipher_algo_name (algos[i]),
 		 gcry_cipher_map_name (gcry_cipher_algo_name (algos[i])));
 
       check_one_cipher (algos[i], GCRY_CIPHER_MODE_ECB, 0);
       check_one_cipher (algos[i], GCRY_CIPHER_MODE_CFB, 0);
       check_one_cipher (algos[i], GCRY_CIPHER_MODE_OFB, 0);
       check_one_cipher (algos[i], GCRY_CIPHER_MODE_CBC, 0);
       check_one_cipher (algos[i], GCRY_CIPHER_MODE_CBC, GCRY_CIPHER_CBC_CTS);
       check_one_cipher (algos[i], GCRY_CIPHER_MODE_CTR, 0);
     }
 
   for (i = 0; algos2[i]; i++)
     {
       if (gcry_cipher_test_algo (algos[i]) && in_fips_mode)
         {
           if (verbose)
             fprintf (stderr, "  algorithm %d not available in fips mode\n",
 		     algos[i]);
           continue;
         }
       if (verbose)
 	fprintf (stderr, "  checking `%s'\n",
 		 gcry_cipher_algo_name (algos2[i]));
 
       check_one_cipher (algos2[i], GCRY_CIPHER_MODE_STREAM, 0);
     }
   /* we have now run all cipher's selftests */
 
   if (verbose)
     fprintf (stderr, "Completed Cipher checks.\n");
 
   /* TODO: add some extra encryption to test the higher level functions */
 }
 
 
 
 static void
 check_one_md (int algo, const char *data, int len, const char *expect)
 {
   gcry_md_hd_t hd, hd2;
   unsigned char *p;
   int mdlen;
   int i;
   gcry_error_t err = 0;
 
   err = gcry_md_open (&hd, algo, 0);
   if (err)
     {
       fail ("algo %d, grcy_md_open failed: %s\n", algo, gpg_strerror (err));
       return;
     }
 
   mdlen = gcry_md_get_algo_dlen (algo);
   if (mdlen < 1 || mdlen > 500)
     {
       fail ("algo %d, grcy_md_get_algo_dlen failed: %d\n", algo, mdlen);
       return;
     }
 
   if (*data == '!' && !data[1])
     {				/* hash one million times a "a" */
       char aaa[1000];
 
       /* Write in odd size chunks so that we test the buffering.  */
       memset (aaa, 'a', 1000);
       for (i = 0; i < 1000; i++)
         gcry_md_write (hd, aaa, 1000);
     }
   else
     gcry_md_write (hd, data, len);
 
   err = gcry_md_copy (&hd2, hd);
   if (err)
     {
       fail ("algo %d, gcry_md_copy failed: %s\n", algo, gpg_strerror (err));
     }
 
   gcry_md_close (hd);
 
   p = gcry_md_read (hd2, algo);
 
   if (memcmp (p, expect, mdlen))
     {
       printf ("computed: ");
       for (i = 0; i < mdlen; i++)
 	printf ("%02x ", p[i] & 0xFF);
       printf ("\nexpected: ");
       for (i = 0; i < mdlen; i++)
 	printf ("%02x ", expect[i] & 0xFF);
       printf ("\n");
 
       fail ("algo %d, digest mismatch\n", algo);
     }
 
   gcry_md_close (hd2);
 }
 
 
 static void
 check_digests (void)
 {
   static struct algos
   {
     int md;
     const char *data;
     const char *expect;
   } algos[] =
     {
       { GCRY_MD_MD4, "",
 	"\x31\xD6\xCF\xE0\xD1\x6A\xE9\x31\xB7\x3C\x59\xD7\xE0\xC0\x89\xC0" },
       { GCRY_MD_MD4, "a",
 	"\xbd\xe5\x2c\xb3\x1d\xe3\x3e\x46\x24\x5e\x05\xfb\xdb\xd6\xfb\x24" },
       {	GCRY_MD_MD4, "message digest",
 	"\xd9\x13\x0a\x81\x64\x54\x9f\xe8\x18\x87\x48\x06\xe1\xc7\x01\x4b" },
       {	GCRY_MD_MD5, "",
 	"\xD4\x1D\x8C\xD9\x8F\x00\xB2\x04\xE9\x80\x09\x98\xEC\xF8\x42\x7E" },
       {	GCRY_MD_MD5, "a",
 	"\x0C\xC1\x75\xB9\xC0\xF1\xB6\xA8\x31\xC3\x99\xE2\x69\x77\x26\x61" },
       { GCRY_MD_MD5, "abc",
 	"\x90\x01\x50\x98\x3C\xD2\x4F\xB0\xD6\x96\x3F\x7D\x28\xE1\x7F\x72" },
       { GCRY_MD_MD5, "message digest",
 	"\xF9\x6B\x69\x7D\x7C\xB7\x93\x8D\x52\x5A\x2F\x31\xAA\xF1\x61\xD0" },
       { GCRY_MD_SHA1, "abc",
 	"\xA9\x99\x3E\x36\x47\x06\x81\x6A\xBA\x3E"
 	"\x25\x71\x78\x50\xC2\x6C\x9C\xD0\xD8\x9D" },
       {	GCRY_MD_SHA1,
 	"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
 	"\x84\x98\x3E\x44\x1C\x3B\xD2\x6E\xBA\xAE"
 	"\x4A\xA1\xF9\x51\x29\xE5\xE5\x46\x70\xF1" },
       { GCRY_MD_SHA1, "!" /* kludge for "a"*1000000 */ ,
 	"\x34\xAA\x97\x3C\xD4\xC4\xDA\xA4\xF6\x1E"
 	"\xEB\x2B\xDB\xAD\x27\x31\x65\x34\x01\x6F" },
       /* From RFC3874 */
       {	GCRY_MD_SHA224, "abc",
 	"\x23\x09\x7d\x22\x34\x05\xd8\x22\x86\x42\xa4\x77\xbd\xa2\x55\xb3"
 	"\x2a\xad\xbc\xe4\xbd\xa0\xb3\xf7\xe3\x6c\x9d\xa7" },
       {	GCRY_MD_SHA224,
 	"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
 	"\x75\x38\x8b\x16\x51\x27\x76\xcc\x5d\xba\x5d\xa1\xfd\x89\x01\x50"
 	"\xb0\xc6\x45\x5c\xb4\xf5\x8b\x19\x52\x52\x25\x25" },
       {	GCRY_MD_SHA224, "!",
 	"\x20\x79\x46\x55\x98\x0c\x91\xd8\xbb\xb4\xc1\xea\x97\x61\x8a\x4b"
 	"\xf0\x3f\x42\x58\x19\x48\xb2\xee\x4e\xe7\xad\x67" },
       {	GCRY_MD_SHA256, "abc",
 	"\xba\x78\x16\xbf\x8f\x01\xcf\xea\x41\x41\x40\xde\x5d\xae\x22\x23"
 	"\xb0\x03\x61\xa3\x96\x17\x7a\x9c\xb4\x10\xff\x61\xf2\x00\x15\xad" },
       {	GCRY_MD_SHA256,
 	"abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq",
 	"\x24\x8d\x6a\x61\xd2\x06\x38\xb8\xe5\xc0\x26\x93\x0c\x3e\x60\x39"
 	"\xa3\x3c\xe4\x59\x64\xff\x21\x67\xf6\xec\xed\xd4\x19\xdb\x06\xc1" },
       {	GCRY_MD_SHA256, "!",
 	"\xcd\xc7\x6e\x5c\x99\x14\xfb\x92\x81\xa1\xc7\xe2\x84\xd7\x3e\x67"
 	"\xf1\x80\x9a\x48\xa4\x97\x20\x0e\x04\x6d\x39\xcc\xc7\x11\x2c\xd0" },
       {	GCRY_MD_SHA384, "abc",
 	"\xcb\x00\x75\x3f\x45\xa3\x5e\x8b\xb5\xa0\x3d\x69\x9a\xc6\x50\x07"
 	"\x27\x2c\x32\xab\x0e\xde\xd1\x63\x1a\x8b\x60\x5a\x43\xff\x5b\xed"
 	"\x80\x86\x07\x2b\xa1\xe7\xcc\x23\x58\xba\xec\xa1\x34\xc8\x25\xa7" },
       {	GCRY_MD_SHA512, "abc",
 	"\xDD\xAF\x35\xA1\x93\x61\x7A\xBA\xCC\x41\x73\x49\xAE\x20\x41\x31"
 	"\x12\xE6\xFA\x4E\x89\xA9\x7E\xA2\x0A\x9E\xEE\xE6\x4B\x55\xD3\x9A"
 	"\x21\x92\x99\x2A\x27\x4F\xC1\xA8\x36\xBA\x3C\x23\xA3\xFE\xEB\xBD"
 	"\x45\x4D\x44\x23\x64\x3C\xE8\x0E\x2A\x9A\xC9\x4F\xA5\x4C\xA4\x9F" },
       {	GCRY_MD_RMD160, "",
 	"\x9c\x11\x85\xa5\xc5\xe9\xfc\x54\x61\x28"
 	"\x08\x97\x7e\xe8\xf5\x48\xb2\x25\x8d\x31" },
       {	GCRY_MD_RMD160, "a",
 	"\x0b\xdc\x9d\x2d\x25\x6b\x3e\xe9\xda\xae"
 	"\x34\x7b\xe6\xf4\xdc\x83\x5a\x46\x7f\xfe" },
       {	GCRY_MD_RMD160, "abc",
 	"\x8e\xb2\x08\xf7\xe0\x5d\x98\x7a\x9b\x04"
 	"\x4a\x8e\x98\xc6\xb0\x87\xf1\x5a\x0b\xfc" },
       {	GCRY_MD_RMD160, "message digest",
 	"\x5d\x06\x89\xef\x49\xd2\xfa\xe5\x72\xb8"
 	"\x81\xb1\x23\xa8\x5f\xfa\x21\x59\x5f\x36" },
       {	GCRY_MD_CRC32, "", "\x00\x00\x00\x00" },
       {	GCRY_MD_CRC32, "foo", "\x8c\x73\x65\x21" },
       { GCRY_MD_CRC32_RFC1510, "", "\x00\x00\x00\x00" },
       {	GCRY_MD_CRC32_RFC1510, "foo", "\x73\x32\xbc\x33" },
       {	GCRY_MD_CRC32_RFC1510, "test0123456789", "\xb8\x3e\x88\xd6" },
       {	GCRY_MD_CRC32_RFC1510, "MASSACHVSETTS INSTITVTE OF TECHNOLOGY",
 	"\xe3\x41\x80\xf7" },
 #if 0
       {	GCRY_MD_CRC32_RFC1510, "\x80\x00", "\x3b\x83\x98\x4b" },
       {	GCRY_MD_CRC32_RFC1510, "\x00\x08", "\x0e\xdb\x88\x32" },
       {	GCRY_MD_CRC32_RFC1510, "\x00\x80", "\xed\xb8\x83\x20" },
 #endif
       {	GCRY_MD_CRC32_RFC1510, "\x80", "\xed\xb8\x83\x20" },
 #if 0
       {	GCRY_MD_CRC32_RFC1510, "\x80\x00\x00\x00", "\xed\x59\xb6\x3b" },
       {	GCRY_MD_CRC32_RFC1510, "\x00\x00\x00\x01", "\x77\x07\x30\x96" },
 #endif
       {	GCRY_MD_CRC24_RFC2440, "", "\xb7\x04\xce" },
       {	GCRY_MD_CRC24_RFC2440, "foo", "\x4f\xc2\x55" },
       {	GCRY_MD_TIGER, "",
 	"\x24\xF0\x13\x0C\x63\xAC\x93\x32\x16\x16\x6E\x76"
 	"\xB1\xBB\x92\x5F\xF3\x73\xDE\x2D\x49\x58\x4E\x7A" },
       {	GCRY_MD_TIGER, "abc",
 	"\xF2\x58\xC1\xE8\x84\x14\xAB\x2A\x52\x7A\xB5\x41"
 	"\xFF\xC5\xB8\xBF\x93\x5F\x7B\x95\x1C\x13\x29\x51" },
       {	GCRY_MD_TIGER, "Tiger",
 	"\x9F\x00\xF5\x99\x07\x23\x00\xDD\x27\x6A\xBB\x38"
 	"\xC8\xEB\x6D\xEC\x37\x79\x0C\x11\x6F\x9D\x2B\xDF" },
       {	GCRY_MD_TIGER, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefg"
 	"hijklmnopqrstuvwxyz0123456789+-",
 	"\x87\xFB\x2A\x90\x83\x85\x1C\xF7\x47\x0D\x2C\xF8"
 	"\x10\xE6\xDF\x9E\xB5\x86\x44\x50\x34\xA5\xA3\x86" },
       {	GCRY_MD_TIGER, "ABCDEFGHIJKLMNOPQRSTUVWXYZ=abcdef"
 	"ghijklmnopqrstuvwxyz+0123456789",
 	"\x46\x7D\xB8\x08\x63\xEB\xCE\x48\x8D\xF1\xCD\x12"
 	"\x61\x65\x5D\xE9\x57\x89\x65\x65\x97\x5F\x91\x97" },
       {	GCRY_MD_TIGER, "Tiger - A Fast New Hash Function, "
 	"by Ross Anderson and Eli Biham",
 	"\x0C\x41\x0A\x04\x29\x68\x86\x8A\x16\x71\xDA\x5A"
 	"\x3F\xD2\x9A\x72\x5E\xC1\xE4\x57\xD3\xCD\xB3\x03" },
       {	GCRY_MD_TIGER, "Tiger - A Fast New Hash Function, "
 	"by Ross Anderson and Eli Biham, proceedings of Fa"
 	"st Software Encryption 3, Cambridge.",
 	"\xEB\xF5\x91\xD5\xAF\xA6\x55\xCE\x7F\x22\x89\x4F"
 	"\xF8\x7F\x54\xAC\x89\xC8\x11\xB6\xB0\xDA\x31\x93" },
       {	GCRY_MD_TIGER, "Tiger - A Fast New Hash Function, "
 	"by Ross Anderson and Eli Biham, proceedings of Fa"
 	"st Software Encryption 3, Cambridge, 1996.",
 	"\x3D\x9A\xEB\x03\xD1\xBD\x1A\x63\x57\xB2\x77\x4D"
 	"\xFD\x6D\x5B\x24\xDD\x68\x15\x1D\x50\x39\x74\xFC" },
       {	GCRY_MD_TIGER, "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefgh"
 	"ijklmnopqrstuvwxyz0123456789+-ABCDEFGHIJKLMNOPQRS"
 	"TUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-",
 	"\x00\xB8\x3E\xB4\xE5\x34\x40\xC5\x76\xAC\x6A\xAE"
 	"\xE0\xA7\x48\x58\x25\xFD\x15\xE7\x0A\x59\xFF\xE4" },
       { GCRY_MD_WHIRLPOOL, "",
 	"\x19\xFA\x61\xD7\x55\x22\xA4\x66\x9B\x44\xE3\x9C\x1D\x2E\x17\x26"
 	"\xC5\x30\x23\x21\x30\xD4\x07\xF8\x9A\xFE\xE0\x96\x49\x97\xF7\xA7"
 	"\x3E\x83\xBE\x69\x8B\x28\x8F\xEB\xCF\x88\xE3\xE0\x3C\x4F\x07\x57"
 	"\xEA\x89\x64\xE5\x9B\x63\xD9\x37\x08\xB1\x38\xCC\x42\xA6\x6E\xB3" },
       { GCRY_MD_WHIRLPOOL, "a",
 	"\x8A\xCA\x26\x02\x79\x2A\xEC\x6F\x11\xA6\x72\x06\x53\x1F\xB7\xD7"
 	"\xF0\xDF\xF5\x94\x13\x14\x5E\x69\x73\xC4\x50\x01\xD0\x08\x7B\x42"
 	"\xD1\x1B\xC6\x45\x41\x3A\xEF\xF6\x3A\x42\x39\x1A\x39\x14\x5A\x59"
 	"\x1A\x92\x20\x0D\x56\x01\x95\xE5\x3B\x47\x85\x84\xFD\xAE\x23\x1A" },
       { GCRY_MD_WHIRLPOOL, "a",
 	"\x8A\xCA\x26\x02\x79\x2A\xEC\x6F\x11\xA6\x72\x06\x53\x1F\xB7\xD7"
 	"\xF0\xDF\xF5\x94\x13\x14\x5E\x69\x73\xC4\x50\x01\xD0\x08\x7B\x42"
 	"\xD1\x1B\xC6\x45\x41\x3A\xEF\xF6\x3A\x42\x39\x1A\x39\x14\x5A\x59"
 	"\x1A\x92\x20\x0D\x56\x01\x95\xE5\x3B\x47\x85\x84\xFD\xAE\x23\x1A" },
       { GCRY_MD_WHIRLPOOL,
 	"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789",
 	"\xDC\x37\xE0\x08\xCF\x9E\xE6\x9B\xF1\x1F\x00\xED\x9A\xBA\x26\x90"
 	"\x1D\xD7\xC2\x8C\xDE\xC0\x66\xCC\x6A\xF4\x2E\x40\xF8\x2F\x3A\x1E"
 	"\x08\xEB\xA2\x66\x29\x12\x9D\x8F\xB7\xCB\x57\x21\x1B\x92\x81\xA6"
 	"\x55\x17\xCC\x87\x9D\x7B\x96\x21\x42\xC6\x5F\x5A\x7A\xF0\x14\x67" },
       { GCRY_MD_WHIRLPOOL,
 	"!",
 	"\x0C\x99\x00\x5B\xEB\x57\xEF\xF5\x0A\x7C\xF0\x05\x56\x0D\xDF\x5D"
 	"\x29\x05\x7F\xD8\x6B\x20\xBF\xD6\x2D\xEC\xA0\xF1\xCC\xEA\x4A\xF5"
 	"\x1F\xC1\x54\x90\xED\xDC\x47\xAF\x32\xBB\x2B\x66\xC3\x4F\xF9\xAD"
 	"\x8C\x60\x08\xAD\x67\x7F\x77\x12\x69\x53\xB2\x26\xE4\xED\x8B\x01" },
       {	0 },
     };
   int i;
 
   if (verbose)
     fprintf (stderr, "Starting hash checks.\n");
 
   for (i = 0; algos[i].md; i++)
     {
       if (gcry_md_test_algo (algos[i].md) && in_fips_mode)
         {
           if (verbose)
             fprintf (stderr, "  algorithm %d not available in fips mode\n",
 		     algos[i].md);
           continue;
         }
       if (verbose)
 	fprintf (stderr, "  checking %s [%i] for length %zi\n", 
 		 gcry_md_algo_name (algos[i].md),
 		 algos[i].md,
                  !strcmp (algos[i].data, "!")? 
                  1000000 : strlen(algos[i].data));
 
       check_one_md (algos[i].md, algos[i].data, strlen (algos[i].data),
 		    algos[i].expect);
     }
 
   if (verbose)
     fprintf (stderr, "Completed hash checks.\n");
 }
 
 static void
 check_one_hmac (int algo, const char *data, int datalen, 
 		const char *key, int keylen, const char *expect)
 {
   gcry_md_hd_t hd, hd2;
   unsigned char *p;
   int mdlen;
   int i;
   gcry_error_t err = 0;
 
   err = gcry_md_open (&hd, algo, GCRY_MD_FLAG_HMAC);
   if (err)
     {
       fail ("algo %d, grcy_md_open failed: %s\n", algo, gpg_strerror (err));
       return;
     }
 
   mdlen = gcry_md_get_algo_dlen (algo);
   if (mdlen < 1 || mdlen > 500)
     {
       fail ("algo %d, grcy_md_get_algo_dlen failed: %d\n", algo, mdlen);
       return;
     }
 
   gcry_md_setkey( hd, key, keylen );
 
   gcry_md_write (hd, data, datalen);
 
   err = gcry_md_copy (&hd2, hd);
   if (err)
     {
       fail ("algo %d, gcry_md_copy failed: %s\n", algo, gpg_strerror (err));
     }
 
   gcry_md_close (hd);
 
   p = gcry_md_read (hd2, algo);
   if (0 == p)
     fail("algo %d, hmac gcry_md_read failed\n", algo);
 
   if (memcmp (p, expect, mdlen))
     {
       printf ("computed: ");
       for (i = 0; i < mdlen; i++)
 	printf ("%02x ", p[i] & 0xFF);
       printf ("\nexpected: ");
       for (i = 0; i < mdlen; i++)
 	printf ("%02x ", expect[i] & 0xFF);
       printf ("\n");
 
       fail ("algo %d, digest mismatch\n", algo);
     }
 
   gcry_md_close (hd2);
 }
 
 static void
 check_hmac (void)
 {
   static struct algos
   {
     int md;
     const char *data;
     const char *key;
     const char *expect;
   } algos[] =
     {
       { GCRY_MD_MD5, "what do ya want for nothing?", "Jefe",
 	"\x75\x0c\x78\x3e\x6a\xb0\xb5\x03\xea\xa8\x6e\x31\x0a\x5d\xb7\x38" },
       { GCRY_MD_MD5,
 	"Hi There",
 	"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b",
 	"\x92\x94\x72\x7a\x36\x38\xbb\x1c\x13\xf4\x8e\xf8\x15\x8b\xfc\x9d" },
       { GCRY_MD_MD5,
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd",
 	"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
 	"\x56\xbe\x34\x52\x1d\x14\x4c\x88\xdb\xb8\xc7\x33\xf0\xe8\xb3\xf6" },
       { GCRY_MD_MD5,
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd",
 	"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
 	"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19",
 	"\x69\x7e\xaf\x0a\xca\x3a\x3a\xea\x3a\x75\x16\x47\x46\xff\xaa\x79" },
       { GCRY_MD_MD5, "Test With Truncation",
 	"\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c",
 	"\x56\x46\x1e\xf2\x34\x2e\xdc\x00\xf9\xba\xb9\x95\x69\x0e\xfd\x4c" },
       { GCRY_MD_MD5, "Test Using Larger Than Block-Size Key - Hash Key First",
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa",
 	"\x6b\x1a\xb7\xfe\x4b\xd7\xbf\x8f\x0b\x62\xe6\xce\x61\xb9\xd0\xcd" },
       { GCRY_MD_MD5,
 	"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data",
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa",
 	"\x6f\x63\x0f\xad\x67\xcd\xa0\xee\x1f\xb1\xf5\x62\xdb\x3a\xa5\x3e", },
       { GCRY_MD_SHA256, "what do ya want for nothing?", "Jefe",
 	"\x5b\xdc\xc1\x46\xbf\x60\x75\x4e\x6a\x04\x24\x26\x08\x95\x75\xc7\x5a"
 	"\x00\x3f\x08\x9d\x27\x39\x83\x9d\xec\x58\xb9\x64\xec\x38\x43" },
       { GCRY_MD_SHA256,
 	"Hi There",
 	"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
 	"\x0b\x0b\x0b",
 	"\xb0\x34\x4c\x61\xd8\xdb\x38\x53\x5c\xa8\xaf\xce\xaf\x0b\xf1\x2b\x88"
 	"\x1d\xc2\x00\xc9\x83\x3d\xa7\x26\xe9\x37\x6c\x2e\x32\xcf\xf7" },
       { GCRY_MD_SHA256,
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd",
 	"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
 	"\xAA\xAA\xAA\xAA",
 	"\x77\x3e\xa9\x1e\x36\x80\x0e\x46\x85\x4d\xb8\xeb\xd0\x91\x81\xa7"
 	"\x29\x59\x09\x8b\x3e\xf8\xc1\x22\xd9\x63\x55\x14\xce\xd5\x65\xfe" },
       { GCRY_MD_SHA256,
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd",
 	"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
 	"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19",
 	"\x82\x55\x8a\x38\x9a\x44\x3c\x0e\xa4\xcc\x81\x98\x99\xf2\x08"
 	"\x3a\x85\xf0\xfa\xa3\xe5\x78\xf8\x07\x7a\x2e\x3f\xf4\x67\x29\x66\x5b" },
       { GCRY_MD_SHA256, 
 	"Test Using Larger Than Block-Size Key - Hash Key First",
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa",
 	"\x60\xe4\x31\x59\x1e\xe0\xb6\x7f\x0d\x8a\x26\xaa\xcb\xf5\xb7\x7f"
 	"\x8e\x0b\xc6\x21\x37\x28\xc5\x14\x05\x46\x04\x0f\x0e\xe3\x7f\x54" },
       { GCRY_MD_SHA256, 
 	"This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.",
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa",
 	"\x9b\x09\xff\xa7\x1b\x94\x2f\xcb\x27\x63\x5f\xbc\xd5\xb0\xe9\x44"
 	"\xbf\xdc\x63\x64\x4f\x07\x13\x93\x8a\x7f\x51\x53\x5c\x3a\x35\xe2" },
       { GCRY_MD_SHA224, "what do ya want for nothing?", "Jefe",
 	"\xa3\x0e\x01\x09\x8b\xc6\xdb\xbf\x45\x69\x0f\x3a\x7e\x9e\x6d\x0f"
 	"\x8b\xbe\xa2\xa3\x9e\x61\x48\x00\x8f\xd0\x5e\x44" },
       { GCRY_MD_SHA224,
 	"Hi There",
 	"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
 	"\x0b\x0b\x0b",
 	"\x89\x6f\xb1\x12\x8a\xbb\xdf\x19\x68\x32\x10\x7c\xd4\x9d\xf3\x3f\x47"
 	"\xb4\xb1\x16\x99\x12\xba\x4f\x53\x68\x4b\x22" },
       { GCRY_MD_SHA224,
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd",
 	"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
 	"\xAA\xAA\xAA\xAA",
 	"\x7f\xb3\xcb\x35\x88\xc6\xc1\xf6\xff\xa9\x69\x4d\x7d\x6a\xd2\x64"
 	"\x93\x65\xb0\xc1\xf6\x5d\x69\xd1\xec\x83\x33\xea" },
       { GCRY_MD_SHA224,
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd",
 	"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
 	"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19",
 	"\x6c\x11\x50\x68\x74\x01\x3c\xac\x6a\x2a\xbc\x1b\xb3\x82\x62"
 	"\x7c\xec\x6a\x90\xd8\x6e\xfc\x01\x2d\xe7\xaf\xec\x5a" },
       { GCRY_MD_SHA224, 
 	"Test Using Larger Than Block-Size Key - Hash Key First",
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa",
 	"\x95\xe9\xa0\xdb\x96\x20\x95\xad\xae\xbe\x9b\x2d\x6f\x0d\xbc\xe2"
 	"\xd4\x99\xf1\x12\xf2\xd2\xb7\x27\x3f\xa6\x87\x0e" },
       { GCRY_MD_SHA224, 
 	"This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.",
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa",
 	"\x3a\x85\x41\x66\xac\x5d\x9f\x02\x3f\x54\xd5\x17\xd0\xb3\x9d\xbd"
 	"\x94\x67\x70\xdb\x9c\x2b\x95\xc9\xf6\xf5\x65\xd1" },
       { GCRY_MD_SHA384, "what do ya want for nothing?", "Jefe",
 	"\xaf\x45\xd2\xe3\x76\x48\x40\x31\x61\x7f\x78\xd2\xb5\x8a\x6b\x1b"
 	"\x9c\x7e\xf4\x64\xf5\xa0\x1b\x47\xe4\x2e\xc3\x73\x63\x22\x44\x5e"
 	"\x8e\x22\x40\xca\x5e\x69\xe2\xc7\x8b\x32\x39\xec\xfa\xb2\x16\x49" },
       { GCRY_MD_SHA384,
 	"Hi There",
 	"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
 	"\x0b\x0b\x0b",
 	"\xaf\xd0\x39\x44\xd8\x48\x95\x62\x6b\x08\x25\xf4\xab\x46\x90\x7f\x15"
 	"\xf9\xda\xdb\xe4\x10\x1e\xc6\x82\xaa\x03\x4c\x7c\xeb\xc5\x9c\xfa\xea"
 	"\x9e\xa9\x07\x6e\xde\x7f\x4a\xf1\x52\xe8\xb2\xfa\x9c\xb6" },
       { GCRY_MD_SHA384,
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd",
 	"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
 	"\xAA\xAA\xAA\xAA",
 	"\x88\x06\x26\x08\xd3\xe6\xad\x8a\x0a\xa2\xac\xe0\x14\xc8\xa8\x6f"
 	"\x0a\xa6\x35\xd9\x47\xac\x9f\xeb\xe8\x3e\xf4\xe5\x59\x66\x14\x4b"
 	"\x2a\x5a\xb3\x9d\xc1\x38\x14\xb9\x4e\x3a\xb6\xe1\x01\xa3\x4f\x27" },
       { GCRY_MD_SHA384,
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd",
 	"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
 	"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19",
 	"\x3e\x8a\x69\xb7\x78\x3c\x25\x85\x19\x33\xab\x62\x90\xaf\x6c\xa7"
 	"\x7a\x99\x81\x48\x08\x50\x00\x9c\xc5\x57\x7c\x6e\x1f\x57\x3b\x4e"
 	"\x68\x01\xdd\x23\xc4\xa7\xd6\x79\xcc\xf8\xa3\x86\xc6\x74\xcf\xfb" },
       { GCRY_MD_SHA384, 
 	"Test Using Larger Than Block-Size Key - Hash Key First",
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa",
 	"\x4e\xce\x08\x44\x85\x81\x3e\x90\x88\xd2\xc6\x3a\x04\x1b\xc5\xb4"
 	"\x4f\x9e\xf1\x01\x2a\x2b\x58\x8f\x3c\xd1\x1f\x05\x03\x3a\xc4\xc6"
 	"\x0c\x2e\xf6\xab\x40\x30\xfe\x82\x96\x24\x8d\xf1\x63\xf4\x49\x52" },
       { GCRY_MD_SHA384, 
 	"This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.",
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa",
 	"\x66\x17\x17\x8e\x94\x1f\x02\x0d\x35\x1e\x2f\x25\x4e\x8f\xd3\x2c"
 	"\x60\x24\x20\xfe\xb0\xb8\xfb\x9a\xdc\xce\xbb\x82\x46\x1e\x99\xc5"
 	"\xa6\x78\xcc\x31\xe7\x99\x17\x6d\x38\x60\xe6\x11\x0c\x46\x52\x3e" },
       { GCRY_MD_SHA512, "what do ya want for nothing?", "Jefe",
 	"\x16\x4b\x7a\x7b\xfc\xf8\x19\xe2\xe3\x95\xfb\xe7\x3b\x56\xe0\xa3"
 	"\x87\xbd\x64\x22\x2e\x83\x1f\xd6\x10\x27\x0c\xd7\xea\x25\x05\x54"
 	"\x97\x58\xbf\x75\xc0\x5a\x99\x4a\x6d\x03\x4f\x65\xf8\xf0\xe6\xfd"
 	"\xca\xea\xb1\xa3\x4d\x4a\x6b\x4b\x63\x6e\x07\x0a\x38\xbc\xe7\x37" },
       { GCRY_MD_SHA512,
 	"Hi There",
 	"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"
 	"\x0b\x0b\x0b",
 	"\x87\xaa\x7c\xde\xa5\xef\x61\x9d\x4f\xf0\xb4\x24\x1a\x1d\x6c\xb0"
 	"\x23\x79\xf4\xe2\xce\x4e\xc2\x78\x7a\xd0\xb3\x05\x45\xe1\x7c\xde"
 	"\xda\xa8\x33\xb7\xd6\xb8\xa7\x02\x03\x8b\x27\x4e\xae\xa3\xf4\xe4"
 	"\xbe\x9d\x91\x4e\xeb\x61\xf1\x70\x2e\x69\x6c\x20\x3a\x12\x68\x54" },
       { GCRY_MD_SHA512,
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd"
 	"\xdd\xdd\xdd\xdd\xdd",
 	"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA"
 	"\xAA\xAA\xAA\xAA",
 	"\xfa\x73\xb0\x08\x9d\x56\xa2\x84\xef\xb0\xf0\x75\x6c\x89\x0b\xe9"
 	"\xb1\xb5\xdb\xdd\x8e\xe8\x1a\x36\x55\xf8\x3e\x33\xb2\x27\x9d\x39"
 	"\xbf\x3e\x84\x82\x79\xa7\x22\xc8\x06\xb4\x85\xa4\x7e\x67\xc8\x07"
 	"\xb9\x46\xa3\x37\xbe\xe8\x94\x26\x74\x27\x88\x59\xe1\x32\x92\xfb"  },
       { GCRY_MD_SHA512,
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd"
 	"\xcd\xcd\xcd\xcd\xcd",
 	"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
 	"\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19",
 	"\xb0\xba\x46\x56\x37\x45\x8c\x69\x90\xe5\xa8\xc5\xf6\x1d\x4a\xf7"
 	"\xe5\x76\xd9\x7f\xf9\x4b\x87\x2d\xe7\x6f\x80\x50\x36\x1e\xe3\xdb"
 	"\xa9\x1c\xa5\xc1\x1a\xa2\x5e\xb4\xd6\x79\x27\x5c\xc5\x78\x80\x63"
 	"\xa5\xf1\x97\x41\x12\x0c\x4f\x2d\xe2\xad\xeb\xeb\x10\xa2\x98\xdd" },
       { GCRY_MD_SHA512, 
 	"Test Using Larger Than Block-Size Key - Hash Key First",
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa",
 	"\x80\xb2\x42\x63\xc7\xc1\xa3\xeb\xb7\x14\x93\xc1\xdd\x7b\xe8\xb4"
 	"\x9b\x46\xd1\xf4\x1b\x4a\xee\xc1\x12\x1b\x01\x37\x83\xf8\xf3\x52"
 	"\x6b\x56\xd0\x37\xe0\x5f\x25\x98\xbd\x0f\xd2\x21\x5d\x6a\x1e\x52"
 	"\x95\xe6\x4f\x73\xf6\x3f\x0a\xec\x8b\x91\x5a\x98\x5d\x78\x65\x98" },
       { GCRY_MD_SHA512, 
 	"This is a test using a larger than block-size key and a larger than block-size data. The key needs to be hashed before being used by the HMAC algorithm.",
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa"
 	"\xaa\xaa\xaa",
 	"\xe3\x7b\x6a\x77\x5d\xc8\x7d\xba\xa4\xdf\xa9\xf9\x6e\x5e\x3f\xfd"
 	"\xde\xbd\x71\xf8\x86\x72\x89\x86\x5d\xf5\xa3\x2d\x20\xcd\xc9\x44"
 	"\xb6\x02\x2c\xac\x3c\x49\x82\xb1\x0d\x5e\xeb\x55\xc3\xe4\xde\x15"
 	"\x13\x46\x76\xfb\x6d\xe0\x44\x60\x65\xc9\x74\x40\xfa\x8c\x6a\x58" },
       {	0 },
     };
   int i;
 
   if (verbose)
     fprintf (stderr, "Starting hashed MAC checks.\n");
 
   for (i = 0; algos[i].md; i++)
     {
       if (gcry_md_test_algo (algos[i].md) && in_fips_mode)
         {
           if (verbose)
             fprintf (stderr, "  algorithm %d not available in fips mode\n",
 		     algos[i].md);
           continue;
         }
       if (verbose)
 	fprintf (stderr, "  checking %s [%i] for length %zi\n", 
 		 gcry_md_algo_name (algos[i].md),
 		 algos[i].md,
 		 strlen(algos[i].data));
 
       check_one_hmac (algos[i].md, algos[i].data, strlen (algos[i].data),
 		      algos[i].key, strlen(algos[i].key),
 		      algos[i].expect);
     }
 
   if (verbose)
     fprintf (stderr, "Completed hashed MAC checks.\n");
  }
 
 /* Check that the signature SIG matches the hash HASH. PKEY is the
    public key used for the verification. BADHASH is a hasvalue which
    should; result in a bad signature status. */
 static void
 verify_one_signature (gcry_sexp_t pkey, gcry_sexp_t hash,
 		      gcry_sexp_t badhash, gcry_sexp_t sig)
 {
   gcry_error_t rc;
 
   rc = gcry_pk_verify (sig, hash, pkey);
   if (rc)
     fail ("gcry_pk_verify failed: %s\n", gpg_strerror (rc));
   rc = gcry_pk_verify (sig, badhash, pkey);
   if (gcry_err_code (rc) != GPG_ERR_BAD_SIGNATURE)
     fail ("gcry_pk_verify failed to detect a bad signature: %s\n",
 	  gpg_strerror (rc));
 }
 
 
 /* Test the public key sign function using the private ket SKEY. PKEY
    is used for verification. */
 static void
 check_pubkey_sign (int n, gcry_sexp_t skey, gcry_sexp_t pkey)
 {
   gcry_error_t rc;
   gcry_sexp_t sig, badhash, hash;
   int dataidx;
   static const char baddata[] =
     "(data\n (flags pkcs1)\n"
     " (hash sha1 #11223344556677889900AABBCCDDEEFF10203041#))\n";
   static struct
   {
     const char *data;
     int expected_rc;
   } datas[] =
     {
       { "(data\n (flags pkcs1)\n"
 	" (hash sha1 #11223344556677889900AABBCCDDEEFF10203040#))\n",
 	0 },
       /* This test is to see whether hash algorithms not hard wired in
          pubkey.c are detected:  */
       { "(data\n (flags pkcs1)\n"
 	" (hash oid.1.3.14.3.2.29 "
         "       #11223344556677889900AABBCCDDEEFF10203040#))\n",
 	0 },
       {	"(data\n (flags )\n"
 	" (hash sha1 #11223344556677889900AABBCCDDEEFF10203040#))\n",
 	GPG_ERR_CONFLICT },
       {	"(data\n (flags pkcs1)\n"
 	" (hash foo #11223344556677889900AABBCCDDEEFF10203040#))\n",
 	GPG_ERR_DIGEST_ALGO },
       {	"(data\n (flags )\n" " (value #11223344556677889900AA#))\n",
 	0 },
       {	"(data\n (flags )\n" " (value #0090223344556677889900AA#))\n",
 	0 },
       { "(data\n (flags raw)\n" " (value #11223344556677889900AA#))\n",
 	0 },
       {	"(data\n (flags pkcs1)\n"
 	" (value #11223344556677889900AA#))\n",
 	GPG_ERR_CONFLICT },
       { "(data\n (flags raw foo)\n"
 	" (value #11223344556677889900AA#))\n",
 	GPG_ERR_INV_FLAG },
       { NULL }
     };
 
   (void)n;
 
   rc = gcry_sexp_sscan (&badhash, NULL, baddata, strlen (baddata));
   if (rc)
     die ("converting data failed: %s\n", gpg_strerror (rc));
 
   for (dataidx = 0; datas[dataidx].data; dataidx++)
     {
       if (verbose)
 	fprintf (stderr, "  signature test %d\n", dataidx);
 
       rc = gcry_sexp_sscan (&hash, NULL, datas[dataidx].data,
 			    strlen (datas[dataidx].data));
       if (rc)
 	die ("converting data failed: %s\n", gpg_strerror (rc));
 
       rc = gcry_pk_sign (&sig, hash, skey);
       if (gcry_err_code (rc) != datas[dataidx].expected_rc)
 	fail ("gcry_pk_sign failed: %s\n", gpg_strerror (rc));
 
       if (!rc)
 	verify_one_signature (pkey, hash, badhash, sig);
 
       gcry_sexp_release (sig);
       sig = NULL;
       gcry_sexp_release (hash);
       hash = NULL;
     }
 
   gcry_sexp_release (badhash);
 }
 
 static void
 check_pubkey_grip (int n, const unsigned char *grip,
 		   gcry_sexp_t skey, gcry_sexp_t pkey)
 {
   unsigned char sgrip[20], pgrip[20];
 
   if (!gcry_pk_get_keygrip (skey, sgrip))
     die ("get keygrip for private RSA key failed\n");
   if (!gcry_pk_get_keygrip (pkey, pgrip))
     die ("[%i] get keygrip for public RSA key failed\n", n);
   if (memcmp (sgrip, pgrip, 20))
     fail ("[%i] keygrips don't match\n", n);
   if (memcmp (sgrip, grip, 20))
     fail ("wrong keygrip for RSA key\n");
 }
 
 static void
 do_check_one_pubkey (int n, gcry_sexp_t skey, gcry_sexp_t pkey,
 		     const unsigned char *grip, int flags)
 {
  if (flags & FLAG_SIGN)
     check_pubkey_sign (n, skey, pkey);
  if (grip && (flags & FLAG_GRIP))
    check_pubkey_grip (n, grip, skey, pkey);
 }
 
 static void
 check_one_pubkey (int n, test_spec_pubkey_t spec)
 {
   gcry_error_t err = GPG_ERR_NO_ERROR;
   gcry_sexp_t skey, pkey;
 
   err = gcry_sexp_sscan (&skey, NULL, spec.key.secret,
 			 strlen (spec.key.secret));
   if (!err)
     err = gcry_sexp_sscan (&pkey, NULL, spec.key.public,
 			   strlen (spec.key.public));
   if (err)
     die ("converting sample key failed: %s\n", gpg_strerror (err));
 
   do_check_one_pubkey (n, skey, pkey,
                        (const unsigned char*)spec.key.grip, spec.flags);
  
   gcry_sexp_release (skey);
   gcry_sexp_release (pkey);
 }
 
 static void
 get_keys_new (gcry_sexp_t *pkey, gcry_sexp_t *skey)
 {
   gcry_sexp_t key_spec, key, pub_key, sec_key;
   int rc;
   if (verbose)
     fprintf (stderr, "  generating RSA key:");  
   rc = gcry_sexp_new (&key_spec,
 		      in_fips_mode ? "(genkey (rsa (nbits 4:1024)))"
                       : "(genkey (rsa (nbits 4:1024)(transient-key)))", 
                       0, 1);
   if (rc)
     die ("error creating S-expression: %s\n", gpg_strerror (rc));
   rc = gcry_pk_genkey (&key, key_spec);
   gcry_sexp_release (key_spec);
   if (rc)
     die ("error generating RSA key: %s\n", gpg_strerror (rc));
     
   pub_key = gcry_sexp_find_token (key, "public-key", 0);
   if (! pub_key)
     die ("public part missing in key\n");
 
   sec_key = gcry_sexp_find_token (key, "private-key", 0);
   if (! sec_key)
     die ("private part missing in key\n");
 
   gcry_sexp_release (key);
   *pkey = pub_key;
   *skey = sec_key;
 }
 
 static void
 check_one_pubkey_new (int n)
 {
   gcry_sexp_t skey, pkey;
 
   get_keys_new (&pkey, &skey);
   do_check_one_pubkey (n, skey, pkey, NULL, FLAG_SIGN | FLAG_CRYPT);
 }
 
 /* Run all tests for the public key functions. */
 static void
 check_pubkey (void)
 {
   test_spec_pubkey_t pubkeys[] =
     {
       {
 	GCRY_PK_RSA, FLAG_CRYPT | FLAG_SIGN,
 
 	{ "(private-key\n"
 	  " (rsa\n"
 	  "  (n #00e0ce96f90b6c9e02f3922beada93fe50a875eac6bcc18bb9a9cf2e84965caa"
 	  "      2d1ff95a7f542465c6c0c19d276e4526ce048868a7a914fd343cc3a87dd74291"
 	  "      ffc565506d5bbb25cbac6a0e2dd1f8bcaab0d4a29c2f37c950f363484bf269f7"
 	  "      891440464baf79827e03a36e70b814938eebdc63e964247be75dc58b014b7ea251#)\n"
 	  "  (e #010001#)\n"
 	  "  (d #046129F2489D71579BE0A75FE029BD6CDB574EBF57EA8A5B0FDA942CAB943B11"
 	  "      7D7BB95E5D28875E0F9FC5FCC06A72F6D502464DABDED78EF6B716177B83D5BD"
 	  "      C543DC5D3FED932E59F5897E92E6F58A0F33424106A3B6FA2CBF877510E4AC21"
 	  "      C3EE47851E97D12996222AC3566D4CCB0B83D164074ABF7DE655FC2446DA1781#)\n"
 	  "  (p #00e861b700e17e8afe6837e7512e35b6ca11d0ae47d8b85161c67baf64377213"
 	  "      fe52d772f2035b3ca830af41d8a4120e1c1c70d12cc22f00d28d31dd48a8d424f1#)\n"
 	  "  (q #00f7a7ca5367c661f8e62df34f0d05c10c88e5492348dd7bddc942c9a8f369f9"
 	  "      35a07785d2db805215ed786e4285df1658eed3ce84f469b81b50d358407b4ad361#)\n"
 	  "  (u #304559a9ead56d2309d203811a641bb1a09626bc8eb36fffa23c968ec5bd891e"
 	  "      ebbafc73ae666e01ba7c8990bae06cc2bbe10b75e69fcacb353a6473079d8e9b#)))\n",
 
 	  "(public-key\n"
 	  " (rsa\n"
 	  "  (n #00e0ce96f90b6c9e02f3922beada93fe50a875eac6bcc18bb9a9cf2e84965caa"
 	  "      2d1ff95a7f542465c6c0c19d276e4526ce048868a7a914fd343cc3a87dd74291"
 	  "      ffc565506d5bbb25cbac6a0e2dd1f8bcaab0d4a29c2f37c950f363484bf269f7"
 	  "      891440464baf79827e03a36e70b814938eebdc63e964247be75dc58b014b7ea251#)\n"
 	  "  (e #010001#)))\n",
 
 	  "\x32\x10\x0c\x27\x17\x3e\xf6\xe9\xc4\xe9"
 	  "\xa2\x5d\x3d\x69\xf8\x6d\x37\xa4\xf9\x39"}
       },
       {
 	GCRY_PK_DSA, FLAG_SIGN,
 
 	{ "(private-key\n"
 	  " (DSA\n"
 	  "  (p #00AD7C0025BA1A15F775F3F2D673718391D00456978D347B33D7B49E7F32EDAB"
 	  "      96273899DD8B2BB46CD6ECA263FAF04A28903503D59062A8865D2AE8ADFB5191"
 	  "      CF36FFB562D0E2F5809801A1F675DAE59698A9E01EFE8D7DCFCA084F4C6F5A44"
 	  "      44D499A06FFAEA5E8EF5E01F2FD20A7B7EF3F6968AFBA1FB8D91F1559D52D8777B#)\n"
 	  "  (q #00EB7B5751D25EBBB7BD59D920315FD840E19AEBF9#)\n"
 	  "  (g #1574363387FDFD1DDF38F4FBE135BB20C7EE4772FB94C337AF86EA8E49666503"
 	  "      AE04B6BE81A2F8DD095311E0217ACA698A11E6C5D33CCDAE71498ED35D13991E"
 	  "      B02F09AB40BD8F4C5ED8C75DA779D0AE104BC34C960B002377068AB4B5A1F984"
 	  "      3FBA91F537F1B7CAC4D8DD6D89B0D863AF7025D549F9C765D2FC07EE208F8D15#)\n"
 	  "  (y #64B11EF8871BE4AB572AA810D5D3CA11A6CDBC637A8014602C72960DB135BF46"
 	  "      A1816A724C34F87330FC9E187C5D66897A04535CC2AC9164A7150ABFA8179827"
 	  "      6E45831AB811EEE848EBB24D9F5F2883B6E5DDC4C659DEF944DCFD80BF4D0A20"
 	  "      42CAA7DC289F0C5A9D155F02D3D551DB741A81695B74D4C8F477F9C7838EB0FB#)\n"
 	  "  (x #11D54E4ADBD3034160F2CED4B7CD292A4EBF3EC0#)))\n",
 
 	  "(public-key\n"
 	  " (DSA\n"
 	  "  (p #00AD7C0025BA1A15F775F3F2D673718391D00456978D347B33D7B49E7F32EDAB"
 	  "      96273899DD8B2BB46CD6ECA263FAF04A28903503D59062A8865D2AE8ADFB5191"
 	  "      CF36FFB562D0E2F5809801A1F675DAE59698A9E01EFE8D7DCFCA084F4C6F5A44"
 	  "      44D499A06FFAEA5E8EF5E01F2FD20A7B7EF3F6968AFBA1FB8D91F1559D52D8777B#)\n"
 	  "  (q #00EB7B5751D25EBBB7BD59D920315FD840E19AEBF9#)\n"
 	  "  (g #1574363387FDFD1DDF38F4FBE135BB20C7EE4772FB94C337AF86EA8E49666503"
 	  "      AE04B6BE81A2F8DD095311E0217ACA698A11E6C5D33CCDAE71498ED35D13991E"
 	  "      B02F09AB40BD8F4C5ED8C75DA779D0AE104BC34C960B002377068AB4B5A1F984"
 	  "      3FBA91F537F1B7CAC4D8DD6D89B0D863AF7025D549F9C765D2FC07EE208F8D15#)\n"
 	  "  (y #64B11EF8871BE4AB572AA810D5D3CA11A6CDBC637A8014602C72960DB135BF46"
 	  "      A1816A724C34F87330FC9E187C5D66897A04535CC2AC9164A7150ABFA8179827"
 	  "      6E45831AB811EEE848EBB24D9F5F2883B6E5DDC4C659DEF944DCFD80BF4D0A20"
 	  "      42CAA7DC289F0C5A9D155F02D3D551DB741A81695B74D4C8F477F9C7838EB0FB#)))\n",
 
 	  "\xc6\x39\x83\x1a\x43\xe5\x05\x5d\xc6\xd8"
 	  "\x4a\xa6\xf9\xeb\x23\xbf\xa9\x12\x2d\x5b" }
       },
       {
 	GCRY_PK_ELG, FLAG_SIGN | FLAG_CRYPT,
 
 	{ "(private-key\n"
 	  " (ELG\n"
 	  "  (p #00B93B93386375F06C2D38560F3B9C6D6D7B7506B20C1773F73F8DE56E6CD65D"
 	  "      F48DFAAA1E93F57A2789B168362A0F787320499F0B2461D3A4268757A7B27517"
 	  "      B7D203654A0CD484DEC6AF60C85FEB84AAC382EAF2047061FE5DAB81A20A0797"
 	  "      6E87359889BAE3B3600ED718BE61D4FC993CC8098A703DD0DC942E965E8F18D2A7#)\n"
 	  "  (g #05#)\n"
 	  "  (y #72DAB3E83C9F7DD9A931FDECDC6522C0D36A6F0A0FEC955C5AC3C09175BBFF2B"
 	  "      E588DB593DC2E420201BEB3AC17536918417C497AC0F8657855380C1FCF11C5B"
 	  "      D20DB4BEE9BDF916648DE6D6E419FA446C513AAB81C30CB7B34D6007637BE675"
 	  "      56CE6473E9F9EE9B9FADD275D001563336F2186F424DEC6199A0F758F6A00FF4#)\n"
 	  "  (x #03C28900087B38DABF4A0AB98ACEA39BB674D6557096C01D72E31C16BDD32214#)))\n",
 
 	  "(public-key\n"
 	  " (ELG\n"
 	  "  (p #00B93B93386375F06C2D38560F3B9C6D6D7B7506B20C1773F73F8DE56E6CD65D"
 	  "      F48DFAAA1E93F57A2789B168362A0F787320499F0B2461D3A4268757A7B27517"
 	  "      B7D203654A0CD484DEC6AF60C85FEB84AAC382EAF2047061FE5DAB81A20A0797"
 	  "      6E87359889BAE3B3600ED718BE61D4FC993CC8098A703DD0DC942E965E8F18D2A7#)\n"
 	  "  (g #05#)\n"
 	  "  (y #72DAB3E83C9F7DD9A931FDECDC6522C0D36A6F0A0FEC955C5AC3C09175BBFF2B"
 	  "      E588DB593DC2E420201BEB3AC17536918417C497AC0F8657855380C1FCF11C5B"
 	  "      D20DB4BEE9BDF916648DE6D6E419FA446C513AAB81C30CB7B34D6007637BE675"
 	  "      56CE6473E9F9EE9B9FADD275D001563336F2186F424DEC6199A0F758F6A00FF4#)))\n",
 
 	  "\xa7\x99\x61\xeb\x88\x83\xd2\xf4\x05\xc8"
 	  "\x4f\xba\x06\xf8\x78\x09\xbc\x1e\x20\xe5" }
       },
     };
   int i;
   if (verbose)
     fprintf (stderr, "Starting public key checks.\n");
   for (i = 0; i < sizeof (pubkeys) / sizeof (*pubkeys); i++)
     if (pubkeys[i].id)
       {
         if (gcry_pk_test_algo (pubkeys[i].id) && in_fips_mode)
           {
             if (verbose)
               fprintf (stderr, "  algorithm %d not available in fips mode\n",
                        pubkeys[i].id);
             continue;
           }
         check_one_pubkey (i, pubkeys[i]);
       }
   if (verbose)
     fprintf (stderr, "Completed public key checks.\n");
 
   if (verbose)
     fprintf (stderr, "Starting additional public key checks.\n");
   for (i = 0; i < sizeof (pubkeys) / sizeof (*pubkeys); i++)
     if (pubkeys[i].id)
       {
         if (gcry_pk_test_algo (pubkeys[i].id) && in_fips_mode)
           {
             if (verbose)
               fprintf (stderr, "  algorithm %d not available in fips mode\n",
                        pubkeys[i].id);
             continue;
           }
         check_one_pubkey_new (i);
       }
   if (verbose)
     fprintf (stderr, "Completed additional public key checks.\n");
 
 }
 
 int
 main (int argc, char **argv)
 { 
   gpg_error_t err;
   int last_argc = -1;
   int debug = 0;
   int use_fips = 0;
+  int selftest_only = 0;
 
   if (argc)
     { argc--; argv++; }
 
   while (argc && last_argc != argc )
     {
       last_argc = argc;
       if (!strcmp (*argv, "--"))
         {
           argc--; argv++;
           break;
         }
       else if (!strcmp (*argv, "--verbose"))
         {
           verbose++;
           argc--; argv++;
         }
       else if (!strcmp (*argv, "--debug"))
         {
           verbose = debug = 1;
           argc--; argv++;
         }
       else if (!strcmp (*argv, "--fips"))
         {
           use_fips = 1;
           argc--; argv++;
         }
+      else if (!strcmp (*argv, "--selftest"))
+        {
+          selftest_only = 1;
+          verbose += 2;
+          argc--; argv++;
+        }
     }          
 
   gcry_control (GCRYCTL_SET_VERBOSITY, (int)verbose);
 
   if (use_fips)
     gcry_control (GCRYCTL_FORCE_FIPS_MODE, 0);
 
   if (!gcry_check_version (GCRYPT_VERSION))
     die ("version mismatch\n");
 
   if (verbose)
     gcry_set_progress_handler (progress_handler, NULL);
   
   gcry_control (GCRYCTL_DISABLE_SECMEM, 0);
   gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);
   if (debug)
     gcry_control (GCRYCTL_SET_DEBUG_FLAGS, 1u, 0);
   /* No valuable keys are create, so we can speed up our RNG. */
   gcry_control (GCRYCTL_ENABLE_QUICK_RANDOM, 0);
 
   if ( gcry_control (GCRYCTL_FIPS_MODE_P, 0) )
     in_fips_mode = 1;
 
-  check_ciphers ();
-  check_aes128_cbc_cts_cipher ();
-  check_cbc_mac_cipher ();
-  check_ctr_cipher ();
-  check_cfb_cipher ();
-  check_ofb_cipher ();
-  check_digests ();
-  check_hmac ();
-  check_pubkey ();
-
-  if (in_fips_mode)
+  if (!selftest_only)
+    {
+      check_ciphers ();
+      check_aes128_cbc_cts_cipher ();
+      check_cbc_mac_cipher ();
+      check_ctr_cipher ();
+      check_cfb_cipher ();
+      check_ofb_cipher ();
+      check_digests ();
+      check_hmac ();
+      check_pubkey ();
+    }
+
+  if (in_fips_mode && !selftest_only)
     {
       /* If we are in fips mode do some more tests. */
       gcry_md_hd_t md;
 
       /* First trigger a self-test.  */
       gcry_control (GCRYCTL_FORCE_FIPS_MODE, 0);
       if (!gcry_control (GCRYCTL_OPERATIONAL_P, 0))
         fail ("not in operational state after self-test\n");
       
       /* Get us into the error state.  */
       err = gcry_md_open (&md, GCRY_MD_SHA1, 0);
       if (err)
         fail ("failed to open SHA-1 hash context: %s\n", gpg_strerror (err));
       else
         {
           err = gcry_md_enable (md, GCRY_MD_SHA256);
           if (err)
             fail ("failed to add SHA-256 hash context: %s\n",
                   gpg_strerror (err));
           else
             {
               /* gcry_md_get_algo is only defined for a context with
                  just one digest algorithm.  With our setup it should
                  put the oibrary intoerror state.  */
               fputs ("Note: Two lines with error messages follow "
                      "- this is expected\n", stderr);
               gcry_md_get_algo (md);
               gcry_md_close (md);
               if (gcry_control (GCRYCTL_OPERATIONAL_P, 0))
                 fail ("expected error state but still in operational state\n");
               else
                 {
                   /* Now run a self-test and to get back into
                      operational state.  */
                   gcry_control (GCRYCTL_FORCE_FIPS_MODE, 0);
                   if (!gcry_control (GCRYCTL_OPERATIONAL_P, 0))
                     fail ("did not reach operational after error "
                           "and self-test\n");
                 }
             }
         }
       
     }
   else
     {
       /* If in standard mode, run selftests.  */
-      gcry_control (GCRYCTL_FORCE_FIPS_MODE, 0);
+      gcry_control (GCRYCTL_SELFTEST, 0);
     }
 
   if (verbose)
     fprintf (stderr, "\nAll tests completed. Errors: %i\n", error_count);
 
   return error_count ? 1 : 0;
 }