6 years agoRinjdael: Fix use of SSE2 outside USE_AESNI/ctx->use_aesni
Jussi Kivilinna [Mon, 28 Jan 2013 09:11:33 +0000 (11:11 +0200)]
Rinjdael: Fix use of SSE2 outside USE_AESNI/ctx->use_aesni

* cipher/rijndael.c (_gcry_aes_cbc_enc): Check if AES-NI is enabled before
calling aesni_prepare() and aesni_cleanup().

aesni_cleanup() contains SSE2 instructions that are interpreted as MMX on CPUs
without SSE2 support (Pentium-III, etc). This causes x87 register state to be
poisoned, causing crashes later on when program tries to use floating point

Add '#ifdef USE_AESNI' and 'if (ctx->use_aesni)' for aesni_cleanup() and, while
at it, for aesni_prepare() too.

Reported-by: Mitsutoshi NAKANO <>
Signed-off-by: Jussi Kivilinna <>
6 years agoAdd AES-NI/AVX accelerated Camellia implementation
Jussi Kivilinna [Wed, 23 Jan 2013 09:55:13 +0000 (11:55 +0200)]
Add AES-NI/AVX accelerated Camellia implementation

* Add option --disable-avx-support.
* cipher/ (AM_CCASFLAGS): Add.
(EXTRA_libcipher_la_SOURCES): Add camellia_aesni_avx_x86-64.S
[__x86_64__] (USE_AESNI_AVX): Add macro.
(struct Camellia_context) [USE_AESNI_AVX]: Add use_aesni_avx.
[USE_AESNI_AVX] (_gcry_camellia_aesni_avx_ctr_enc)
(_gcry_camellia_aesni_avx_cbc_dec): New prototypes to assembly
(camellia_setkey) [USE_AESNI_AVX]: Enable AES-NI/AVX if hardware
support both.
(_gcry_camellia_ctr_enc) [USE_AESNI_AVX]: Add AES-NI/AVX code.
(_gcry_camellia_cbc_dec) [USE_AESNI_AVX]: Add AES-NI/AVX code.
* cipher/camellia_aesni_avx_x86-64.S: New.
* src/g10lib.h (HWF_INTEL_AVX): New.
* src/global.c (hwflist): Add HWF_INTEL_AVX.
* src/hwf-x86.c (detect_x86_gnuc) [ENABLE_AVX_SUPPORT]: Add detection
for AVX.

 Running each test 250 times.
                 ECB/Stream         CBC             CFB             OFB             CTR
              --------------- --------------- --------------- --------------- ---------------
 CAMELLIA128   2210ms  2200ms  2300ms  2050ms  2240ms  2250ms  2290ms  2270ms  2070ms  2070ms
 CAMELLIA256   2810ms  2800ms  2920ms  2670ms  2840ms  2850ms  2910ms  2890ms  2660ms  2640ms

 Running each test 250 times.
                 ECB/Stream         CBC             CFB             OFB             CTR
              --------------- --------------- --------------- --------------- ---------------
 CAMELLIA128   2200ms  2220ms  2290ms   470ms  2240ms  2270ms  2270ms  2290ms   480ms   480ms
 CAMELLIA256   2820ms  2820ms  2900ms   600ms  2860ms  2860ms  2900ms  2920ms   620ms   620ms

AES-NI/AVX implementation works by processing 16 parallel blocks (256 bytes).
It's bytesliced implementation that uses AES-NI (Subbyte) for Camellia sboxes,
with help of prefiltering/postfiltering. For smaller data sets generic C
implementation is used.

Speed-up for CBC-decryption and CTR-mode (large data): 4.3x

Tests were run on: Intel Core i5-2450M

Signed-off-by: Jussi Kivilinna <>
(license boiler plate update by wk)

6 years agocamellia.c: Prepare for AES-NI/AVX implementation
Jussi Kivilinna [Wed, 23 Jan 2013 09:55:08 +0000 (11:55 +0200)]
camellia.c: Prepare for AES-NI/AVX implementation

* cipher/camellia-glue.c (CAMELLIA_encrypt_stack_burn_size)
(CAMELLIA_decrypt_stack_burn_size): Increase stack burn size.
* cipher/camellia.c (CAMELLIA_ROUNDSM): Move key-material mixing in
the front.
(camellia_setup128, camellia_setup256): Remove now unneeded
key-material mangling.
(camellia_encrypt128, camellia_decrypt128, amellia_encrypt256)
(camellia_decrypt256): Copy block to stack, so that compiler can
optimize it for register usage.

Camellia implementation needs to be modified slightly for compatibility with
AES-NI/AVX version.

Running each test 100 times.
                ECB/Stream         CBC             CFB             OFB             CTR
             --------------- --------------- --------------- --------------- ---------------
CAMELLIA128    800ms   790ms   840ms   730ms   810ms   800ms   820ms   820ms   730ms   740ms
CAMELLIA192   1040ms  1040ms  1030ms   930ms  1000ms  1000ms  1020ms  1020ms   940ms   930ms
CAMELLIA256   1000ms   980ms  1040ms   930ms  1010ms   990ms  1040ms  1040ms   940ms   930ms

Running each test 100 times.
                ECB/Stream         CBC             CFB             OFB             CTR
             --------------- --------------- --------------- --------------- ---------------
CAMELLIA128    780ms   750ms   810ms   690ms   780ms   770ms   810ms   810ms   700ms   690ms
CAMELLIA192   1020ms   990ms  1000ms   890ms   970ms   970ms   990ms  1000ms   890ms   900ms
CAMELLIA256    960ms   960ms  1000ms   900ms   970ms   970ms   990ms  1010ms   900ms   890ms

Signed-off-by: Jussi Kivilinna <>
6 years agoCamellia, prepare glue code for AES-NI/AVX implementation
Jussi Kivilinna [Wed, 23 Jan 2013 09:55:03 +0000 (11:55 +0200)]
Camellia, prepare glue code for AES-NI/AVX implementation

* cipher/camellia-glue.c (ATTR_ALIGNED_16): Add macro.
(CAMELLIA_encrypt_stack_burn_size): Add macro.
(camellia_encrypt): Use macro above for stack burn size.
(CAMELLIA_decrypt_stack_burn_size): Add macro.
(camellia_decrypt): Use macro above for stack burn size.
(_gcry_camellia_ctr_enc): New function.
(_gcry_camellia_cbc_dec): New function.
(selftest_ctr_128): New function.
(selftest): Call function above.
* cipher/cipher.c (gcry_cipher_open) [USE_CAMELLIA]: Register bulk
functions for CBC-decryption and CTR-mode.
* src/cipher.h (_gcry_camellia_ctr_enc): New prototype.
(_gcry_camellia_cbc_dec): New prototype.

AES-NI/AVX implementation needs multi-block input, so prepare glue code for
that by adding bulk-functions for CBC-decryption and CTR-mode.

Signed-off-by: Jussi Kivilinna <>
6 years agoPrepare for hardware feature detection on other platforms.
Werner Koch [Fri, 21 Dec 2012 16:26:06 +0000 (17:26 +0100)]
Prepare for hardware feature detection on other platforms.

* mpi/config.links (mpi_cpu_arch): New.
* src/global.c (print_config): Print new tag "cpu-arch".
* src/ (libgcrypt_la_SOURCES): Add hwf-common.h
(EXTRA_libgcrypt_la_SOURCES): New.
(gcrypt_hwf_modules): New.
(libgcrypt_la_DEPENDENCIES, libgcrypt_la_LIBADD): Add that one.
* src/hwfeatures.c: Factor most code out to ...
* src/hwf-x86.c: New file.
(detect_x86_gnuc): Return the feature vector.
(_gcry_hwf_detect_x86): New.
* src/hwf-common.h: New.
* src/hwfeatures.c (_gcry_detect_hw_features): Dispatch using
HAVE_CPU_ARCH_ macros.

Signed-off-by: Werner Koch <>
6 years agoClean up i386/x86-64 cpuid usage in hwfeatures.c
Jussi Kivilinna [Thu, 20 Dec 2012 13:46:57 +0000 (15:46 +0200)]
Clean up i386/x86-64 cpuid usage in hwfeatures.c

* src/hwfeatures.c [__i386__ && __GNUC__] (detect_ia32_gnuc): Remove.
[__x86_64__ && __GNUC__] (detect_x86_64_gnuc): Remove.
[__i386__ && __GNUC__] (is_cpuid_available, get_cpuid)
(HAS_X86_CPUID): New.
[__x86_64__ && __GNUC__] (is_cpuid_available, get_cpuid)
(HAS_X86_CPUID): New.
[HAS_X86_CPUID] (detect_x86_gnuc): New.
(_gcry_detect_hw_features) [__i386__ && GNUC]: Remove detect_ia32_gnuc
(_gcry_detect_hw_features) [__x86_64__ && GNUC]: Remove
detect_x86_64_gnuc call.
(_gcry_detect_hw_features) [HAS_X86_CPUID]: Add detect_x86_gnuc call.

For hwfeatures.c clean up, merge i386/x86-64 hardware detection and move
i386/x86-64 spesific assembler to separate functions, is_cpuid_available() and

Signed-off-by: Jussi Kivilinna <>
6 years agoAdd support for using DRNG random number generator
Dmitry Kasatkin [Tue, 18 Dec 2012 12:56:48 +0000 (14:56 +0200)]
Add support for using DRNG random number generator

* Add option --disable-drng-support.
* random/rndhw.c (USE_DRNG): New.
(rdrand_long, rdrand_nlong, poll_drng): New.
(_gcry_rndhw_poll_fast, _gcry_rndhw_poll_slow): Call poll function.
* src/g10lib.h (HWF_INTEL_RDRAND): New.
* src/global.c (hwflist): Add "intel-rdrand".
* src/hwfeatures.c (detect_x86_64_gnuc) [ENABLE_DRNG_SUPPORT]: Detect
(detect_ia32_gnuc) [ENABLE_DRNG_SUPPORT]: Detect RDRAND.

This patch provides support for using Digital Random Number Generator (DRNG)
engine, which is available on the latest Intel's CPUs. DRNG engine is
accesible via new the RDRAND instruction.

This patch adds the following:
- support for disabling using of rdrand instruction
- checking for RDRAND instruction support using cpuid
- RDRAND usage implementation

Signed-off-by: Dmitry Kasatkin <>
ChangeLog and editorial changes by wk.

6 years agodoc: Add Dmitry to AUTHORS
Werner Koch [Tue, 18 Dec 2012 17:42:23 +0000 (18:42 +0100)]
doc: Add Dmitry to AUTHORS


7 years agoUpdate AUTHORS file.
Werner Koch [Wed, 5 Dec 2012 11:59:45 +0000 (12:59 +0100)]
Update AUTHORS file.


7 years agorandom: Add a RNG selection interface and system RNG wrapper.
Werner Koch [Mon, 3 Dec 2012 19:41:28 +0000 (20:41 +0100)]
random: Add a RNG selection interface and system RNG wrapper.

* random/random-system.c: New.
* random/ (librandom_la_SOURCES): Add new module.
* random/random.c (struct rng_types): New.
(_gcry_set_preferred_rng_type, _gcry_get_rng_type): New.
(_gcry_random_initialize, gcry_random_add_bytes, do_randomize)
(_gcry_set_random_seed_file, _gcry_update_random_seed_file)
(_gcry_fast_random_poll): Dispatch to the actual RNG.
(gcry_rng_types): New.
* src/global.c (print_config): Print the TNG type.
(global_init, _gcry_vcontrol): Implement the new control codes.
* doc/gcrypt.texi (Controlling the library): Document the new control

* tests/benchmark.c (main): Add options to test the RNG types.
* tests/random.c (main): Add new options.
(print_hex): Print to stderr.
(progress_cb, rng_type): New.
(check_rng_type_switching, check_early_rng_type_switching): New.
(run_all_rng_tests): New.

The purpose of this change is to allow applications with moderate
random requirements to use the system's RNG (e.g. /dev/urandom).  The
type switching logic makes sure that existing applications won't be
affected by this change.  A library is in almost all cases not able to
degrade the quality of the RNG.  The definition of "degrade" comes
from our own assertion of the quality/trustworthiness of the RNGs:

The most trustworthy RNG is the CSPRNG which dates back to the early
GnuPG days.  It is quite conservative and often requires more seeding
than might be justified.  GCRY_RNG_TYPE_STANDARD is the default unless
the process is in FIPS mode.

The second trustworthy RNG is the FIPS recommended X9.81 AES based
implementation.  It is seeded by the system's RNG.  GCRY_RNG_TYPE_FIPS
is the only available RNG if running in FIPS mode.

The third trustworthy RNG is a mere wrapper around the system's native
RNG.  Thus there is no extra step on top of what, for example,
/dev/random provides.  GCRY_RNG_TYPE_SYSTEM may be used by
applications which would use /dev/random or /dev/urandom instead.

7 years agoUpdate the copyright years.
Werner Koch [Mon, 3 Dec 2012 19:17:48 +0000 (20:17 +0100)]
Update the copyright years.


7 years agotests: Allow use of random.c under Windows.
Werner Koch [Mon, 3 Dec 2012 15:18:56 +0000 (16:18 +0100)]
tests: Allow use of random.c under Windows.

* tests/ (TESTS): Always include random.c
* tests/random.c [!W32]: Include sys/wait.h.
(inf): New.
(check_forking, check_nonce_forking): Print a notice what will be done.
(main) [W32]: Do not call signal.

This change help to run future tests under Windows.  The current two
tests are not applicable to Windows.

7 years agoMake random-fips.c work multi-threaded.
Werner Koch [Mon, 3 Dec 2012 14:15:49 +0000 (15:15 +0100)]
Make random-fips.c work multi-threaded.

* random/random-fips.c (basic_initialization): Fix reversed logic.

The module never initialized the mutex at all.  Probably this was never
an issue before commit 38fcd59 which removed static lock init.

7 years agoMove nonce creation from csprng backend to random main module.
Werner Koch [Fri, 30 Nov 2012 17:16:34 +0000 (18:16 +0100)]
Move nonce creation from csprng backend to random main module.

* random/random-csprng.c (_gcry_rngcsprng_create_nonce): Remove.
(nonce_buffer_lock): Remove.
(initialize_basics): Remove init of nonce_buffer_lock.
* random/random.c: Add a few header files.
(nonce_buffer_lock):  New.
(_gcry_random_initialize): Init nonce_buffer_lock.
(gcry_create_nonce): Add code from _gcry_rngcsprng_create_nonce.

* random/random-daemon.c (_gcry_daemon_create_nonce): Remove.

The nonce generation code is useful for all RNG types and thus it
should be in random.c.  The only exception is the fips-mode, which
requires the use of the fips nonce generator.

7 years agoFix building with CC="gcc -std=c90".
Jussi Kivilinna [Thu, 29 Nov 2012 19:55:34 +0000 (21:55 +0200)]
Fix building with CC="gcc -std=c90".

* Add check for missing 'asm' keyword in C90 mode and
replacement with '__asm__'.

Signed-off-by: Jussi Kivilinna <>
7 years agoTry to use inttypes.h if stdint.h is not available.
Werner Koch [Mon, 3 Dec 2012 13:28:12 +0000 (14:28 +0100)]
Try to use inttypes.h if stdint.h is not available.

* cipher/bufhelp.h [HAVE_INTTYPES_H]: Include inttypes.h

According to the description of AC_TYPE_UINTPTR_T, this header should
also be included.

7 years agoOptimize buffer xoring.
Jussi Kivilinna [Thu, 29 Nov 2012 19:54:57 +0000 (21:54 +0200)]
Optimize buffer xoring.

* cipher/ (libcipher_la_SOURCES): Add 'bufhelp.h'.
* cipher/bufhelp.h: New.
* cipher/cipher-aeswrap.c (_gcry_cipher_aeswrap_encrypt)
(_gcry_cipher_aeswrap_decrypt): Use 'buf_xor' for buffer xoring.
* cipher/cipher-cbc.c (_gcry_cipher_cbc_encrypt)
(_gcry_cipher_cbc_decrypt): Use 'buf_xor' for buffer xoring and remove
resulting unused variables.
* cipher/cipher-cfb.c (_gcry_cipher_cfb_encrypt) Use 'buf_xor_2dst'
for buffer xoring and remove resulting unused variables.
(_gcry_cipher_cfb_decrypt): Use 'buf_xor_n_copy' for buffer xoring and
remove resulting unused variables.
* cipher/cipher-ctr.c (_gcry_cipher_ctr_encrypt): Use 'buf_xor' for
buffer xoring and remove resulting unused variables.
* cipher/cipher-ofb.c (_gcry_cipher_ofb_encrypt)
(_gcry_cipher_ofb_decrypt): Use 'buf_xor' for buffer xoring and remove
resulting used variables.
* cipher/rijndael.c (_gry_aes_cfb_enc): Use 'buf_xor_2dst' for buffer
xoring and remove resulting unused variables.
(_gry_aes_cfb_dev): Use 'buf_xor_n_copy' for buffer xoring and remove
resulting unused variables.
(_gry_aes_cbc_enc, _gry_aes_ctr_enc, _gry_aes_cbc_dec): Use 'buf_xor'
for buffer xoring and remove resulting unused variables.

Add faster helper functions for buffer xoring and replace byte buffer xor
loops. This give following speed up. Note that CTR speed up is from refactoring
code to use buf_xor() and removal of integer division/modulo operations issued
per each processed byte. This removal of div/mod most likely gives even greater
speed increase on CPU architechtures that do not have hardware division unit.

Benchmark ratios (old-vs-new, AMD Phenom II, x86-64):

                ECB/Stream         CBC             CFB             OFB             CTR
             --------------- --------------- --------------- --------------- ---------------
IDEA            0.99x   1.01x   1.06x   1.02x   1.03x   1.06x   1.04x   1.02x   1.58x   1.58x
3DES            1.00x   1.00x   1.01x   1.01x   1.02x   1.02x   1.02x   1.01x   1.22x   1.23x
CAST5           0.98x   1.00x   1.09x   1.03x   1.09x   1.09x   1.07x   1.07x   1.98x   1.95x
BLOWFISH        1.00x   1.00x   1.18x   1.05x   1.07x   1.07x   1.05x   1.05x   1.93x   1.91x
AES             1.00x   0.98x   1.18x   1.14x   1.13x   1.13x   1.14x   1.14x   1.18x   1.18x
AES192          0.98x   1.00x   1.13x   1.14x   1.13x   1.10x   1.14x   1.16x   1.15x   1.15x
AES256          0.97x   1.02x   1.09x   1.13x   1.13x   1.09x   1.10x   1.14x   1.11x   1.13x
TWOFISH         1.00x   1.00x   1.15x   1.17x   1.18x   1.16x   1.18x   1.13x   2.37x   2.31x
ARCFOUR         1.03x   0.97x
DES             1.01x   1.00x   1.04x   1.04x   1.04x   1.05x   1.05x   1.02x   1.56x   1.55x
TWOFISH128      0.97x   1.03x   1.18x   1.17x   1.18x   1.15x   1.15x   1.15x   2.37x   2.31x
SERPENT128      1.00x   1.00x   1.10x   1.11x   1.08x   1.09x   1.08x   1.06x   1.66x   1.67x
SERPENT192      1.00x   1.00x   1.07x   1.08x   1.08x   1.09x   1.08x   1.08x   1.65x   1.66x
SERPENT256      1.00x   1.00x   1.09x   1.09x   1.08x   1.09x   1.08x   1.06x   1.66x   1.67x
RFC2268_40      1.03x   0.99x   1.05x   1.02x   1.03x   1.03x   1.04x   1.03x   1.46x   1.46x
SEED            1.00x   1.00x   1.10x   1.10x   1.09x   1.09x   1.10x   1.07x   1.80x   1.76x
CAMELLIA128     1.00x   1.00x   1.23x   1.12x   1.15x   1.17x   1.15x   1.12x   2.15x   2.13x
CAMELLIA192     1.05x   1.03x   1.23x   1.21x   1.21x   1.16x   1.12x   1.25x   1.90x   1.90x
CAMELLIA256     1.03x   1.07x   1.10x   1.19x   1.08x   1.14x   1.12x   1.10x   1.90x   1.92x

Benchmark ratios (old-vs-new, AMD Phenom II, i386):

                ECB/Stream         CBC             CFB             OFB             CTR
             --------------- --------------- --------------- --------------- ---------------
IDEA            1.00x   1.00x   1.04x   1.05x   1.04x   1.02x   1.02x   1.02x   1.38x   1.40x
3DES            1.01x   1.00x   1.02x   1.04x   1.03x   1.01x   1.00x   1.02x   1.20x   1.20x
CAST5           1.00x   1.00x   1.03x   1.09x   1.07x   1.04x   1.13x   1.00x   1.74x   1.74x
BLOWFISH        1.04x   1.08x   1.03x   1.13x   1.07x   1.12x   1.03x   1.00x   1.78x   1.74x
AES             0.96x   1.00x   1.09x   1.08x   1.14x   1.13x   1.07x   1.03x   1.14x   1.09x
AES192          1.00x   1.03x   1.07x   1.03x   1.07x   1.07x   1.06x   1.03x   1.08x   1.11x
AES256          1.00x   1.00x   1.06x   1.06x   1.10x   1.06x   1.05x   1.03x   1.10x   1.10x
TWOFISH         0.95x   1.10x   1.13x   1.23x   1.05x   1.14x   1.09x   1.13x   1.95x   1.86x
ARCFOUR         1.00x   1.00x
DES             1.02x   0.98x   1.04x   1.04x   1.05x   1.02x   1.04x   1.00x   1.45x   1.48x
TWOFISH128      0.95x   1.10x   1.26x   1.19x   1.09x   1.14x   1.17x   1.00x   2.00x   1.91x
SERPENT128      1.02x   1.00x   1.08x   1.04x   1.10x   1.06x   1.08x   1.04x   1.42x   1.42x
SERPENT192      1.02x   1.02x   1.06x   1.06x   1.10x   1.08x   1.04x   1.06x   1.42x   1.42x
SERPENT256      1.02x   0.98x   1.06x   1.06x   1.10x   1.06x   1.04x   1.06x   1.42x   1.40x
RFC2268_40      1.00x   1.00x   1.02x   1.06x   1.04x   1.02x   1.02x   1.02x   1.35x   1.35x
SEED            1.00x   0.97x   1.11x   1.05x   1.06x   1.08x   1.08x   1.05x   1.56x   1.57x
CAMELLIA128     1.03x   0.97x   1.12x   1.14x   1.06x   1.10x   1.06x   1.06x   1.73x   1.59x
CAMELLIA192     1.06x   1.00x   1.13x   1.10x   1.11x   1.11x   1.15x   1.08x   1.57x   1.58x
CAMELLIA256     1.06x   1.03x   1.10x   1.10x   1.11x   1.11x   1.13x   1.08x   1.57x   1.62x

 - include stdint.h only when it's available
 - use uintptr_t instead of long and intptr_t

Signed-off-by: Jussi Kivilinna <>
7 years agoOptimize AES-NI CTR mode.
Jussi Kivilinna [Thu, 29 Nov 2012 15:31:03 +0000 (17:31 +0200)]
Optimize AES-NI CTR mode.

* cipher/rijndael.c [USE_AESNI] (do_aesni_ctr, do_aesni_ctr_4): Make
handling of 64-bit overflow and carry conditional. Avoid generic to
vector register passing of value '1'. Generate and use '-1' instead.

We only need to handle 64-bit carry in few special cases, that happen very
rarely. So move carry handling to slow-path and only detect need for carry
handling on fast-path. Also avoid moving '1' from generic register to vector
register, as that might be slow on some CPUs. Instead generate '-1' with
SSE2 instructions and use subtraction instead of addition to increase IV.

Overall this gives ~8% improvement in speed for AES CTR mode on Intel

Signed-off-by: Jussi Kivilinna <>
7 years agoMake a cpp conditional in rijndael.c better readable.
Werner Koch [Wed, 28 Nov 2012 08:40:57 +0000 (09:40 +0100)]
Make a cpp conditional in rijndael.c better readable.

* cipher/rijndael.c (USE_AESNI): Modify cpp conditionals for better

7 years agoFix building with Clang on x86-64 and i386
Jussi Kivilinna [Tue, 27 Nov 2012 21:44:13 +0000 (23:44 +0200)]
Fix building with Clang on x86-64 and i386

* cipher/rijndael.c [USE_AESNI] (do_aesni_enc_aligned)
(do_aesni_dec_vec4, do_aesni_cfb, do_aesni_ctr, do_aesni_ctr_4): Add
explicit suffix to 'cmp' instructions.

Clang throws errors on missing instruction suffixes, such as:

rijndael.c:1091:39: error: ambiguous instructions require an explicit suffix (could be 'cmpb', 'cmpw', 'cmpl', or 'cmpq')
<inline asm>:39:2: note: instantiated into assembly here
        cmp $1, -44(%rbp)

With this patch building on x86-64 works fine. Other issues still exists on i386,
namely with MPI, which can be overcome with 'clang -fheinous-gnu-extensions'.

 - remove do_aesni_enc_vec4 modification as that function didn't make it to upstream.

Signed-off-by: Jussi Kivilinna <>
NB: I still believe it is a bad idea of clang to define __GNUC__
and not being 100% compatible to gcc. [wk]

7 years agoOptimize wipememory2 for i386 and x86-64
Jussi Kivilinna [Fri, 23 Nov 2012 17:22:35 +0000 (19:22 +0200)]
Optimize wipememory2 for i386 and x86-64

* src/g10lib.h (wipememory2): Add call to fast_wipememory2.
(fast_wipememory2): New macros for i386 and x86-64 architectures.
Empty macro provided for other architectures.

Optimizing wipememory2 give broad range of speed improvements, as seen below.

Cipher speed ratios, old-vs-new (AMD Phenom II, x86-64):

                ECB/Stream         CBC             CFB             OFB             CTR
             --------------- --------------- --------------- --------------- ---------------
IDEA            1.32x   1.35x   1.29x   1.25x   1.30x   1.33x   1.33x   1.33x   1.22x   1.22x
3DES            1.13x   1.10x   1.11x   1.12x   1.13x   1.16x   1.13x   1.13x   1.10x   1.12x
CAST5           1.57x   1.51x   1.56x   1.43x   1.48x   1.50x   1.49x   1.51x   1.28x   1.27x
BLOWFISH        1.53x   1.52x   1.56x   1.42x   1.50x   1.51x   1.49x   1.52x   1.27x   1.28x
AES             1.33x   1.33x   1.00x   1.02x   1.04x   1.02x   1.26x   1.26x   1.00x   0.98x
AES192          1.33x   1.36x   1.05x   1.00x   1.04x   1.00x   1.28x   1.24x   1.02x   1.00x
AES256          1.22x   1.33x   0.98x   1.00x   1.03x   1.02x   1.28x   1.25x   1.00x   1.00x
TWOFISH         1.34x   1.34x   1.44x   1.25x   1.35x   1.28x   1.37x   1.37x   1.14x   1.16x
ARCFOUR         1.00x   1.00x
DES             1.31x   1.30x   1.34x   1.25x   1.28x   1.28x   1.34x   1.26x   1.22x   1.24x
TWOFISH128      1.41x   1.45x   1.46x   1.28x   1.32x   1.37x   1.34x   1.28x   1.16x   1.16x
SERPENT128      1.16x   1.20x   1.22x   1.16x   1.16x   1.16x   1.18x   1.18x   1.14x   1.11x
SERPENT192      1.16x   1.20x   1.23x   1.16x   1.19x   1.18x   1.16x   1.16x   1.10x   1.10x
SERPENT256      1.18x   1.23x   1.23x   1.13x   1.18x   1.16x   1.18x   1.16x   1.11x   1.11x
RFC2268_40      1.00x   1.00x   1.03x   0.96x   0.98x   1.00x   0.99x   1.00x   0.99x   0.98x
SEED            1.20x   1.24x   1.25x   1.18x   1.19x   1.18x   1.21x   1.22x   1.14x   1.12x
CAMELLIA128     1.60x   1.69x   1.56x   1.50x   1.60x   1.53x   1.64x   1.63x   1.29x   1.32x
CAMELLIA192     1.55x   1.46x   1.44x   1.34x   1.42x   1.50x   1.46x   1.51x   1.26x   1.28x
CAMELLIA256     1.52x   1.50x   1.47x   1.40x   1.51x   1.44x   1.41x   1.50x   1.28x   1.28x

Cipher speed ratios, old-vs-new (AMD Phenom II, i386):

                ECB/Stream         CBC             CFB             OFB             CTR
             --------------- --------------- --------------- --------------- ---------------
IDEA            1.15x   1.11x   1.10x   1.08x   1.09x   1.13x   1.16x   1.07x   1.10x   1.14x
3DES            1.08x   1.08x   1.08x   1.07x   1.06x   1.06x   1.06x   1.05x   1.05x   1.05x
CAST5           1.23x   1.25x   1.18x   1.17x   1.25x   1.21x   1.22x   1.17x   1.14x   1.12x
BLOWFISH        1.25x   1.22x   1.21x   1.11x   1.23x   1.23x   1.24x   1.17x   1.14x   1.14x
AES             1.13x   1.13x   1.02x   1.02x   0.98x   0.98x   1.16x   1.03x   1.02x   0.98x
AES192          1.11x   1.12x   1.02x   0.99x   1.02x   0.95x   1.06x   1.00x   0.94x   0.91x
AES256          1.05x   1.05x   0.97x   1.00x   1.00x   0.99x   1.11x   1.01x   0.99x   1.00x
TWOFISH         1.11x   1.15x   1.16x   1.13x   1.12x   1.14x   1.13x   1.05x   1.07x   1.08x
ARCFOUR         1.00x   0.97x
DES             1.14x   1.14x   1.10x   1.07x   1.11x   1.12x   1.14x   1.08x   1.11x   1.17x
TWOFISH128      1.16x   1.23x   1.18x   1.15x   1.14x   1.20x   1.15x   1.05x   1.08x   1.08x
SERPENT128      1.08x   1.08x   1.08x   1.05x   1.06x   1.05x   1.09x   1.04x   1.05x   1.05x
SERPENT192      1.07x   1.08x   1.08x   1.04x   1.04x   1.06x   1.08x   1.04x   1.01x   1.05x
SERPENT256      1.06x   1.08x   1.05x   1.04x   1.05x   1.08x   1.07x   1.03x   1.06x   1.06x
RFC2268_40      1.00x   0.99x   1.02x   1.01x   1.01x   1.00x   1.02x   0.99x   0.98x   0.99x
SEED            1.12x   1.07x   1.12x   1.07x   1.09x   1.10x   1.10x   1.03x   1.07x   1.05x
CAMELLIA128     1.24x   1.21x   1.16x   1.17x   1.16x   1.16x   1.21x   1.16x   1.13x   1.12x
CAMELLIA192     1.19x   1.20x   1.14x   1.19x   1.20x   1.20x   1.18x   1.13x   1.13x   1.15x
CAMELLIA256     1.21x   1.19x   1.14x   1.17x   1.17x   1.16x   1.17x   1.11x   1.12x   1.14x

Hash speed ratios, old-vs-new (Intel Sandy-Bridge, x86-64):

MD5             1.00x   1.47x   1.07x   1.00x   1.00x
SHA1            1.06x   1.27x   1.06x   1.00x   1.00x
RIPEMD160       1.04x   1.32x   1.11x   1.00x   1.00x
TIGER192        1.05x   1.50x   1.15x   1.03x   1.05x
SHA256          1.05x   1.38x   1.21x   1.04x   1.03x
SHA384          1.15x   1.76x   1.25x   1.10x   1.04x
SHA512          1.15x   1.76x   1.27x   1.08x   1.04x
SHA224          1.05x   1.38x   1.21x   1.06x   1.00x
MD4             1.17x   1.55x   1.06x   1.06x   1.00x
CRC32           1.00x   1.00x   0.99x   1.04x   1.00x
CRC32RFC1510    0.93x   1.00x   1.01x   1.00x   1.00x
CRC24RFC2440    1.00x   1.00x   1.00x   0.99x   1.00x
WHIRLPOOL       1.02x   1.00x   0.99x   1.00x   1.00x
TIGER           1.05x   1.50x   1.15x   1.09x   1.05x
TIGER2          1.05x   1.48x   1.16x   1.06x   0.95x

Signed-off-by: Jussi Kivilinna <>
7 years agoFix missing 64bit carry handling in AES-NI CTR mode
Jussi Kivilinna [Fri, 23 Nov 2012 17:22:30 +0000 (19:22 +0200)]
Fix missing 64bit carry handling in AES-NI CTR mode

* cipher/rijndael.c [USE_AESNI] (do_aesni_ctr, do_aesni_ctr_4): Add
carry handling to 64-bit addition.
(selftest_ctr_128): New function for testing IV handling in bulk CTR
(selftest): Add call to selftest_ctr_128.

Carry handling checks if lower 64-bit part of SSE register was overflowed and
if it was, increment upper parts since that point. Also add selftests to verify
correct operation.

Signed-off-by: Jussi Kivilinna <>
7 years agoAdd parallelized AES-NI CBC decryption
Jussi Kivilinna [Fri, 23 Nov 2012 17:22:14 +0000 (19:22 +0200)]
Add parallelized AES-NI CBC decryption

* cipher/rijndael.c [USE_AESNI] (aesni_cleanup_5): New macro.
[USE_AESNI] (do_aesni_dec_vec4): New function.
(_gcry_aes_cbc_dec) [USE_AESNI]: Add parallelized CBC loop.
(_gcry_aes_cbc_dec) [USE_AESNI]: Change IV storage register from xmm3
to xmm5.

This gives ~60% improvement in CBC decryption speed on sandy-bridge (x86-64).
Overall speed improvement with this and previous CBC patches is over 400%.


$ tests/benchmark --cipher-repetitions 1000 cipher aes aes192 aes256
Running each test 1000 times.
                ECB/Stream         CBC             CFB             OFB             CTR
             --------------- --------------- --------------- --------------- ---------------
AES            670ms   770ms  2920ms   720ms  1900ms   660ms  2260ms  2250ms   480ms   500ms
AES192         860ms   930ms  3250ms   870ms  2210ms   830ms  2580ms  2580ms   570ms   570ms
AES256        1020ms  1080ms  3580ms  1030ms  2550ms   970ms  2880ms  2870ms   660ms   660ms


$ tests/benchmark --cipher-repetitions 1000 cipher aes aes192 aes256
Running each test 1000 times.
                ECB/Stream         CBC             CFB             OFB             CTR
             --------------- --------------- --------------- --------------- ---------------
AES            670ms   770ms  2130ms   450ms  1880ms   670ms  2250ms  2280ms   490ms   490ms
AES192         880ms   920ms  2460ms   540ms  2210ms   830ms  2580ms  2570ms   580ms   570ms
AES256        1020ms  1070ms  2800ms   620ms  2560ms   970ms  2880ms  2880ms   660ms   650ms

Signed-off-by: Jussi Kivilinna <>
7 years agoClear xmm5 after use in AES-NI CTR mode
Jussi Kivilinna [Fri, 23 Nov 2012 17:22:09 +0000 (19:22 +0200)]
Clear xmm5 after use in AES-NI CTR mode

* cipher/rijndael.c [USE_AESNI]: Rename aesni_cleanup_2_4 to
[USE_AESNI] (aesni_cleanup_2_5): Clear xmm5 register.
(_gcry_aes_ctr_enc, _gcry_aes_cbc_dec) [USE_AESNI]: Use
aesni_cleanup_2_5 instead of aesni_cleanup_2_4.

xmm5 register is used by parallelized AES-NI CTR mode, so it should be cleaned
up after use too.

Signed-off-by: Jussi Kivilinna <>
7 years agoOptimize AES-NI CBC encryption
Jussi Kivilinna [Fri, 23 Nov 2012 17:22:04 +0000 (19:22 +0200)]
Optimize AES-NI CBC encryption

* cipher/rijndeal.c (_gcry_aes_cbc_enc) [USE_AESNI]: Add AES-NI
spesific loop and use SSE2 assembler for xoring and copying of

This gives ~35% improvement in 'tests/benchmark cipher aes' on Sandy-Bridge
CPU (x86-64).

Signed-off-by: Jussi Kivilinna <>
7 years agoImprove parallelizability of CBC decryption for AES-NI
Jussi Kivilinna [Fri, 23 Nov 2012 17:21:59 +0000 (19:21 +0200)]
Improve parallelizability of CBC decryption for AES-NI

* cipher/rijndael.c (_gcry_aes_cbc_dec) [USE_AESNI]: Add AES-NI
specific CBC mode loop with temporary block and IV stored in free SSE

Benchmark results on Intel Core i5-2450M (x86-64) show ~2.5x improvement:


$ tests/benchmark --cipher-repetitions 1000 cipher aes aes192 aes256
Running each test 1000 times.
                ECB/Stream         CBC             CFB             OFB             CTR
             --------------- --------------- --------------- --------------- ---------------
AES            690ms   780ms  2940ms  2110ms  1880ms   670ms  2250ms  2250ms   490ms   500ms
AES192         890ms   930ms  3260ms  2390ms  2220ms   820ms  2580ms  2590ms   560ms   570ms
AES256        1040ms  1070ms  3590ms  2640ms  2540ms   970ms  2880ms  2890ms   650ms   650ms


$ tests/benchmark --cipher-repetitions 1000 cipher aes aes192 aes256
Running each test 1000 times.
                ECB/Stream         CBC             CFB             OFB             CTR
             --------------- --------------- --------------- --------------- ---------------
AES            670ms   770ms  2920ms   720ms  1900ms   660ms  2260ms  2250ms   480ms   500ms
AES192         860ms   930ms  3250ms   870ms  2210ms   830ms  2580ms  2580ms   570ms   570ms
AES256        1020ms  1080ms  3580ms  1030ms  2550ms   970ms  2880ms  2870ms   660ms   660ms

Signed-off-by: Jussi Kivilinna <>
7 years agoExtend test of chained modes for 128bit ciphers
Jussi Kivilinna [Fri, 23 Nov 2012 17:21:54 +0000 (19:21 +0200)]
Extend test of chained modes for 128bit ciphers

* tests/basic.c (check_one_cipher_core, check_one_cipher): Increase
input and output buffer sizes from 16 bytes to 1024+16=1040 bytes.
(check_one_cipher_core): Add asserts to verify sizes of temporary

Currently check_one_cipher() has buffer size of 16 bytes, which is one block
with 128bit cipher. As result chained modes for 128bit ciphers are not well
tested. Increase buffer size to 1040 bytes, so that iterations of chained
modes and parallellized code paths (AES-NI CTR, etc) are also tested.
Extra 16 bytes after 1024 bytes to ensure that loop transision from
parallelized code paths to serialized code paths get tested too.

Signed-off-by: Jussi Kivilinna <>
7 years agoFix for strict aliasing rules.
Werner Koch [Wed, 21 Nov 2012 11:58:36 +0000 (12:58 +0100)]
Fix for strict aliasing rules.

* cipher/rijndael.c (do_setkey, prepare_decryption): Use u32_a_t for

gcc 4.7.1 now show warnings for more functions.  Like:

  rijndael.c:412:19: warning: dereferencing type-punned pointer will
  break strict-aliasing rules [-Wstrict-aliasing]

This fixes them using the may_alias attribute.

7 years agoDo not detect AES-NI support if disabled by configure.
Werner Koch [Wed, 21 Nov 2012 11:30:58 +0000 (12:30 +0100)]
Do not detect AES-NI support if disabled by configure.

* src/hwfeatures.c (detect_ia32_gnuc): Detect AESNI support only if
that support has been enabled.

We better do not try to detect AESNI support if the support has been
disabled in the configure run.  Disabling the support might have been
done due to problem with the AESNI support on a certain platform and
we can't exclude problem for sure with the detection code either.

7 years agoAdd Jussi Kivilinna to the AUTHORS.
Werner Koch [Wed, 21 Nov 2012 10:53:27 +0000 (11:53 +0100)]
Add Jussi Kivilinna to the AUTHORS.


7 years agoFix too large burn_stack in camellia-glue.c
Jussi Kivilinna [Fri, 16 Nov 2012 08:45:43 +0000 (10:45 +0200)]
Fix too large burn_stack in camellia-glue.c

* cipher/camellia-glue.c (camellia_encrypt, camellia_decrypt): Do not
take full array size of KEY_TABLE_TYPE, but argument size instead.

KEY_TABLE_TYPE is array type, and sizeof(KEY_TABLE_TYPE) gives full
size of array. However what is wanted here is size of array argument
in stack, so change sizeof(KEY_TABLE_TYPE) to sizeof(void*). This
gives boost in speed for camellia cipher.

On AMD Phenom II, x86-64:


 $ tests/benchmark --cipher-repetitions 10 cipher camellia128
 Running each test 10 times.
                 ECB/Stream         CBC             CFB             OFB             CTR
              --------------- --------------- --------------- --------------- ---------------
 CAMELLIA128    250ms   240ms   270ms   260ms   250ms   250ms   260ms   250ms   340ms   330ms


 $ tests/benchmark --cipher-repetitions 10 cipher camellia128
 Running each test 10 times.
                 ECB/Stream         CBC             CFB             OFB             CTR
              --------------- --------------- --------------- --------------- ---------------
 CAMELLIA128    140ms   130ms   150ms   160ms   150ms   150ms   150ms   140ms   220ms   220ms

 - Add GNU style changelog

Signed-off-by: Jussi Kivilinna <>
7 years agoAdd x86_64 support for AES-NI
Jussi Kivilinna [Fri, 16 Nov 2012 08:44:54 +0000 (10:44 +0200)]
Add x86_64 support for AES-NI

* cipher/rijndael.c [ENABLE_AESNI_SUPPORT]: Enable USE_AESNI on x86-64.
(do_setkey) [USE_AESNI_is_disabled_here]: Use %[key] and %[ksch]
directly as registers instead of using temporary register %%esi.
[USE_AESNI] (do_aesni_enc_aligned, do_aesni_dec_aligned, do_aesni_cfb,
do_aesni_ctr, do_aesni_ctr_4): Use %[key] directly as register instead
of using temporary register %%esi.
[USE_AESNI] (do_aesni_cfb, do_aesni_ctr, do_aesni_ctr_4): Change %[key]
from generic "g" type to register "r".
* src/hwfeatures.c (_gcry_detect_hw_features) [__x86_64__]: Do not
clear AES-NI feature flag.

AES-NI assembler uses %%esi for key-material pointer register. However
%[key] can be marked as "r" (register) and automatically be 64bit on
x86-64 and be 32bit on i386.

So use %[key] for pointer register instead of %esi and that way make
same AES-NI code work on both x86-64 and i386.

 - Add GNU style changelog
 - Fixed do_setkey changes, use %[ksch] for output instead of %[key]
 - Changed [key] assembler arguments from "g" to "r" to force use of
   registers in all cases (when tested v1, "g" did work as indented
   and %[key] mapped to register on i386 and x86-64, but that might
   not happen always).

Signed-off-by: Jussi Kivilinna <>
7 years agoFix cpuid vendor-id check for i386 and x86-64
Jussi Kivilinna [Fri, 16 Nov 2012 08:44:49 +0000 (10:44 +0200)]
Fix cpuid vendor-id check for i386 and x86-64

* src/hwfeatures.c (detect_x86_64_gnuc, detect_ia32_gnuc): Allow
Intel features be detect from CPU by other vendors too.

detect_x86_64_gnuc() and detect_ia32_gnuc() incorrectly exclude Intel
features on all other vendor CPUs. What we want here, is to detect if
CPU from any vendor support said Intel feature (in this case AES-NI).

 - Add GNU style changelog

Signed-off-by: Jussi Kivilinna <>
7 years agoFix hwdetect assembler clobbers
Jussi Kivilinna [Fri, 16 Nov 2012 08:44:44 +0000 (10:44 +0200)]
Fix hwdetect assembler clobbers

* src/hwfeatures.c (detect_x86_64_gnuc): Add missing %ebx assembler
(detect_x86_64_gnuc, detect_ia32_gnuc) [ENABLE_PADLOCK_SUPPORT]: Add
missing %ecx assembler clobbers.

detect_x86_64_gnuc() and detect_ia32_gnuc() have missing clobbers in
assembler statements. "%ebx" is missing in x86-64, probably because
copy-paste error (i386 code saves and restores %ebx to/from stack).
"%ecx" is missing from PadLock detection.

 - add GNU style changelog

Signed-off-by: Jussi Kivilinna <>
7 years agoUse configure test for aligned attribute.
Werner Koch [Wed, 21 Nov 2012 10:47:35 +0000 (11:47 +0100)]
Use configure test for aligned attribute.

* (HAVE_GCC_ATTRIBUTE_ALIGNED): New test and ac_define.
* cipher/cipher-internal.h, cipher/rijndael.c, random/rndhw.c: Use new
macro instead of a fixed test for __GNUC__.

We assume that compilers that grok "__attribute__ ((aligned (16)))"
implement that in the same way as gcc does.  In case it turns out
that this is not the case we will need to do two more things: Detect
such different behaviour and come up with a construct to allows the
use of that other style of alignment forcing.

7 years agoFix segv with AES-NI on some platforms.
Werner Koch [Wed, 21 Nov 2012 09:35:28 +0000 (10:35 +0100)]
Fix segv with AES-NI on some platforms.

* cipher/rijndael.c (RIJNDAEL_context): Align on 16 bytes.

The trigger for this problem is the allocation of the context in the
selftest functions.  The other code paths use a 16 byte alignment
anyway by means of the allocation of the context in cipher.c
Thanks to Gentoo hacker Joakim Tjernlund for figuring out the reason
of this problem.

GnuPG-bug-id: 1452

7 years agoImprove parsing of the GIT revision number.
Werner Koch [Fri, 16 Nov 2012 09:57:26 +0000 (10:57 +0100)]
Improve parsing of the GIT revision number.

* (mmm4_revision): Use git rev-parse.

7 years agoFix extern inline use for gcc > 4.3 in c99 mode
Werner Koch [Thu, 8 Nov 2012 14:38:44 +0000 (15:38 +0100)]
Fix extern inline use for gcc > 4.3 in c99 mode

* mpi/mpi-inline.h [!G10_MPI_INLINE_DECL]: Take care of changed extern
inline semantics in gcc.

I am not use how this will work out with non-gcc. However, we had no
problems in the past and thus this change is the least invasive for
non-gcc compilers.

GnuPG-bug-id: 1406, 1435

7 years agoFix memory leak in gcry_pk_testkey for ECC.
Werner Koch [Wed, 7 Nov 2012 14:02:06 +0000 (15:02 +0100)]
Fix memory leak in gcry_pk_testkey for ECC.

* cipher/ecc.c (check_secret_key): Restructure for easier allocation
tracking.  Fix memory leak.

7 years agoPrepare for a backported interface in 1.5.1.
Werner Koch [Mon, 5 Nov 2012 19:28:03 +0000 (20:28 +0100)]
Prepare for a backported interface in 1.5.1.

* Bump LT version at C20/A0/R0 to adjust for a planned
API update in 1.5.1.

7 years agoAdjust for stricter autoconf requirements.
Werner Koch [Mon, 5 Nov 2012 18:38:58 +0000 (19:38 +0100)]
Adjust for stricter autoconf requirements.

* Fix usage of AC_LANG_PROGRAM.

7 years agoUpdate build helper scripts
Werner Koch [Mon, 5 Nov 2012 18:35:53 +0000 (19:35 +0100)]
Update build helper scripts

* config.guess, config.sub: Update to version 2012-07-31.
* Update to version 2.4.2.
* install-sh, m4/libtool.m4, m4/ltoptions.m4, m4/ltversion.m4
* m4/lt~obsolete.m4: Update to autoconf 2.69 versions.

7 years agoDo not distribute a copy of gitlog-to-changelog.
Werner Koch [Mon, 5 Nov 2012 18:28:57 +0000 (19:28 +0100)]
Do not distribute a copy of gitlog-to-changelog.

(gen-ChangeLog): Require an installed gitlog-to-changelog.
* scripts/gitlog-to-changelog: Remove.

* README.SVN: Remove.

7 years agoAllow building with w64-mingw32
Werner Koch [Mon, 5 Nov 2012 18:21:51 +0000 (19:21 +0100)]
Allow building with w64-mingw32

* <--build-w32>: Support the w64-mingw32 toolchain.  Also
prepare for 64 bit building.
<git-setup>: Remove option -c from chmod.

7 years agoSwitch to the new automagic beta numbering scheme.
Werner Koch [Mon, 5 Nov 2012 18:17:52 +0000 (19:17 +0100)]
Switch to the new automagic beta numbering scheme.

* Add all the required m4 magic.

7 years agoAvoid dereferencing pointer right after the end
Werner Koch [Mon, 5 Nov 2012 18:01:01 +0000 (19:01 +0100)]
Avoid dereferencing pointer right after the end

* mpi/mpicoder.c (do_get_buffer): Check the length before derefing P.

Christian Grothoff found this bug using Valgrind.

7 years agoMake ancient test program useful again.
Werner Koch [Tue, 23 Oct 2012 15:52:38 +0000 (17:52 +0200)]
Make ancient test program useful again.

* tests/testapi.c (test_sexp): Adjust to current API.  Print the
return code.  Mark unused args.
(test_genkey): Mark unused args.
(main): Do not pass NULL to printf.

7 years agoFixed indentation of sexp.c
Werner Koch [Tue, 23 Oct 2012 15:49:35 +0000 (17:49 +0200)]
Fixed indentation of sexp.c


Some functions used to be intended the old way.  Changed this to GNU

7 years agotests: Add ECC key generation tests.
Werner Koch [Thu, 18 Oct 2012 09:30:20 +0000 (11:30 +0200)]
tests: Add ECC key generation tests.

* tests/keygen.c (check_generated_ecc_key): New.
(check_ecc_keys): New.
(main): Call simple ECC checks.

Although benchmark.c does ECC key generation, it does not call
gcry_pk_testkey.  We do it here.  Note that we should do some more
checks, for example checking that all curve parameters are available
and match the specs.

7 years agoPBKDF2: Allow empty passphrase.
Milan Broz [Mon, 29 Oct 2012 16:18:09 +0000 (17:18 +0100)]
PBKDF2: Allow empty passphrase.

* cipher/kdf.c (gcry_kdf_derive): Allow empty passphrase for PBKDF2.
* tests/t-kdf.c (check_pbkdf2): Add test case for above.

While it is insecure, the PBKDF2 implementations usually
allows to derive key only from salt.

This particular case is used e.g. in cryptsetup when
you use empty file as keyfile for LUKS keyslot.

Test vector is compared with two independent implementations.

Signed-off-by: Milan Broz <>
7 years agoReplace deliberate division by zero with _gcry_divide_by_zero.
Xi Wang [Tue, 14 Aug 2012 22:54:40 +0000 (18:54 -0400)]
Replace deliberate division by zero with _gcry_divide_by_zero.

* mpi/mpi-pow.c: Replace 1 / msize.
* mpi/mpih-div.c: Replace 1 / dsize.
* src/misc.c: Add _gcry_divide_by_zero.

1) Division by zero doesn't "provoke a signal" on architectures
   like PowerPC.

2) C compilers like clang will optimize away these divisions, even
   though the code tries "to make the compiler not remove" them.

This patch redirects these cases to _gcry_divide_by_zero.

7 years agoClear AESNI feature flag for x86_64.
Werner Koch [Thu, 21 Jun 2012 09:10:39 +0000 (11:10 +0200)]
Clear AESNI feature flag for x86_64.

* src/hwfeatures.c (_gcry_detect_hw_features) [__x86_64__]: Clear
AESNI feature flag.

7 years agoBeautify last change.
Werner Koch [Thu, 21 Jun 2012 09:09:06 +0000 (11:09 +0200)]
Beautify last change.

* cipher/rijndael.c: Replace C99 feature from last patch.  Keep cpp
lines short.
* random/rndhw.c: Keep cpp lines short.
* src/hwfeatures.c (_gcry_detect_hw_features): Make cpp def chain
better readable.

7 years agoEnable VIA Padlock on x86_64 platforms
Rafaël Carré [Fri, 20 Apr 2012 17:52:01 +0000 (13:52 -0400)]
Enable VIA Padlock on x86_64 platforms

  * cipher/rijndael.c: Duplicate x86 assembly and convert to x86_64.
  * random/rndhw.c: Likewise.
  * src/hwfeatures.c: Likewise.
Changes made to the x86 assembly:
- *l -> *q (long -> quad)
- e** registers -> r** registers (use widest registers available)
- don't mess with ebx GOT register

Tested with make check on VIA Nano X2 L4350

Signed-off-by: Rafaël Carré <>
7 years agoAdd curve aliases from RFC-5656.
Werner Koch [Mon, 14 May 2012 08:26:25 +0000 (10:26 +0200)]
Add curve aliases from RFC-5656.

* cipher/ecc.c (curve_aliases): Add "nistp???" entries.

7 years agoAdd authors with a DCO to AUTHORS.
Werner Koch [Wed, 25 Apr 2012 14:35:10 +0000 (16:35 +0200)]
Add authors with a DCO to AUTHORS.


7 years agoState new contribution rules.
Werner Koch [Mon, 16 Apr 2012 09:24:32 +0000 (11:24 +0200)]
State new contribution rules.

* doc/DCO: New.
* doc/HACKING: Document new rules.

7 years agoAdd GCRYCTL_SET_ENFORCED_FIPS_FLAG command.
Tomas Mraz [Wed, 4 Apr 2012 12:17:09 +0000 (14:17 +0200)]

* doc/gcrypt.texi: Add documentation of the new command.
* src/fips.c (_gcry_enforced_fips_mode): Report the enforced fips mode
only when fips mode is enabled.
(_gcry_set_enforced_fips_mode): New function.
* src/g10lib.h: Add the _gcry_set_enforced_fips_mode prototype.
* src/global.c (_gcry_vcontrol): Handle the new command.

7 years agoRework selftest in idea.c.
Ulrich Müller [Thu, 16 Feb 2012 20:58:52 +0000 (21:58 +0100)]
Rework selftest in idea.c.

* cipher/idea.c (do_setkey): Execute selftest when first called.
(decrypt_block): Remove commented-out code.
(selftest): Execute all selftests. Return NULL on success, or
string in case of error.

7 years agoUpdate NEWS and AUTHORS.
Werner Koch [Thu, 16 Feb 2012 19:57:05 +0000 (20:57 +0100)]
Update NEWS and AUTHORS.


7 years agoFix missing prototype.
Werner Koch [Thu, 16 Feb 2012 19:50:52 +0000 (20:50 +0100)]
Fix missing prototype.

* src/g10lib.h (_gcry_secmem_module_init): Make it a real prototype.

7 years agoAdd support for the IDEA cipher.
Ulrich Müller [Wed, 11 Jan 2012 12:20:48 +0000 (13:20 +0100)]
Add support for the IDEA cipher.

Adapt idea.c to the Libgcrypt framework.
Add IDEA to cipher_table and to the build system.

Patents on IDEA have expired:
  Europe: EP0482154 on 2011-05-16,
  Japan:  JP3225440 on 2011-05-16,
  U.S.:   5,214,703 on 2012-01-07.

* Add idea to the list of available ciphers.
Define USE_IDEA if idea is enabled.
* cipher/cipher.c (cipher_table): Add entry for IDEA.
* cipher/idea.c: Update comment about patents.
Include proper header files and remove redundant declarations.
(expand_key, cipher, do_setkey, encrypt_block, decrypt_block):
Define function arguments as const where appropriate.
(cipher): Test for !WORDS_BIGENDIAN instead of LITTLE_ENDIAN_HOST.
(do_setkey, decrypt_block): Don't call selftest.
(idea_setkey): New function, wrapper for do_setkey.
(idea_encrypt): New function, wrapper for encrypt_block.
(_gcry_cipher_spec_idea): Define.
* cipher/ (EXTRA_libcipher_la_SOURCES): Add idea.c.
* src/cipher.h (_gcry_cipher_spec_idea): Declare.
* tests/basic.c (check_ciphers): Add GCRY_CIPHER_IDEA.

7 years agoInclude an IDEA implementation.
Werner Koch [Mon, 9 Jan 2012 13:11:41 +0000 (14:11 +0100)]
Include an IDEA implementation.

The code is the old IDEA test code, written by me back in 1997 and
distributed on a Danish FTP server.  This commit is only for
reference.  To use the code it has to be adjusted to the Libgcrypt

7 years agoFix pthread locking and remove defunctional support for static lock init.
Marcus Brinkmann [Tue, 3 Jan 2012 21:04:30 +0000 (22:04 +0100)]
Fix pthread locking and remove defunctional support for static lock init.

* src/ath.c: Include assert.h.
(ath_mutex_destroy, ath_mutex_lock, ath_mutex_unlock): Dereference LOCK.
* src/g10lib.h (_gcry_secmem_module_init): New declaration.
* src/global.c (global_init): Call _gcry_secmem_module_init.
* src/secmem.c (_gcry_secmem_module_init): New function.

7 years agoAdd alignment tests for the cipher tests.
Werner Koch [Fri, 16 Dec 2011 21:02:18 +0000 (22:02 +0100)]
Add alignment tests for the cipher tests.

* tests/basic.c (check_one_cipher): Factor most code out to
check_one_cipher_core.  Call that core function several times using
different alignment settings.
(check_one_cipher_core): New.  Add extra args to allow alignment

As reported in bug#1384 Serpent fails on a sparc64.  One problem with
the test code is that due to the bus error the error message won't be

8 years agotests/prime: Add option to create a well known private key.
Werner Koch [Wed, 7 Dec 2011 15:52:03 +0000 (16:52 +0100)]
tests/prime: Add option to create a well known private key.

* tests/prime.c (print_mpi, create_42prime): New.
(main): Add option --42.

8 years agoDo not build the random-daemon by make distcheck.
Werner Koch [Thu, 1 Dec 2011 13:36:25 +0000 (14:36 +0100)]
Do not build the random-daemon by make distcheck.

* (DISTCHECK_CONFIGURE_FLAGS): Disable building of the
random daemon

8 years agoGenerate the ChangeLog from commit logs.
Werner Koch [Thu, 1 Dec 2011 13:20:31 +0000 (14:20 +0100)]
Generate the ChangeLog from commit logs.

* scripts/gitlog-to-changelog: New script.  Taken from gnulib.
* scripts/git-log-fix: New file.
* scripts/git-log-footer: New file.
* doc/HACKING: Describe the ChangeLog policy
* ChangeLog: New file.
* (EXTRA_DIST): Add new files.
(gen-ChangeLog): New.
(dist-hook): Run gen-ChangeLog.

Rename all ChangeLog files to ChangeLog-2011.

8 years agoCompleted switch to a simpler thread model.
Werner Koch [Thu, 1 Dec 2011 12:55:06 +0000 (13:55 +0100)]
Completed switch to a simpler thread model.

This is only a first step.  We will need to either implement
pthread_atfork or - better - make use use POSIX RT semaphores.

8 years agoMake build_revision shorter for W32 use
Werner Koch [Tue, 8 Mar 2011 12:49:04 +0000 (13:49 +0100)]
Make build_revision shorter for W32 use

8 years agoaccept --with-libgpg-error-prefix as well as --with-gpg-error-prefix
Jim Meyering [Mon, 28 Nov 2011 12:46:16 +0000 (13:46 +0100)]
accept --with-libgpg-error-prefix as well as --with-gpg-error-prefix

* m4/gpg-error.m4: Update from git master.

8 years agotests: avoid write-beyond-end-of-heap buffer
Jim Meyering [Fri, 11 Nov 2011 10:38:19 +0000 (11:38 +0100)]
tests: avoid write-beyond-end-of-heap buffer

In libgcrypt's "make check" (latest from git), I was surprised to
see the "basic" test fail.  Here's a patch:

Avoid scary-looking (with MALLOC_CHECK_=3) "make check" test failure:

  *** glibc detected *** /h/j/w/co/libgcrypt/tests/.libs/lt-basic: free(): invalid
  pointer: 0x0000000001f9d080 ***
  ======= Backtrace: =========
  ======= Memory map: ========
  00400000-00411000 r-xp 00000000 08:08 2787510 /w/co/libgcrypt/tests/.libs/lt-basic

>From 722e6d470371bb3d995e0a6a67cd9c2ffd7bb664 Mon Sep 17 00:00:00 2001
From: Jim Meyering <>
Date: Fri, 11 Nov 2011 11:34:45 +0100
Subject: [PATCH] tests: avoid write-beyond-end-of-heap buffer

* basic.c (check_bulk_cipher_modes): Allocate one more byte in
each of the two test buffers.  Otherwise, running
"env -i MALLOC_CHECK_=3 ./basic" would abort.

8 years agoFactor cipher mode code out to separate files.
Werner Koch [Thu, 15 Sep 2011 16:55:28 +0000 (18:55 +0200)]
Factor cipher mode code out to separate files.

Fixed Changelog and Makefile.
Added missing cipher-aeswrap.c file.

8 years agoRemoved deprecated debug macros.
Werner Koch [Thu, 15 Sep 2011 16:24:23 +0000 (18:24 +0200)]
Removed deprecated debug macros.

8 years agoRemoved the module registration interface
Werner Koch [Thu, 15 Sep 2011 16:08:55 +0000 (18:08 +0200)]
Removed the module registration interface

The module registration interface is not widely used but complicates
the internal operation of Libgcrypt a lot.  It also does not allow for
efficient implementation of new algorithm or cipher modes.  Further the
required locking of all access to internal module data or functions
would make it hard to come up with a deadlock free pthread_atfork
implementation.  Thus we remove the entire subsystem.

Note that the module system is still used internally but it is now
possible to change it without breaking the ABI.

In case a feature to add more algorithms demanded in the future, we
may add one by dlopening modules at startup time from a dedicated

8 years agoRemoved the AC interface (gcry_ac_*)
Werner Koch [Thu, 15 Sep 2011 14:54:33 +0000 (16:54 +0200)]
Removed the AC interface (gcry_ac_*)

This interface has long been deprecated.  It was also initially only
declared as an experimental interface.  It added its own kind of
complexity and we found that it does not make applications easier to
read.  Modern features of Libgcrypt were not supported and its removal
reduces the SLOC which is a Good Thing from a security POV.

8 years agoFix an endless loop in hmac256 --binary
Werner Koch [Thu, 15 Sep 2011 09:47:37 +0000 (11:47 +0200)]
Fix an endless loop in hmac256 --binary

8 years agoAdd a man page for hmac256.
Werner Koch [Thu, 15 Sep 2011 09:43:10 +0000 (11:43 +0200)]
Add a man page for hmac256.

We also include the man page in the manual.

8 years agoTypo fix in gcrypt.texi
Werner Koch [Thu, 15 Sep 2011 08:36:43 +0000 (10:36 +0200)]
Typo fix in gcrypt.texi

8 years agoFix a problem with select and high fds.
Werner Koch [Thu, 8 Sep 2011 08:53:12 +0000 (10:53 +0200)]
Fix a problem with select and high fds.

If on systems where the maximum number of fds may be dynamically
configured to a value of FD_MAXSIZE or higher and the RNG is first
used after more than FD_SETSIZE-1 descriptors are in use, we disable
the progress messages from the RNG.  A better solution would be too
use poll but that requires more tests.

The same problem exists in rndunix.c - however this rng is only used
on old Unices and I assume that they don't feature dynamically
configured maximum fd sizes.

8 years agoFactor cipher mode code out to separate files.
Werner Koch [Wed, 3 Aug 2011 19:34:39 +0000 (21:34 +0200)]
Factor cipher mode code out to separate files.

This is a preparation for adding more modes which are more complicated
and thus ask for separate file.  For uniformity we do this for all
modes except ECB.  It has also the advantage that it makes CPU specific
variants of the code more easy to implement (e.g. the XOR operations).

8 years agoAllow building for ARM thumb. Similar to bug#1202.
Werner Koch [Mon, 4 Jul 2011 10:45:44 +0000 (12:45 +0200)]
Allow building for ARM thumb.  Similar to bug#1202.

8 years agoFixed a bug in the gcry_cipher_get_algo_keylen and gcry_cipher_get_algo_blklen
Werner Koch [Wed, 29 Jun 2011 13:26:22 +0000 (15:26 +0200)]
Fixed a bug in the gcry_cipher_get_algo_keylen and gcry_cipher_get_algo_blklen

Contrary to the documentation those functions aborted if an invalid
algorithm was passed.  The same happened for the corresponding
subcommands of gcry_cipher_algo_info.

8 years agoPrepare a new development branch
Werner Koch [Wed, 29 Jun 2011 10:47:26 +0000 (12:47 +0200)]
Prepare a new development branch

8 years agoPost release updates
Werner Koch [Wed, 29 Jun 2011 09:40:39 +0000 (11:40 +0200)]
Post release updates

8 years agoPrepare for the 1.5.0 release. libgcrypt-1.5.0
Werner Koch [Wed, 29 Jun 2011 08:57:04 +0000 (10:57 +0200)]
Prepare for the 1.5.0 release.

8 years agoUpdate config.{sub,guess}
Werner Koch [Wed, 29 Jun 2011 08:56:22 +0000 (10:56 +0200)]
Update config.{sub,guess}

8 years agoImplement the --debug option for the keygrip test.
Werner Koch [Wed, 29 Jun 2011 08:40:57 +0000 (10:40 +0200)]
Implement the --debug option for the keygrip test.

8 years agoSuggest to use GCRYMPI_FMT_USG with gcry_sexp_nth_mpi.
Werner Koch [Mon, 13 Jun 2011 17:15:38 +0000 (19:15 +0200)]
Suggest to use GCRYMPI_FMT_USG with gcry_sexp_nth_mpi.

8 years agoFixed a pkcs#1 v1.5 flaw regarding leading zero bytes
Werner Koch [Mon, 13 Jun 2011 10:33:08 +0000 (12:33 +0200)]
Fixed a pkcs#1 v1.5 flaw regarding leading zero bytes

With these changes the entire new pkcs#1 test suite passes fine.

The leading zero bytes used to appear due to mixed signed/unsigned use
of our internal representation of the values as MPIs.  The changed code
also detected another bug in the DSA selftest which used the pkcs1
flag - this was certainly wrong but didn't throw an error.  The code
in GnuPG does the right thing thus I believe not too many applications
got it as wrong as we in our own selftest.

8 years agoAdd a full set of pkcs#1 v2 test vectors
Werner Koch [Mon, 13 Jun 2011 10:28:03 +0000 (12:28 +0200)]
Add a full set of pkcs#1 v2 test vectors

For v1.5 we use somewhat unofficial test vectors we found on the
rsalabs FTP server.  There is a little awk script which helped us to
convert them.  All the test vectors are in separate files with C
tables to keep the actual test program readable.

We detected a few flaws in our pkcs1 implementation which will be
fixed with the next commit.

8 years agoFixed leading zero problems in PSS and OAEP. ueno-pss
Werner Koch [Fri, 10 Jun 2011 08:52:18 +0000 (10:52 +0200)]
Fixed leading zero problems in PSS and OAEP.

8 years agoAdd the PSS test vectors
Werner Koch [Thu, 9 Jun 2011 18:53:32 +0000 (20:53 +0200)]
Add the PSS test vectors

8 years agoAdd OAEP regression test.
Werner Koch [Thu, 9 Jun 2011 16:54:20 +0000 (18:54 +0200)]
Add OAEP regression test.

8 years agoAdd a small comment.
Werner Koch [Thu, 9 Jun 2011 13:47:15 +0000 (15:47 +0200)]
Add a small comment.

8 years agoUse octet_string_from_mpi in oaep_decode.
Werner Koch [Thu, 9 Jun 2011 12:53:10 +0000 (14:53 +0200)]
Use octet_string_from_mpi in oaep_decode.

This is to remove duplicated code.  I had to move
octet_string_from_mpi more to the top of the file.

8 years agoAdd random-override parameter to the PK functions to allow better regression testing.
Werner Koch [Thu, 9 Jun 2011 12:44:18 +0000 (14:44 +0200)]
Add random-override parameter to the PK functions to allow better regression testing.

8 years agoExpect mHash as input to the PSS functions.
Werner Koch [Thu, 9 Jun 2011 12:00:13 +0000 (14:00 +0200)]
Expect mHash as input to the PSS functions.

The old code did the entire hashing of the message.  The reason we
want the hashed message as input is that a a message might be pretty
long and that the other padding schemes don't allow this either.

8 years agoMerge branch 'master' into ueno-pss
Werner Koch [Thu, 9 Jun 2011 07:05:15 +0000 (09:05 +0200)]
Merge branch 'master' into ueno-pss

Solved conflicts:

8 years agoRestructure pss_verify to match the description in rfc-3447.
Werner Koch [Thu, 9 Jun 2011 06:48:27 +0000 (08:48 +0200)]
Restructure pss_verify to match the description in rfc-3447.