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


6 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.

6 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.

6 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.

6 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 <>
6 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.

6 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 <>
6 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 <>
6 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

6 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]

6 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 <>
6 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 <>
6 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 <>
6 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 <>
6 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 <>
6 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 <>
6 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 <>
6 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.

6 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.

6 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.


6 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 <>
6 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 <>
6 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 <>
6 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 <>
6 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.

6 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

6 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.

6 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

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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.

6 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

6 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.

6 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 <>
6 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.

6 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.

6 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.

6 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é <>
6 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

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

7 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

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

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

7 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

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

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

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

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

7 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

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

7 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

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

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

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

7 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).

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

7 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:

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

7 years agoRestructure pss_encode to match the description in rfc-3447.
Werner Koch [Wed, 8 Jun 2011 18:18:42 +0000 (20:18 +0200)]
Restructure pss_encode to match the description in rfc-3447.

7 years agoRestructure oaep_decode to match the description in rfc-3447.
Werner Koch [Fri, 3 Jun 2011 15:13:47 +0000 (17:13 +0200)]
Restructure oaep_decode to match the description in rfc-3447.

This also takes the suggestion by Tom Ritter in account to avoid time
attacks.  Ueno's fixes posted to the ML are thus not needed.

7 years agoRestructure oaep_encode to match the description in rfc-3447.
Werner Koch [Tue, 31 May 2011 15:56:13 +0000 (17:56 +0200)]
Restructure oaep_encode to match the description in rfc-3447.

7 years agoAdd comments to the mgf1 function and speed it up.
Werner Koch [Tue, 31 May 2011 13:14:51 +0000 (15:14 +0200)]
Add comments to the mgf1 function and speed it up.

7 years agoAdd option --die to ease debugging
Werner Koch [Fri, 3 Jun 2011 14:38:11 +0000 (16:38 +0200)]
Add option --die to ease debugging

7 years agoLet gcry_pk_decrypt in non-raw mode return a verbatim buffer.
Werner Koch [Tue, 31 May 2011 09:08:12 +0000 (11:08 +0200)]
Let gcry_pk_decrypt in non-raw mode return a verbatim buffer.

The non-raw modes of gcry_pk_decrypt (i.e. pkcs1 or oaep un-padding)
are new and thus we can still change the semantics.

They now return a verbatim buffer and not anything which internally
has been interpreted as a signed integer.  In raw mode we still stick
to the old semantics which is usually fine because it is mostly used
with pkcs#1 padding and that guarantees that the return value may
never be interpreted as a signed MPI or shorted due to block type used
as the second byte.

7 years agoFixed pkcs#1 unpadding
Werner Koch [Mon, 30 May 2011 14:22:23 +0000 (16:22 +0200)]
Fixed pkcs#1 unpadding

Depending on the size of the used key the old code was not able to
cope with the missing leading zero byte of a pkcs#1 frame.  This is
due to the fact that we use MPIs for conveying the data and our MPIs
usually strip leading zero bytes.  The changed code should now behave
identical to the code used by GnuPG.

Also added a few more comments.

7 years agoFix double-free when un-padding invalid data.
Daiki Ueno [Fri, 27 May 2011 01:18:39 +0000 (10:18 +0900)]
Fix double-free when un-padding invalid data.

Also add invalid padding cases to the basic test.

7 years agoSupport PSS.
Daiki Ueno [Mon, 23 May 2011 09:25:16 +0000 (18:25 +0900)]
Support PSS.

7 years agoTell check_pubkey_* which PK algo is used.
Daiki Ueno [Tue, 24 May 2011 06:01:23 +0000 (15:01 +0900)]
Tell check_pubkey_* which PK algo is used.