6 years agoAdd AES bulk CBC decryption selftest
Jussi Kivilinna [Wed, 22 May 2013 11:11:10 +0000 (14:11 +0300)]
Add AES bulk CBC decryption selftest

* cipher/rinjdael.c (selftest_cbc_128): New.
(selftest): Call selftest_cbc_128.

Signed-off-by: Jussi Kivilinna <>
6 years agoChange AES bulk CTR encryption selftest use new selftest helper function
Jussi Kivilinna [Wed, 22 May 2013 11:11:04 +0000 (14:11 +0300)]
Change AES bulk CTR encryption selftest use new selftest helper function

* cipher/rinjdael.c: (selftest_ctr_128): Change to use new selftest
helper function.

Signed-off-by: Jussi Kivilinna <>
6 years agoConvert bulk CTR and CBC selftest functions in Camellia to generic selftest helper...
Jussi Kivilinna [Wed, 22 May 2013 11:10:59 +0000 (14:10 +0300)]
Convert bulk CTR and CBC selftest functions in Camellia to generic selftest helper functions

* cipher/ (libcipher_la_SOURCES): Add cipher-selftest files.
* cipher/camellia-glue.c (selftest_ctr_128, selftest_cbc_128): Change
to use the new selftest helper functions.
* cipher/cipher-selftest.c: New.
* cipher/cipher-selftest.h: New.

Convert selftest functions into generic helper functions for code sharing.

[v2]: use syslog for more detailed selftest error messages

Signed-off-by: Jussi Kivilinna <>
6 years agocamellia: add bulk CBC decryption selftest
Jussi Kivilinna [Wed, 22 May 2013 11:10:54 +0000 (14:10 +0300)]
camellia: add bulk CBC decryption selftest

* cipher/camellia-glue.c: (selftest_cbc_128): New selftest function for
bulk CBC decryption.
(selftest): Add call to selftest_cbc_128.

Add selftest for the parallel code paths in bulk CBC decryption.

Signed-off-by: Jussi Kivilinna <>
6 years agocamellia: Rename camellia_aesni_avx_x86-64.S to camellia-aesni-avx-amd64.S
Jussi Kivilinna [Wed, 22 May 2013 09:06:03 +0000 (12:06 +0300)]
camellia: Rename camellia_aesni_avx_x86-64.S to camellia-aesni-avx-amd64.S

* cipher/camellia_aesni_avx_x86-64.S: Remove.
* cipher/camellia-aesni-avx-amd64.S: New.
* cipher/ Use the new filename.
* Use the new filename.

Signed-off-by: Jussi Kivilinna <>
6 years agoFix indentation and save on string space.
Werner Koch [Thu, 25 Apr 2013 11:00:16 +0000 (12:00 +0100)]
Fix indentation and save on string space.

* cipher/ecc.c (generate_key): Use the same string for both fatal

6 years agompi_sub( r, a, b ) expects r to be initialized; other minor cleanup in ecc generate_k...
Andrey [Mon, 20 May 2013 04:34:48 +0000 (21:34 -0700)]
mpi_sub( r, a, b ) expects r to be initialized; other minor cleanup in ecc generate_key compliant key generation.

This fixes the 'make check' of libgcrypt.

6 years agoGenerate ECC keys Q=(x,y) as compliant keys, enabling their compact representation... compliant-ecc-keygen
Andrey [Thu, 9 May 2013 21:38:46 +0000 (14:38 -0700)]
Generate ECC keys Q=(x,y) as compliant keys, enabling their compact representation as simply x.

See for the method description and security proof.
This tweak doesn't change any format; it is only a preparation without any negative impact for future changes.

6 years agocipher: Fix regression in Padlock support.
Werner Koch [Thu, 18 Apr 2013 12:40:43 +0000 (14:40 +0200)]
cipher: Fix regression in Padlock support.

* cipher/rijndael.c (do_setkey): Remove dummy padlock key generation case
and use the standard one.

This is really a brown paper bag bug.  I should have been able to
fix it by a bit of code staring or bi-secting it myself.  Instead
Rafaël Carré did this and with the donation of a VIA nano board from
Stefan Krüger.  Thanks to both of you.

(regression since commit b825c5db17292988d261fefdc83cbc43d97d4b02)

Signed-off-by: Werner Koch <>
(cherry picked from commit f1f016855418aae561ede4472590d45a24ab4476)

6 years agompi: Yet another fix to get option flag munging right.
Werner Koch [Thu, 18 Apr 2013 12:40:43 +0000 (14:40 +0200)]
mpi: Yet another fix to get option flag munging right.

* cipher/ (o_flag_munging): Yet another fix.

6 years agompi: Make using gcc's -Ofast easier.
Werner Koch [Mon, 18 Mar 2013 08:02:35 +0000 (09:02 +0100)]
mpi: Make using gcc's -Ofast easier.

* cipher/ (o_flag_munging): Take -Ofast in account.

GnuPG-bug-id: 1468
(cherry picked from commit d313255350e6f397500ce23714ddec8780f32449)

6 years agoFix alignment problem in idea.c.
Werner Koch [Thu, 18 Apr 2013 12:40:43 +0000 (14:40 +0200)]
Fix alignment problem in idea.c.

* cipher/idea.c (cipher): Rework parameter use to fix alignment

* cipher/idea.c (FNCCAST_SETKEY, FNCCAST_CRYPT): Remove unused macros.

Signed-off-by: Werner Koch <>
Fix alignment problem in idea.c.

* cipher/idea.c (cipher): Rework parameter use to fix alignment

* cipher/idea.c (FNCCAST_SETKEY, FNCCAST_CRYPT): Remove unused macros.

Signed-off-by: Werner Koch <>
(cherry picked from 4cd279556777e02eda79973f68efaa4b741f9175)

6 years agoAdd some const attributes.
Vladimir Serbinenko [Thu, 18 Apr 2013 11:37:49 +0000 (13:37 +0200)]
Add some const attributes.

* cipher/md4.c (transform): Add const attribute.
* cipher/md5.c (transform): Ditto.
* cipher/rmd160.c (transform): Ditto.

This is the same as

Signed-off-by: Werner Koch <>
6 years agoFix alignment problem in serpent.c.
Vladimir Serbinenko [Thu, 18 Apr 2013 11:22:34 +0000 (13:22 +0200)]
Fix alignment problem in serpent.c.

* cipher/serpent.c (serpent_key_prepare): Fix misaligned access.
(serpent_setkey): Likewise.
(serpent_encrypt_internal): Likewise.
(serpent_decrypt_internal): Likewise.
(serpent_encrypt): Don't put an alignment-increasing cast.
(serpent_decrypt): Likewise.
(serpent_test): Likewise.

This is a port of the fix for the Libgcrypt code in GRUB:
GRUB is FSF copyrighted and thus we can use this code without a DCO.

Note that the above fix was not correct and failed the selftests, thus
I fixed this fix.

GnuPG-bug-id: 1384
Signed-off-by: Werner Koch <>
(cherry picked from commit 8eab66ad6852ec985bfb1e7fec35981d5e31148a)

6 years agoFix multiply by zero in gcry_mpi_ec_mul.
Werner Koch [Tue, 16 Apr 2013 16:59:22 +0000 (18:59 +0200)]
Fix multiply by zero in gcry_mpi_ec_mul.

* mpi/ec.c (_gcry_mpi_ec_mul_point): Handle case of SCALAR == 0.
* tests/t-mpi-point.c (basic_ec_math): Add a test case for this.

Signed-off-by: Werner Koch <>
6 years agoAdd macros to return pre-defined MPIs.
Werner Koch [Mon, 15 Apr 2013 09:52:54 +0000 (11:52 +0200)]
Add macros to return pre-defined MPIs.

(_gcry_mpi_get_const): New private function.
* src/visibility.c (_gcry_mpi_get_const): New.
* src/visibility.h: Mark it visible.

Signed-off-by: Werner Koch <>
6 years agoFix addition of EC points.
Werner Koch [Mon, 15 Apr 2013 09:11:58 +0000 (11:11 +0200)]
Fix addition of EC points.

* mpi/ec.c (_gcry_mpi_ec_add_points): Fix case of P1 given in affine

This was a plain copy and paste error, which was found due to explicit
use of affine coordinates by GNUnet's new pseudonyms code.

Signed-off-by: Werner Koch <>
6 years agoAdd hack to allow using an "ecc" key for "ecdsa" or "ecdh".
Werner Koch [Thu, 11 Apr 2013 22:16:24 +0000 (00:16 +0200)]
Add hack to allow using an "ecc" key for "ecdsa" or "ecdh".

* cipher/pubkey.c (sexp_to_key): Add optional arg USE.
(gcry_pk_encrypt, gcry_pk_decrypt): Call sexp_to_key with usage sign.
(gcry_pk_sign, gcry_pk_verify): Call sexp_to_key with usage encrypt.
* tests/basic.c (show_sexp): New.
(check_pubkey_sign): Print test number and add cases for ecc.
(check_pubkey_sign_ecdsa): New.
(do_check_one_pubkey): Divert to new function.

The problem we try to address is that in the mdoule specs both, ECDSA
and ECDH have the same alias name "ecc".  This patch allows to use for
example gcry_pk_verify with a key that has only "ecc" in it.

Signed-off-by: Werner Koch <>
6 years agoAdd gcry_pubkey_get_sexp.
Werner Koch [Thu, 11 Apr 2013 18:27:46 +0000 (20:27 +0200)]
Add gcry_pubkey_get_sexp.

* src/ (GCRY_PK_GET_PUBKEY): New.
(gcry_pubkey_get_sexp): New.
* src/visibility.c (gcry_pubkey_get_sexp): New.
* src/visibility.h (gcry_pubkey_get_sexp): Mark visible.
* src/libgcrypt.def, src/libgcrypt.vers: Add new function.
* cipher/pubkey-internal.h: New.
* cipher/ (libcipher_la_SOURCES): Add new file.
* cipher/ecc.c: Include pubkey-internal.h
(_gcry_pk_ecc_get_sexp): New.
* cipher/pubkey.c: Include pubkey-internal.h and context.h.
(_gcry_pubkey_get_sexp): New.
* src/context.c (_gcry_ctx_find_pointer): New.
* src/cipher-proto.h: Add _gcry_pubkey_get_sexp.
* tests/t-mpi-point.c (print_sexp): New.
(context_param, basic_ec_math_simplified): Add tests for the new

* (NEED_GPG_ERROR_VERSION): Set to 1.11.
(AH_BOTTOM) Add error codes from gpg-error 1.12
* src/g10lib.h (fips_not_operational): Use GPG_ERR_NOT_OPERATIONAL.

* mpi/ec.c (_gcry_mpi_ec_get_mpi): Fix computation of Q.
(_gcry_mpi_ec_get_point): Ditto.

While checking the new code I figured that the auto-computation of Q
must have led to a segv.  It seems we had no test case for that.

Signed-off-by: Werner Koch <>
6 years agoRemove obsolete warning note from gcry_pk_keygrip.
Werner Koch [Thu, 11 Apr 2013 08:43:05 +0000 (10:43 +0200)]
Remove obsolete warning note from gcry_pk_keygrip.


The keygrip is for a long time now a standard feature of libgcrypt.
The existance of the warning comment in gcrypt.h was an oversight.

Signed-off-by: Werner Koch <>
6 years agoRemove unused code.
Werner Koch [Thu, 11 Apr 2013 08:38:22 +0000 (10:38 +0200)]
Remove unused code.

* cipher/pubkey.c (_gcry_pk_module_lookup, _gcry_pk_module_release)
(_gcry_pk_get_elements): Remove.

This code was only used by the removed ac interface.

Signed-off-by: Werner Koch <>
6 years agoClarify DCO for Werner Koch
Werner Koch [Fri, 5 Apr 2013 16:28:01 +0000 (18:28 +0200)]
Clarify DCO for Werner Koch


All work on Libgcrypt done by Werner Koch is work made for hire by his
company.  Added as a mail style comment to the signed-off-by address.

6 years agoMake the Q parameter optional for ECC signing.
Werner Koch [Fri, 5 Apr 2013 16:08:36 +0000 (18:08 +0200)]
Make the Q parameter optional for ECC signing.

* cipher/ecc.c (ecc_sign): Remove the need for Q.
* cipher/pubkey.c (sexp_elements_extract_ecc): Make Q optional for a
private key.
(sexp_to_key): Add optional arg R_IS_ECC.
(gcry_pk_sign): Do not call gcry_pk_get_nbits for ECC keys.
* tests/pubkey.c (die): Make sure to print a LF.
(check_ecc_sample_key): New.
(main): Call new test.

Q is the actual public key which is not used for signing.  Thus we
can make it optional and even speed up the signing by parsing less

Note: There seems to be a memory leak somewhere.  Running tests/pubkey
with just the new test enabled shows it.

Signed-off-by: Werner Koch <>
6 years agoAdd test case for SCRYPT and rework the code.
Werner Koch [Fri, 5 Apr 2013 10:23:41 +0000 (12:23 +0200)]
Add test case for SCRYPT and rework the code.

* tests/t-kdf.c (check_scrypt): New.
(main): Call new test.

* Support disabling of the scrypt algorithm.  Make KDF
enabling similar to the other algorithm classes.  Disable scrypt if we
don't have a 64 bit type.
* cipher/memxor.c, cipher/memxor.h: Remove.
* cipher/scrypt.h: Remove.
* cipher/kdf-internal.h: New.
* cipher/ Remove files.  Add new file.  Move scrypt.c to
* src/ (GCRY_KDF_SCRYPT): Change value.
* cipher/kdf.c (pkdf2): Rename to _gcry_kdf_pkdf2.
(_gcry_kdf_pkdf2): Don't bail out for SALTLEN==0.
(gcry_kdf_derive): Allow for a passwordlen of zero for scrypt.  Check
for SALTLEN > 0 for GCRY_KDF_PBKDF2.  Pass algo to _gcry_kdf_scrypt.
(gcry_kdf_derive) [!USE_SCRYPT]: Return an error.
* cipher/scrypt.c: Replace memxor.h by bufhelp.h.  Replace scrypt.h by
kdf-internal.h.  Enable code only if HAVE_U64_TYPEDEF is defined.
Replace C99 types uint64_t, uint32_t, and uint8_t by libgcrypt types.
(_SALSA20_INPUT_LENGTH): Remove underscore from identifier.
(_scryptBlockMix): Replace memxor by buf_xor.
(_gcry_kdf_scrypt): Use gcry_malloc and gcry_free.  Check for integer
overflow.  Add hack to support blocksize of 1 for tests.  Return
errors from calls to _gcry_kdf_pkdf2.

* cipher/kdf.c (openpgp_s2k): Make static.

This patch prepares the addition of more KDF functions, brings the
code into Libgcrypt shape, adds a test case and makes the code more
robust.  For example, scrypt would have fail silently if Libgcrypt was
not build with SHA256 support.  Also fixed symbol naming for systems
without a visibility support.

Signed-off-by: Werner Koch <>
6 years agoAdd the SCRYPT KDF function
Christian Grothoff [Thu, 4 Apr 2013 14:12:16 +0000 (16:12 +0200)]
Add the SCRYPT KDF function

* scrypt.c, scrypt.h: New files.
* memxor.c, memxor.h: New files.
* cipher/ Add new files.
* cipher/kdf.c (gcry_kdf_derive): Support GCRY_KDF_SCRYPT.
* src/ (GCRY_KDF_SCRYPT): New.

Signed-off-by: Christian Grothoff <>
I added the ChangeLog entry and the missing signed-off line.

Signed-off-by: Werner Koch <>
6 years agoDoc fix.
Werner Koch [Tue, 26 Mar 2013 20:21:41 +0000 (21:21 +0100)]
Doc fix.


6 years agoAdd DCO by Christian Grothoff
Werner Koch [Fri, 22 Mar 2013 10:57:46 +0000 (11:57 +0100)]
Add DCO by Christian Grothoff


6 years agoReplace deprecated AM_CONFIG_HEADER macro.
Werner Koch [Fri, 22 Mar 2013 10:44:15 +0000 (11:44 +0100)]
Replace deprecated AM_CONFIG_HEADER macro.


6 years agoDisable AES-NI support if as does not support SSSE3.
Werner Koch [Fri, 22 Mar 2013 10:41:11 +0000 (11:41 +0100)]
Disable AES-NI support if as does not support SSSE3.

(ENABLE_AESNI_SUPPORT): Do not define without SSSE3 support.
and definition.

For example the assembler of FreeBSD 7.3 does not know about pshufb
and thus rijndael.c can't be compiled without using
--disable-aesni-support.  This check that the toolchain can use SSSE3
instructions before trying to build with AES_NI support.

6 years agoFix make dependency regression.
Werner Koch [Thu, 21 Mar 2013 14:19:34 +0000 (15:19 +0100)]
Fix make dependency regression.

* src/ (libgcrypt_la_DEPENDENCIES): Add missing backslash.
Reported by LRN.

Fixes-commit: 09ac5d8

6 years agoUse finer grained on-the-fly helper computations for EC.
Werner Koch [Wed, 20 Mar 2013 16:23:54 +0000 (17:23 +0100)]
Use finer grained on-the-fly helper computations for EC.

* src/ec-context.h (mpi_ec_ctx_s): Replace NEED_SYNC by a bitfield.
* mpi/ec.c (ec_p_sync): Remove.
(ec_get_reset, ec_get_a_is_pminus3, ec_get_two_inv_p): New.
(ec_p_init): Use ec_get_reset.
(_gcry_mpi_ec_set_mpi, _gcry_mpi_ec_dup_point)
(_gcry_mpi_ec_add_points): Replace ec_p_sync by the ec_get_ accessors.

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.

NB: Despite of this change in, there is no support for 64
bit Windows yet.  The change has only be done to eventually allow to
work on a W64 version.

6 years agoProvide GCRYPT_VERSION_NUMBER macro, add build info to the binary.
Werner Koch [Mon, 18 Mar 2013 14:31:34 +0000 (15:31 +0100)]
Provide GCRYPT_VERSION_NUMBER macro, add build info to the binary.

* (VERSION_NUMBER): New ac_subst.
* src/global.c (_gcry_vcontrol): Move call to above function ...
(gcry_check_version): .. here.

(BUILD_TIMESTAMP): Define on all platforms.
* compat/compat.c (_gcry_compat_identification): Include revision and

6 years agoFix a memory leak in the new EC code.
Werner Koch [Wed, 20 Mar 2013 14:18:08 +0000 (15:18 +0100)]
Fix a memory leak in the new EC code.

* cipher/ecc.c (point_from_keyparam): Always call mpi_free on A.

6 years agoExtend the new EC interface and fix two bugs.
Werner Koch [Tue, 19 Mar 2013 14:12:07 +0000 (15:12 +0100)]
Extend the new EC interface and fix two bugs.

* src/ec-context.h (mpi_ec_ctx_s): Add field NEED_SYNC.
* mpi/ec.c (ec_p_sync): New.
(ec_p_init): Only set NEED_SYNC.
(_gcry_mpi_ec_set_mpi): Set NEED_SYNC for 'p' and 'a'.
(_gcry_mpi_ec_dup_point, _gcry_mpi_ec_add_points)
(_gcry_mpi_ec_mul_point): Call ec_p_sync.
(_gcry_mpi_ec_get_point): Recompute 'q' is needed.
(_gcry_mpi_ec_get_mpi): Ditto.  Also allow for names 'q', 'q.x',
'q.y', and 'g'.
* cipher/ecc.c (_gcry_mpi_ec_ec2os): New.

* cipher/ecc.c (_gcry_mpi_ec_new): Fix init from parameters 'Q'->'q',

Note that the parameter names are all lowercase.  This patch fixes an

The other bug was that changing the parameters D or A may have
resulted in wrong computations because helper variables were not
updated.  Now we delay the computation of those helper variables until
we need them.

6 years agompi: Add functions to manipulate an EC context.
Werner Koch [Fri, 15 Mar 2013 13:43:19 +0000 (14:43 +0100)]
mpi: Add functions to manipulate an EC context.

* src/ (gcry_mpi_ec_p_new): Remove.
(gcry_mpi_ec_new): New.
(gcry_mpi_ec_get_mpi): New.
(gcry_mpi_ec_get_point): New.
(gcry_mpi_ec_set_mpi): New.
(gcry_mpi_ec_set_point): New.
* src/visibility.c (gcry_mpi_ec_p_new): Remove.
* mpi/ec.c (_gcry_mpi_ec_p_new): Make it an internal function and
change to return an error code.
(_gcry_mpi_ec_get_mpi): New.
(_gcry_mpi_ec_get_point): New.
(_gcry_mpi_ec_set_mpi): New.
(_gcry_mpi_ec_set_point): New.
* src/mpi.h: Add new prototypes.
* src/ec-context.h: New.
* mpi/ec.c: Include that header.
(mpi_ec_ctx_s): Move to ec-context.h, add new fields, and put some
fields into an inner struct.
(point_copy): New.
* cipher/ecc.c (fill_in_curve): Allow passing NULL for R_NBITS.
(mpi_from_keyparam, point_from_keyparam): New.
(_gcry_mpi_ec_new): New.

* tests/t-mpi-point.c (test-curve): New.
(ec_p_new): New.  Use it instead of the removed gcry_mpi_ec_p_new.
(get_and_cmp_mpi, get_and_cmp_point): New.
(context_param): New test.
(basic_ec_math_simplified): New test.
(main): Call new tests.

* src/context.c (_gcry_ctx_get_pointer): Check for a NULL CTX.

gcry_mpi_ec_p_new() was a specialized version of the more general new
gcry_mpi_ec_new().  It was added to master only a few days ago, thus
there should be no problem to remove it.  A replacement can easily be
written (cf. t-mpi-point.c).

Note that gcry_mpi_ec_set_mpi and gcry_mpi_ec_set_point have not yet
been tested.

6 years agoAdd GCRYMPI_FLAG_CONST and make use constants.
Werner Koch [Wed, 13 Mar 2013 14:08:33 +0000 (15:08 +0100)]
Add GCRYMPI_FLAG_CONST and make use constants.

* src/mpi.h (mpi_is_const, mpi_const): New.
(enum gcry_mpi_constants, MPI_NUMBER_OF_CONSTANTS): New.
* mpi/mpiutil.c (_gcry_mpi_init): New.
(constants): New.
(_gcry_mpi_free): Do not release a constant flagged MPI.
(gcry_mpi_copy): Clear the const and immutable flags.
(gcry_mpi_set_flag, gcry_mpi_clear_flag, gcry_mpi_get_flag): Support
(_gcry_mpi_const): New.
* src/global.c (global_init): Call _gcry_mpi_init.
* mpi/ec.c (mpi_ec_ctx_s): Remove fields one, two, three, four, and
eight.  Change all users to call mpi_const() instead.

* src/mpiutils.c (gcry_mpi_set_opaque): Check the immutable flag.

Allocating the trivial constants newly for every EC context is a waste
of memory and cpu cycles.  We instead provide a simple mechanism to
internally support such constants.  Using a new flag in THE API also
allows to mark an arbitrary MPI as constant.  The drawback of the
constants is the their memory will never be deallocated.  However,
that is what constants are about.

6 years agoAdd GCRYMPI_FLAG_IMMUTABLE to help debugging.
Werner Koch [Tue, 12 Mar 2013 19:20:42 +0000 (20:20 +0100)]
Add GCRYMPI_FLAG_IMMUTABLE to help debugging.

* src/mpi.h (mpi_is_immutable): New macro.
* mpi/mpiutil.c (gcry_mpi_set_flag, gcry_mpi_clear_flag)
(gcry_mpi_get_flag): Implement new flag
(_gcry_mpi_immutable_failed): New.

* mpi/mpiutil.c (_gcry_mpi_clear, _gcry_mpi_free, gcry_mpi_snatch)
(gcry_mpi_set, gcry_mpi_randomize): Act upon the immutable flag.
* mpi/mpi-bit.c (gcry_mpi_set_bit, gcry_mpi_set_highbit)
(gcry_mpi_clear_highbit, gcry_mpi_clear_bit)
(_gcry_mpi_rshift_limbs, gcry_mpi_lshift): Ditto.
* mpi/mpicoder.c (_gcry_mpi_set_buffer): Ditto.

Note that this flag is currently only checked by a few MPI functions.
The reason why we eventually need such a flag is to help implementing
a generic way to retrieve and set ECC parameters without accidentally
changing a curve parameter taken from a list of predefined curves.

6 years agoDocument the new point and EC functions
Werner Koch [Mon, 11 Mar 2013 14:54:47 +0000 (15:54 +0100)]
Document the new point and EC functions


6 years agompi: Add an API for EC math.
Werner Koch [Fri, 8 Mar 2013 21:10:23 +0000 (22:10 +0100)]
mpi: Add an API for EC math.

* src/context.c, src/context.h: New.
* src/ (libgcrypt_la_SOURCES): Add new files.
* src/ (struct gcry_context, gcry_ctx_t): New types.
(gcry_ctx_release): New prototype.
(gcry_mpi_ec_p_new, gcry_mpi_ec_get_affine, gcry_mpi_ec_dup)
(gcry_mpi_ec_add, gcry_mpi_ec_mul): New prototypes.
* mpi/ec.c: Include errno.h and context.h.
(_gcry_mpi_ec_init): Rename to ..
(ec_p_init): this, make static, remove allocation and add arg CTX.
(_gcry_mpi_ec_p_internal_new): New; to replace _gcry_mpi_ec_init.
Change all callers to use this func.
(_gcry_mpi_ec_free): Factor code out to ..
(ec_deinit): New func.
(gcry_mpi_ec_p_new): New.
* src/visibility.c: Include context.h and mpi.h.
(gcry_mpi_ec_p_new, gcry_mpi_ec_get_affine, gcry_mpi_ec_dup)
(gcry_mpi_ec_add, gcry_mpi_ec_mul)
(gcry_ctx_release): New wrapper functions.
* src/visibility.h: Mark new wrapper functions visible.
* src/libgcrypt.def, src/libgcrypt.vers: Add new symbols.
* tests/t-mpi-point.c (print_mpi, hex2mpi, cmp_mpihex): New.
(context_alloc): New.
(make_point, basic_ec_math): New.

This part finishes the basic API to do EC math.  It provides a wrapper
around all internal functions.  tests/t-mpi-point.c may be useful as
sample code.  Eventually we will add function to retrieve curve
parameters etc.

6 years agompi: Add an API for EC point operations.
Werner Koch [Fri, 8 Mar 2013 14:06:20 +0000 (15:06 +0100)]
mpi: Add an API for EC point operations.

* mpi/ec.c (gcry_mpi_point_new, gcry_mpi_point_release): New.
(gcry_mpi_point_get, gcry_mpi_point_snatch_get): New.
(gcry_mpi_point_set, gcry_mpi_point_snatch_set): New.
* src/visibility.h, src/visibility.c: Add corresponding macros and
* src/ (struct gcry_mpi_point, gcry_mpi_point_t): New.
(gcry_mpi_point_new, gcry_mpi_point_release, gcry_mpi_point_get)
(gcry_mpi_point_snatch_get, gcry_mpi_point_set)
(gcry_mpi_point_snatch_set): New prototypes.
(mpi_point_new, mpi_point_release, mpi_point_get, mpi_point_snatch_get)
(mpi_point_set, mpi_point_snatch_set): New macros.
* src/libgcrypt.vers (gcry_mpi_point_new, gcry_mpi_point_release)
(gcry_mpi_point_get, gcry_mpi_point_snatch_get, gcry_mpi_point_set)
(gcry_mpi_point_snatch_set): New symbols.
* src/libgcrypt.def: Ditto.
* tests/t-mpi-point.c: New.
* tests/ (TESTS): Add t-mpi-point

6 years agompi: Add mpi_snatch and change an internal typedef.
Werner Koch [Thu, 7 Mar 2013 18:04:10 +0000 (19:04 +0100)]
mpi: Add mpi_snatch and change an internal typedef.

* src/mpi.h (struct mpi_point_s): Rename to struct gcry_mpi_point.
(mpi_point_struct): New typedef.
(mpi_point_t): Change typedef to a pointer.  Replace all occurrences
to use mpi_point_struct.
* mpi/ec.c (_gcry_mpi_ec_point_init): Rename to ..
(_gcry_mpi_point_init): this.  Change all callers.
(_gcry_mpi_ec_point_free): Rename to ..
(_gcry_mpi_point_free_parts): this.  Change all callers.

* mpi/mpiutil.c (gcry_mpi_snatch): New function.
* src/ (gcry_mpi_snatch, mpi_snatch): Add protoype and
* src/visibility.c (gcry_mpi_snatch): Add wrapper.
* src/visibility.h (gcry_mpi_snatch): Add macro magic.
* src/libgcrypt.def, src/libgcrypt.vers: Add new function.

This patch is a prerequisite to implement a public point API.  The new
function gcry_mpi_snatch is actually not needed for this but is useful
anyway and will be used to implement the point API.

6 years agoAdd Christian to the list of authors.
Werner Koch [Thu, 7 Mar 2013 13:15:12 +0000 (14:15 +0100)]
Add Christian to the list of authors.


6 years agoPretty print the configure feedback.
Werner Koch [Thu, 7 Mar 2013 13:13:33 +0000 (14:13 +0100)]
Pretty print the configure feedback.

* acinclude.m4 (GNUPG_MSG_PRINT): Remove.
* Use new macros for the feedback.

6 years agoFix building of hwf-x86.c
Werner Koch [Wed, 20 Feb 2013 19:44:19 +0000 (20:44 +0100)]
Fix building of hwf-x86.c


Without that fix we might have used a different gcrypt.h version if we
explicitly requested a newer one.  Note that dynamically added modules
use different rules than the static ones (.c.lo: vs.

AM_CCASFLAGS might not be needed right now but may be useful in the

6 years agoRemove build hacks for FreeBSD.
Werner Koch [Wed, 20 Feb 2013 19:36:39 +0000 (20:36 +0100)]
Remove build hacks for FreeBSD.

* [freebsd]: Do not add /usr/local to CPPFLAGS and

Back in ~2000 we introduced a quick hack to make building of Libgcrypt
on FreeBSD easier by always adding -I/usr/local/include and
-L/usr/local/lib .  It turned out that this is a bad idea if one wants
to build with library version which is not installed in /usr/local.

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