From cvs at cvs.gnupg.org Wed May 1 12:24:52 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 01 May 2013 12:24:52 +0200 Subject: [git] GPA - branch, master, updated. gpa-0.9.3-16-g0ce64fe Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Assistant". The branch, master has been updated via 0ce64fe4c7e2c69a3f513dd97d1de004158d6b2b (commit) via 5bfdbac82fa8244863a1db1bb6b94821c1b2a811 (commit) from 2f3c235848c25dc3dbdd09b97c493c26990b69cc (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 0ce64fe4c7e2c69a3f513dd97d1de004158d6b2b Author: Werner Koch Date: Wed May 1 11:54:19 2013 +0200 Release 0.9.4. diff --git a/NEWS b/NEWS index c458815..ba6e577 100644 --- a/NEWS +++ b/NEWS @@ -1,8 +1,12 @@ -Noteworthy changes in version 0.9.4 (unreleased) +Noteworthy changes in version 0.9.4 (2013-05-01) ------------------------------------------------ * Added scrollbars to the verification result window. + * Improved searching in the key listing. + + * Now uses the native theme under Windows. + Noteworthy changes in version 0.9.3 (2012-08-08) ------------------------------------------------ commit 5bfdbac82fa8244863a1db1bb6b94821c1b2a811 Author: Werner Koch Date: Wed May 1 11:49:37 2013 +0200 Replace defunct blackhole keyserver by the mayfirst keyserver. * src/keyserver.c (keyserver_read_list): Update list. -- Today I had no other option than to add the mayfirst keyserver. Note that it has been said that the blackhole server of the German research network has been shut down due to suits fearing that they won't be able to delete keys from the server if demanded by courts. diff --git a/src/keyserver.c b/src/keyserver.c index 6b2a4ef..b6f68e2 100644 --- a/src/keyserver.c +++ b/src/keyserver.c @@ -107,7 +107,7 @@ read_list (const gchar *fname) #else fp = fopen (fname, "r"); #endif - if (!fp) + if (!fp) { /* fprintf (stderr, "can't open `%s': %s\n", fname, strerror (errno) ); @@ -116,21 +116,21 @@ read_list (const gchar *fname) return -1; } - while ( fgets( line, DIM(line)-1, fp ) ) + while ( fgets( line, DIM(line)-1, fp ) ) { lnr++; - if ( *line && line[strlen(line)-1] != '\n' ) + if ( *line && line[strlen(line)-1] != '\n' ) { err = "line too long"; break; } - + g_strstrip (line); if( !*line || *line == '#' ) continue; /* comment or empty line */ - for( p=line; *p; p++ ) + for( p=line; *p; p++ ) { if (isspace (*p)) { @@ -156,7 +156,7 @@ read_list (const gchar *fname) release_server_list (list); return -1; } - + return 0; } @@ -175,8 +175,8 @@ keyserver_read_list (const gchar *confname) if (!serverlist) { /* no entries in list - use default values */ add_server (&serverlist, "hkp://keys.gnupg.net"); - add_server (&serverlist, "hkp://blackhole.pca.dfn.de"); - add_server (&serverlist, "hkp://minsky.surfnet.nl"); + add_server (&serverlist, "hkp://zimmermann.mayfirst.org"); + add_server (&serverlist, "hkp://minsky.surfnet.nl"); add_server (&serverlist, "hkp://pks.gpg.cz"); add_server (&serverlist, "hkp://pgp.cns.ualberta.ca"); add_server (&serverlist, "hkp://keyserver.ubuntu.com"); ----------------------------------------------------------------------- Summary of changes: NEWS | 6 +++++- src/keyserver.c | 16 ++++++++-------- 2 files changed, 13 insertions(+), 9 deletions(-) hooks/post-receive -- The GNU Privacy Assistant http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 1 12:25:51 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 01 May 2013 12:25:51 +0200 Subject: [git] GPA - branch, master, updated. gpa-0.9.4-1-g189a314 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Assistant". The branch, master has been updated via 189a314712f9ca3ca1f4506226a04decbd258725 (commit) from 0ce64fe4c7e2c69a3f513dd97d1de004158d6b2b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 189a314712f9ca3ca1f4506226a04decbd258725 Author: Werner Koch Date: Wed May 1 12:06:29 2013 +0200 Post release version bump -- diff --git a/NEWS b/NEWS index ba6e577..d7e1275 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,7 @@ +Noteworthy changes in version 0.9.5 (unreleased) +------------------------------------------------ + + Noteworthy changes in version 0.9.4 (2013-05-01) ------------------------------------------------ diff --git a/configure.ac b/configure.ac index dcf54de..57d677f 100644 --- a/configure.ac +++ b/configure.ac @@ -28,7 +28,7 @@ min_automake_version="1.10" # (git tag -s gpa-1.n.m) and run "./autogen.sh --force". Please # bump the version number immediately *after* the release and do # another commit and push so that the git magic is able to work. -m4_define([mym4_version], [0.9.4]) +m4_define([mym4_version], [0.9.5]) # Below is m4 magic to extract and compute the git revision number, # the decimalized short revision number, a beta version string and a ----------------------------------------------------------------------- Summary of changes: NEWS | 4 ++++ configure.ac | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) hooks/post-receive -- The GNU Privacy Assistant http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 1 14:49:20 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 01 May 2013 14:49:20 +0200 Subject: [git] GPGME - branch, master, updated. gpgme-1.4.0-8-gde30df9 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via de30df9ce359202b2449697c7e16dc0311e9050f (commit) via 5075c0da7c464af2a45cd36db134ed7e88f155af (commit) via ef5b4ae37d13142e89a051908dc080cda3d24baa (commit) via f623a6b94c527795d0b6f7e66a3966e5d9e1c454 (commit) via 0ff0aa3fc8440420247fe4cff30c3ac9be1b2f7d (commit) via 867b950b9306904a0ff522d0ef4a43789393cfc4 (commit) from 12374cbecede047accd2d2267bba5927037ed16c (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit de30df9ce359202b2449697c7e16dc0311e9050f Author: Werner Koch Date: Wed May 1 14:27:08 2013 +0200 Post release version bump. -- diff --git a/NEWS b/NEWS index 39acc46..bf8c2f9 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,7 @@ +Noteworthy changes in version 1.4.2 (unreleased) +------------------------------------------------ + + Noteworthy changes in version 1.4.1 (2013-05-01) ------------------------------------------------ diff --git a/configure.ac b/configure.ac index 5dee0aa..25dce1c 100644 --- a/configure.ac +++ b/configure.ac @@ -29,7 +29,7 @@ min_automake_version="1.11" # for the LT versions. m4_define(mym4_version_major, [1]) m4_define(mym4_version_minor, [4]) -m4_define(mym4_version_micro, [1]) +m4_define(mym4_version_micro, [2]) # Below is m4 magic to extract and compute the revision number, the # decimalized short revision number, a beta version string, and a flag commit 5075c0da7c464af2a45cd36db134ed7e88f155af Author: Werner Koch Date: Wed May 1 13:51:27 2013 +0200 Release 1.4.1. * configure.ac: Bump LT version to C20/A9/R1. diff --git a/NEWS b/NEWS index 693a2b7..39acc46 100644 --- a/NEWS +++ b/NEWS @@ -1,10 +1,12 @@ -Noteworthy changes in version 1.4.1 (unreleased) +Noteworthy changes in version 1.4.1 (2013-05-01) ------------------------------------------------ - * Fix reading of gpg conf files with excessive use of the group + * Fixed reading of gpg.conf files with excessive use of the group option. - * Fix building with the i686-w64-mingw32 toolchain. + * Fixed building with the i686-w64-mingw32 toolchain. + + * Disabled FD passing by default for Apple. Noteworthy changes in version 1.4.0 (2013-02-26) diff --git a/configure.ac b/configure.ac index dcd2305..5dee0aa 100644 --- a/configure.ac +++ b/configure.ac @@ -59,7 +59,7 @@ LIBGPGME_LT_CURRENT=20 # Subtract 2 from this value if you want to make the LFS transition an # ABI break. [Note to self: Remove this comment with the next regular break.] LIBGPGME_LT_AGE=9 -LIBGPGME_LT_REVISION=0 +LIBGPGME_LT_REVISION=1 # If the API is changed in an incompatible way: increment the next counter. GPGME_CONFIG_API_VERSION=1 commit ef5b4ae37d13142e89a051908dc080cda3d24baa Author: Werner Koch Date: Wed May 1 13:47:41 2013 +0200 Disable fd-passing for Apple. * configure.ac: Disable fd-passing by default for Apple. -- We have not yet tracked down the problem, thus we revert to the pre-1.4 behaviour for Apple. GnuPG-bug-id: 1483 diff --git a/configure.ac b/configure.ac index d7ce215..dcd2305 100644 --- a/configure.ac +++ b/configure.ac @@ -872,7 +872,18 @@ AC_CHECK_MEMBER(struct cmsghdr.cmsg_len, #include ]) -use_descriptor_passing=yes + +dnl There seems to be a problem with Apple and decriptor passing. +dnl Until we found a solution we change the default to no. +dnl See bug 1483. +case "${host}" in + *-apple-darwin*) + use_descriptor_passing=no + ;; + *) + use_descriptor_passing=yes + ;; +esac AC_ARG_ENABLE(fd-passing, AC_HELP_STRING([--disable-fd-passing], [do not use FD passing]), use_descriptor_passing=$enableval) commit f623a6b94c527795d0b6f7e66a3966e5d9e1c454 Author: Werner Koch Date: Tue Apr 30 18:09:13 2013 +0200 Allow reading of long gpgconf output lines. * src/engine-gpgconf.c (gpgconf_read): Rewrite to allow for line lengths up to 64k. diff --git a/NEWS b/NEWS index b55c113..693a2b7 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,11 @@ Noteworthy changes in version 1.4.1 (unreleased) ------------------------------------------------ + * Fix reading of gpg conf files with excessive use of the group + option. + + * Fix building with the i686-w64-mingw32 toolchain. + Noteworthy changes in version 1.4.0 (2013-02-26) ------------------------------------------------ diff --git a/src/engine-gpgconf.c b/src/engine-gpgconf.c index fec0fc3..3a1c1c1 100644 --- a/src/engine-gpgconf.c +++ b/src/engine-gpgconf.c @@ -1,6 +1,7 @@ /* engine-gpgconf.c - gpg-conf engine. Copyright (C) 2000 Werner Koch (dd9jn) - Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008 g10 Code GmbH + Copyright (C) 2001, 2002, 2003, 2004, 2005, 2007, 2008, + 2013 g10 Code GmbH This file is part of GPGME. @@ -191,7 +192,10 @@ gpgconf_config_release (gpgme_conf_comp_t conf) } } - +/* Read from gpgconf and pass line after line to the hook function. + We put a limit of 64 k on the maximum size for a line. This should + allow for quite a long "group" line, which is usually the longest + line (mine is currently ~3k). */ static gpgme_error_t gpgconf_read (void *engine, char *arg1, char *arg2, gpgme_error_t (*cb) (void *hook, char *line), @@ -199,9 +203,9 @@ gpgconf_read (void *engine, char *arg1, char *arg2, { struct engine_gpgconf *gpgconf = engine; gpgme_error_t err = 0; -#define LINELENGTH 1024 - char linebuf[LINELENGTH] = ""; - int linelen = 0; + char *linebuf; + size_t linebufsize; + int linelen; char *argv[4] = { NULL /* file_name */, NULL, NULL, NULL }; int rp[2]; struct spawn_fd_item_s cfd[] = { {-1, 1 /* STDOUT_FILENO */, -1, 0}, @@ -232,51 +236,80 @@ gpgconf_read (void *engine, char *arg1, char *arg2, return gpg_error_from_syserror (); } - do + linebufsize = 1024; /* Usually enough for conf lines. */ + linebuf = malloc (linebufsize); + if (!linebuf) { - nread = _gpgme_io_read (rp[0], - linebuf + linelen, LINELENGTH - linelen - 1); - if (nread > 0) - { - char *line; - const char *lastmark = NULL; - size_t nused; - - linelen += nread; - linebuf[linelen] = '\0'; + err = gpg_error_from_syserror (); + goto leave; + } + linelen = 0; - for (line=linebuf; (mark = strchr (line, '\n')); line = mark+1 ) - { - lastmark = mark; - if (mark > line && mark[-1] == '\r') - mark[-1] = '\0'; - else - mark[0] = '\0'; - - /* Got a full line. Due to the CR removal code (which - occurs only on Windows) we might be one-off and thus - would see empty lines. Don't pass them to the - callback. */ - err = *line? (*cb) (hook, line) : 0; - if (err) - goto leave; - } + while ((nread = _gpgme_io_read (rp[0], linebuf + linelen, + linebufsize - linelen - 1))) + { + char *line; + const char *lastmark = NULL; + size_t nused; + + if (nread < 0) + { + err = gpg_error_from_syserror (); + goto leave; + } + + linelen += nread; + linebuf[linelen] = '\0'; + + for (line=linebuf; (mark = strchr (line, '\n')); line = mark+1 ) + { + lastmark = mark; + if (mark > line && mark[-1] == '\r') + mark[-1] = '\0'; + else + mark[0] = '\0'; + + /* Got a full line. Due to the CR removal code (which + occurs only on Windows) we might be one-off and thus + would see empty lines. Don't pass them to the + callback. */ + err = *line? (*cb) (hook, line) : 0; + if (err) + goto leave; + } + + nused = lastmark? (lastmark + 1 - linebuf) : 0; + memmove (linebuf, linebuf + nused, linelen - nused); + linelen -= nused; + + if (!(linelen < linebufsize - 1)) + { + char *newlinebuf; + + if (linelen < 8 * 1024 - 1) + linebufsize = 8 * 1024; + else if (linelen < 64 * 1024 - 1) + linebufsize = 64 * 1024; + else + { + /* We reached our limit - give up. */ + err = gpg_error (GPG_ERR_LINE_TOO_LONG); + goto leave; + } - nused = lastmark? (lastmark + 1 - linebuf) : 0; - memmove (linebuf, linebuf + nused, linelen - nused); - linelen -= nused; - } + newlinebuf = realloc (linebuf, linebufsize); + if (!newlinebuf) + { + err = gpg_error_from_syserror (); + goto leave; + } + linebuf = newlinebuf; + } } - while (nread > 0 && linelen < LINELENGTH - 1); - - if (!err && nread < 0) - err = gpg_error_from_syserror (); - if (!err && nread > 0) - err = gpg_error (GPG_ERR_LINE_TOO_LONG); leave: + free (linebuf); _gpgme_io_close (rp[0]); - return err; } commit 0ff0aa3fc8440420247fe4cff30c3ac9be1b2f7d Author: Werner Koch Date: Tue Apr 30 18:05:04 2013 +0200 Syntax fix for gpgme.texi. -- This fixes commit 12374cbecede047accd2d2267bba5927037ed16c. diff --git a/doc/gpgme.texi b/doc/gpgme.texi index 8eeaafc..b47d438 100644 --- a/doc/gpgme.texi +++ b/doc/gpgme.texi @@ -5816,7 +5816,7 @@ if this is not possible, by calling the function @code{gpgme_set_global_flag}. The value is the trace level and an optional file name. - at noindenr + at noindent For example @smallexample GPGME_DEBUG=9:/home/user/mygpgme.log commit 867b950b9306904a0ff522d0ef4a43789393cfc4 Author: Werner Koch Date: Mon Apr 29 09:58:57 2013 +0200 Fix for i686-w64-mingw32. * configure.ac (NEED__FILE_OFFSET_BITS): Do not define under Windows. diff --git a/configure.ac b/configure.ac index f096aa9..d7ce215 100644 --- a/configure.ac +++ b/configure.ac @@ -270,12 +270,14 @@ AC_TYPE_UINTPTR_T # A simple compile time check in gpgme.h for GNU/Linux systems that # prevents a file offset bits mismatch between gpgme and the application. NEED__FILE_OFFSET_BITS=0 -case "$ac_cv_sys_file_offset_bits" in - "" | no | unknown) ;; - *) - NEED__FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits - ;; -esac +if test "$have_w32_system" != yes; then + case "$ac_cv_sys_file_offset_bits" in + "" | no | unknown) ;; + *) + NEED__FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits + ;; + esac +fi AC_SUBST(NEED__FILE_OFFSET_BITS) # Figure out platform dependent typedefs for gpgme.h ----------------------------------------------------------------------- Summary of changes: NEWS | 13 +++++- configure.ac | 31 +++++++++---- doc/gpgme.texi | 2 +- src/engine-gpgconf.c | 121 ++++++++++++++++++++++++++++++++------------------ 4 files changed, 112 insertions(+), 55 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 7 21:42:40 2013 From: cvs at cvs.gnupg.org (by Ian Abbott) Date: Tue, 07 May 2013 21:42:40 +0200 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-0, updated. gnupg-2.0.19-122-g049b3d9 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-0 has been updated via 049b3d9ca0285d15c00c215ac9b533c994196ca4 (commit) via 4d67f59a336bfa0ff19fc23209940724196fd886 (commit) from 42c44e9ccd266b92d2a0c0cb29360db232009714 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 049b3d9ca0285d15c00c215ac9b533c994196ca4 Author: Ian Abbott Date: Thu Apr 25 12:00:16 2013 +0100 w32: Add icons and version information. * common/gnupg.ico: New. Take from artwork/gnupg-favicon-1.ico. * agent/gpg-agent-w32info.rc: New. * g10/gpg-w32info.rc: New. * scd/scdaemon-w32info.rc: New. * sm/gpgsm-w32info.rc: New. * tools/gpg-connect-agent-w32info.rc: New. * common/w32info-rc.h.in: New. * configure.ac (BUILD_REVISION, BUILD_FILEVERSION, BUILD_TIMESTAMP) (BUILD_HOSTNAME): New. (AC_CONFIG_FILES): Add w32info-rc.h. * am/cmacros.am (.rc.o): New rule. * agent/Makefile.am, common/Makefile.am, g10/Makefile.am * scd/Makefile.am, sm/Makefile.am, tools/Makefile.am: Add stuff to build resource files. Signed-off-by: Werner Koch diff --git a/agent/Makefile.am b/agent/Makefile.am index cc8a22a..5c2da2c 100644 --- a/agent/Makefile.am +++ b/agent/Makefile.am @@ -21,13 +21,16 @@ bin_PROGRAMS = gpg-agent libexec_PROGRAMS = gpg-protect-tool gpg-preset-passphrase noinst_PROGRAMS = $(TESTS) -# EXTRA_DIST = gpg-agent.ico gpg-agent-resource.rc -EXTRA_DIST = ChangeLog-2011 +EXTRA_DIST = ChangeLog-2011 gpg-agent-w32info.rc AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/common -I$(top_srcdir)/intl include $(top_srcdir)/am/cmacros.am +if HAVE_W32_SYSTEM +resource_objs += gpg-agent-w32info.o +endif + AM_CFLAGS = $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS) gpg_agent_SOURCES = \ @@ -50,25 +53,12 @@ common_libs = $(libcommon) ../jnlib/libjnlib.a ../gl/libgnu.a commonpth_libs = $(libcommonpth) ../jnlib/libjnlib.a ../gl/libgnu.a pwquery_libs = ../common/libsimple-pwquery.a -#if HAVE_W32_SYSTEM -#.rc.o: -# $(WINDRES) `echo $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) | \ -# sed -e 's/-I/--include-dir /g;s/-D/--define /g'` -i $< -o $@ -# -#gpg_agent_res_ldflags = -Wl,gpg-agent-resource.o -Wl,--subsystem,windows -#gpg_agent_res_deps = gpg-agent-resource.o -#else -gpg_agent_res_ldflags = -gpg_agent_res_deps = -#endif - gpg_agent_CFLAGS = $(AM_CFLAGS) $(LIBASSUAN_CFLAGS) $(PTH_CFLAGS) gpg_agent_LDADD = $(commonpth_libs) \ $(LIBGCRYPT_LIBS) $(LIBASSUAN_LIBS) $(PTH_LIBS) \ - $(GPG_ERROR_LIBS) $(LIBINTL) $(NETLIBS) $(LIBICONV) -gpg_agent_LDFLAGS = $(gpg_agent_res_ldflags) -gpg_agent_DEPENDENCIES = $(gpg_agent_res_deps) + $(GPG_ERROR_LIBS) $(LIBINTL) $(NETLIBS) $(LIBICONV) \ + $(resource_objs) gpg_protect_tool_SOURCES = \ protect-tool.c \ @@ -104,7 +94,3 @@ t_common_ldadd = $(common_libs) \ t_protect_SOURCES = t-protect.c protect.c t_protect_LDADD = $(t_common_ldadd) - - - - diff --git a/agent/gpg-agent-w32info.rc b/agent/gpg-agent-w32info.rc new file mode 100644 index 0000000..d586cad --- /dev/null +++ b/agent/gpg-agent-w32info.rc @@ -0,0 +1,50 @@ +/* gpg-agent-w32info.rc -*- c -*- + * Copyright (C) 2013 g10 Code GmbH + * + * This file is free software; as a special exception the author gives + * unlimited permission to copy and/or distribute it, with or without + * modifications, as long as this notice is preserved. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "afxres.h" +#include "../common/w32info-rc.h" + +1 ICON "../common/gnupg.ico" + +1 VERSIONINFO + FILEVERSION W32INFO_VI_FILEVERSION + PRODUCTVERSION W32INFO_VI_PRODUCTVERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x01L /* VS_FF_DEBUG (0x1)*/ +#else + FILEFLAGS 0x00L +#endif + FILEOS 0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4) */ + FILETYPE 0x1L /* VFT_APP (0x1) */ + FILESUBTYPE 0x0L /* VFT2_UNKNOWN */ + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" /* US English (0409), Unicode (04b0) */ + BEGIN + VALUE "FileDescription", L"GnuPG\x2019s private key daemon\0" + VALUE "InternalName", "gpg-agent\0" + VALUE "OriginalFilename", "gpg-agent.exe\0" + VALUE "ProductName", W32INFO_PRODUCTNAME + VALUE "ProductVersion", W32INFO_PRODUCTVERSION + VALUE "CompanyName", W32INFO_COMPANYNAME + VALUE "FileVersion", W32INFO_FILEVERSION + VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT + VALUE "Comments", W32INFO_COMMENTS + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 0x4b0 + END + END diff --git a/am/cmacros.am b/am/cmacros.am index be34ca3..b868e7c 100644 --- a/am/cmacros.am +++ b/am/cmacros.am @@ -7,18 +7,18 @@ # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 3 of the License, or # (at your option) any later version. -# +# # GnuPG is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. -# +# # You should have received a copy of the GNU General Public License # along with this program; if not, see . localedir = $(datadir)/locale -AM_CPPFLAGS += -DLOCALEDIR=\"$(localedir)\" +AM_CPPFLAGS += -DLOCALEDIR=\"$(localedir)\" if ! HAVE_DOSISH_SYSTEM AM_CPPFLAGS += -DGNUPG_BINDIR="\"$(bindir)\"" \ @@ -48,6 +48,12 @@ if GNUPG_PROTECT_TOOL_PGM AM_CPPFLAGS += -DGNUPG_DEFAULT_PROTECT_TOOL="\"@GNUPG_PROTECT_TOOL_PGM@\"" endif +if HAVE_W32_SYSTEM +.rc.o: + $(WINDRES) $(DEFAULT_INCLUDES) $(INCLUDES) "$<" "$@" + +endif +resource_objs = # Convenience macros libcommon = ../common/libcommon.a diff --git a/common/Makefile.am b/common/Makefile.am index 0864d11..f2242b6 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -19,7 +19,8 @@ ## Process this file with automake to produce Makefile.in EXTRA_DIST = mkstrtable.awk exaudit.awk exstatus.awk \ - audit-events.h status-codes.h ChangeLog-2011 + audit-events.h status-codes.h ChangeLog-2011 \ + w32info-rc.h.in gnupg.ico noinst_LIBRARIES = libcommon.a libcommonpth.a libsimple-pwquery.a libgpgrl.a noinst_PROGRAMS = $(module_tests) $(module_maint_tests) diff --git a/common/gnupg.ico b/common/gnupg.ico new file mode 100644 index 0000000..4c4bae0 Binary files /dev/null and b/common/gnupg.ico differ diff --git a/common/w32info-rc.h.in b/common/w32info-rc.h.in new file mode 100644 index 0000000..1a427ee --- /dev/null +++ b/common/w32info-rc.h.in @@ -0,0 +1,32 @@ +/* w32info-rc.h.in - Common defs for VERSIONINFO resources. + * Copyright (C) 2013 g10 Code GmbH + * + * This file is free software; as a special exception the author gives + * unlimited permission to copy and/or distribute it, with or without + * modifications, as long as this notice is preserved. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* This file is processed by configure to create w32info-rc.h . */ + +#define W32INFO_COMMENTS "This program is free software; \ +you can redistribute it and/or modify it under the terms of the \ +GNU General Public License as published by the Free Software Foundation; \ +either version 3 of the License, or (at your option) any later version.\0" + +#define W32INFO_COMPANYNAME "g10 Code GmbH\0" + +#define W32INFO_VI_FILEVERSION @BUILD_FILEVERSION@ +#define W32INFO_VI_PRODUCTVERSION @BUILD_FILEVERSION@ + +#define W32INFO_FILEVERSION "@VERSION@ (@BUILD_REVISION@) \ +built on @BUILD_HOSTNAME@ at @BUILD_TIMESTAMP@\0" + +#define W32INFO_PRODUCTNAME "GNU Privacy Guard (GnuPG)\0" +#define W32INFO_PRODUCTVERSION "@VERSION@\0" + +#define W32INFO_LEGALCOPYRIGHT "Copyright \xa9 \ +2013 Free Software Foundation, Inc.\0" diff --git a/configure.ac b/configure.ac index b04f55f..4752772 100644 --- a/configure.ac +++ b/configure.ac @@ -1415,6 +1415,28 @@ AM_CONDITIONAL(RUN_GPG_TESTS, # +# Provide information about the build. +# +BUILD_REVISION="mym4_revision" +AC_SUBST(BUILD_REVISION) +AC_DEFINE_UNQUOTED(BUILD_REVISION, "$BUILD_REVISION", + [GIT commit id revision used to build this package]) + +changequote(,)dnl +BUILD_FILEVERSION=`echo "$VERSION" | sed 's/\([0-9.]*\).*/\1./;s/\./,/g'` +changequote([,])dnl +BUILD_FILEVERSION="${BUILD_FILEVERSION}mym4_revision_dec" +AC_SUBST(BUILD_FILEVERSION) + +BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date` +AC_SUBST(BUILD_TIMESTAMP) +AC_DEFINE_UNQUOTED(BUILD_TIMESTAMP, "$BUILD_TIMESTAMP", + [The time this package was configured for a build]) +BUILD_HOSTNAME="$ac_hostname" +AC_SUBST(BUILD_HOSTNAME) + + +# # Print errors here so that they are visible all # together and the user can acquire them all together. # @@ -1491,6 +1513,7 @@ gl/Makefile include/Makefile jnlib/Makefile common/Makefile +common/w32info-rc.h kbx/Makefile g10/Makefile sm/Makefile diff --git a/g10/Makefile.am b/g10/Makefile.am index 126c55c..c3e35f6 100644 --- a/g10/Makefile.am +++ b/g10/Makefile.am @@ -18,7 +18,7 @@ ## Process this file with automake to produce Makefile.in -EXTRA_DIST = options.skel ChangeLog-2011 +EXTRA_DIST = options.skel ChangeLog-2011 gpg-w32info.rc AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/common \ -I$(top_srcdir)/include -I$(top_srcdir)/intl @@ -39,6 +39,9 @@ else bzip2_source = endif +if HAVE_W32_SYSTEM +resource_objs += gpg-w32info.o +endif common_source = \ gpg.h \ @@ -120,9 +123,9 @@ LDADD = $(needed_libs) ../common/libgpgrl.a \ $(ZLIBS) $(DNSLIBS) $(LIBREADLINE) \ $(LIBINTL) $(CAPLIBS) $(NETLIBS) gpg2_LDADD = $(LDADD) $(LIBGCRYPT_LIBS) $(LIBASSUAN_LIBS) $(GPG_ERROR_LIBS) \ - $(LIBICONV) + $(LIBICONV) $(resource_objs) gpgv2_LDADD = $(LDADD) $(LIBGCRYPT_LIBS) $(LIBASSUAN_LIBS) $(GPG_ERROR_LIBS) \ - $(LIBICONV) + $(LIBICONV) $(resource_objs) t_common_ldadd = module_tests = t-rmd160 diff --git a/g10/gpg-w32info.rc b/g10/gpg-w32info.rc new file mode 100644 index 0000000..8caf221 --- /dev/null +++ b/g10/gpg-w32info.rc @@ -0,0 +1,50 @@ +/* gpg-w32info.rc -*- c -*- + * Copyright (C) 2013 g10 Code GmbH + * + * This file is free software; as a special exception the author gives + * unlimited permission to copy and/or distribute it, with or without + * modifications, as long as this notice is preserved. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "afxres.h" +#include "../common/w32info-rc.h" + +1 ICON "../common/gnupg.ico" + +1 VERSIONINFO + FILEVERSION W32INFO_VI_FILEVERSION + PRODUCTVERSION W32INFO_VI_PRODUCTVERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x01L /* VS_FF_DEBUG (0x1)*/ +#else + FILEFLAGS 0x00L +#endif + FILEOS 0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4) */ + FILETYPE 0x1L /* VFT_APP (0x1) */ + FILESUBTYPE 0x0L /* VFT2_UNKNOWN */ + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" /* US English (0409), Unicode (04b0) */ + BEGIN + VALUE "FileDescription", L"GnuPG\x2019s OpenPGP tool\0" + VALUE "InternalName", "gpg\0" + VALUE "OriginalFilename", "gpg.exe\0" + VALUE "ProductName", W32INFO_PRODUCTNAME + VALUE "ProductVersion", W32INFO_PRODUCTVERSION + VALUE "CompanyName", W32INFO_COMPANYNAME + VALUE "FileVersion", W32INFO_FILEVERSION + VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT + VALUE "Comments", W32INFO_COMMENTS + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 0x4b0 + END + END diff --git a/scd/Makefile.am b/scd/Makefile.am index db339a2..63a11dc 100644 --- a/scd/Makefile.am +++ b/scd/Makefile.am @@ -23,12 +23,16 @@ else libexec_PROGRAMS = scdaemon gnupg-pcsc-wrapper endif -EXTRA_DIST = ChangeLog-2011 +EXTRA_DIST = ChangeLog-2011 scdaemon-w32info.rc AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/intl -I$(top_srcdir)/common include $(top_srcdir)/am/cmacros.am +if HAVE_W32_SYSTEM +resource_objs += scdaemon-w32info.o +endif + AM_CFLAGS = $(LIBGCRYPT_CFLAGS) \ $(KSBA_CFLAGS) $(LIBASSUAN_CFLAGS) $(PTH_CFLAGS) @@ -47,7 +51,7 @@ scdaemon_SOURCES = \ scdaemon_LDADD = $(libcommonpth) ../jnlib/libjnlib.a ../gl/libgnu.a \ $(LIBGCRYPT_LIBS) $(KSBA_LIBS) $(LIBASSUAN_LIBS) $(PTH_LIBS) \ $(LIBUSB_LIBS) $(GPG_ERROR_LIBS) \ - $(LIBINTL) $(DL_LIBS) $(NETLIBS) $(LIBICONV) + $(LIBINTL) $(DL_LIBS) $(NETLIBS) $(LIBICONV) $(resource_objs) # Removed for now: We need to decide whether it makes sense to # continue it at all, given that gpg has now all required diff --git a/scd/scdaemon-w32info.rc b/scd/scdaemon-w32info.rc new file mode 100644 index 0000000..aa0eba4 --- /dev/null +++ b/scd/scdaemon-w32info.rc @@ -0,0 +1,50 @@ +/* scdaemon-w32info.rc -*- c -*- + * Copyright (C) 2013 g10 Code GmbH + * + * This file is free software; as a special exception the author gives + * unlimited permission to copy and/or distribute it, with or without + * modifications, as long as this notice is preserved. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "afxres.h" +#include "../common/w32info-rc.h" + +1 ICON "../common/gnupg.ico" + +1 VERSIONINFO + FILEVERSION W32INFO_VI_FILEVERSION + PRODUCTVERSION W32INFO_VI_PRODUCTVERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x01L /* VS_FF_DEBUG (0x1)*/ +#else + FILEFLAGS 0x00L +#endif + FILEOS 0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4) */ + FILETYPE 0x1L /* VFT_APP (0x1) */ + FILESUBTYPE 0x0L /* VFT2_UNKNOWN */ + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" /* US English (0409), Unicode (04b0) */ + BEGIN + VALUE "FileDescription", L"GnuPG\x2019s smartcard daemon\0" + VALUE "InternalName", "scdaemon\0" + VALUE "OriginalFilename", "scdaemon.exe\0" + VALUE "ProductName", W32INFO_PRODUCTNAME + VALUE "ProductVersion", W32INFO_PRODUCTVERSION + VALUE "CompanyName", W32INFO_COMPANYNAME + VALUE "FileVersion", W32INFO_FILEVERSION + VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT + VALUE "Comments", W32INFO_COMMENTS + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 0x4b0 + END + END diff --git a/sm/Makefile.am b/sm/Makefile.am index d945d71..01cf028 100644 --- a/sm/Makefile.am +++ b/sm/Makefile.am @@ -20,13 +20,16 @@ bin_PROGRAMS = gpgsm -EXTRA_DIST = ChangeLog-2011 +EXTRA_DIST = ChangeLog-2011 gpgsm-w32info.rc AM_CFLAGS = $(LIBGCRYPT_CFLAGS) $(KSBA_CFLAGS) $(LIBASSUAN_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/common -I$(top_srcdir)/intl include $(top_srcdir)/am/cmacros.am +if HAVE_W32_SYSTEM +resource_objs += gpgsm-w32info.o +endif gpgsm_SOURCES = \ gpgsm.c gpgsm.h \ @@ -59,13 +62,9 @@ common_libs = $(libcommon) ../kbx/libkeybox.a ../jnlib/libjnlib.a \ gpgsm_LDADD = $(common_libs) ../common/libgpgrl.a $(NETLIBS) \ $(LIBGCRYPT_LIBS) $(KSBA_LIBS) $(LIBASSUAN_LIBS) \ - $(GPG_ERROR_LIBS) $(LIBREADLINE) $(LIBINTL) $(ZLIBS) $(LIBICONV) + $(GPG_ERROR_LIBS) $(LIBREADLINE) $(LIBINTL) $(ZLIBS) \ + $(LIBICONV) $(resource_objs) # Make sure that all libs are build before we use them. This is # important for things like make -j2. $(PROGRAMS): $(common_libs) - - - - - diff --git a/sm/gpgsm-w32info.rc b/sm/gpgsm-w32info.rc new file mode 100644 index 0000000..d813b0d --- /dev/null +++ b/sm/gpgsm-w32info.rc @@ -0,0 +1,50 @@ +/* gpgsm-w32info.rc -*- c -*- + * Copyright (C) 2013 g10 Code GmbH + * + * This file is free software; as a special exception the author gives + * unlimited permission to copy and/or distribute it, with or without + * modifications, as long as this notice is preserved. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "afxres.h" +#include "../common/w32info-rc.h" + +1 ICON "../common/gnupg.ico" + +1 VERSIONINFO + FILEVERSION W32INFO_VI_FILEVERSION + PRODUCTVERSION W32INFO_VI_PRODUCTVERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x01L /* VS_FF_DEBUG (0x1)*/ +#else + FILEFLAGS 0x00L +#endif + FILEOS 0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4) */ + FILETYPE 0x1L /* VFT_APP (0x1) */ + FILESUBTYPE 0x0L /* VFT2_UNKNOWN */ + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" /* US English (0409), Unicode (04b0) */ + BEGIN + VALUE "FileDescription", L"GnuPG\x2019s X.509/CMS tool\0" + VALUE "InternalName", "gpgsm\0" + VALUE "OriginalFilename", "gpgsm.exe\0" + VALUE "ProductName", W32INFO_PRODUCTNAME + VALUE "ProductVersion", W32INFO_PRODUCTVERSION + VALUE "CompanyName", W32INFO_COMPANYNAME + VALUE "FileVersion", W32INFO_FILEVERSION + VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT + VALUE "Comments", W32INFO_COMMENTS + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 0x4b0 + END + END diff --git a/tools/Makefile.am b/tools/Makefile.am index 32940a3..bacdaf3 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -20,12 +20,16 @@ EXTRA_DIST = \ Manifest watchgnupg.c ChangeLog-2011 \ addgnupghome applygnupgdefaults gpgsm-gencert.sh \ lspgpot mail-signed-keys convert-from-106 sockprox.c \ - ccidmon.c + ccidmon.c gpg-connect-agent-w32info.rc AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/intl -I$(top_srcdir)/common include $(top_srcdir)/am/cmacros.am +if HAVE_W32_SYSTEM +resource_objs += gpg-connect-agent-w32info.o +endif + AM_CFLAGS = $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS) $(LIBASSUAN_CFLAGS) sbin_SCRIPTS = addgnupghome applygnupgdefaults @@ -89,7 +93,8 @@ gpg_connect_agent_SOURCES = gpg-connect-agent.c no-libgcrypt.c # FIXME: remove PTH_LIBS (why do we need them at all?) gpg_connect_agent_LDADD = ../common/libgpgrl.a $(common_libs) \ $(LIBASSUAN_LIBS) $(PTH_LIBS) $(GPG_ERROR_LIBS) \ - $(LIBREADLINE) $(LIBINTL) $(NETLIBS) $(LIBICONV) + $(LIBREADLINE) $(LIBINTL) $(NETLIBS) $(LIBICONV) \ + $(resource_objs) gpgkey2ssh_SOURCES = gpgkey2ssh.c gpgkey2ssh_CFLAGS = $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS) diff --git a/tools/gpg-connect-agent-w32info.rc b/tools/gpg-connect-agent-w32info.rc new file mode 100644 index 0000000..4e7b19d --- /dev/null +++ b/tools/gpg-connect-agent-w32info.rc @@ -0,0 +1,51 @@ +/* scdaemon-w32info.rc -*- c -*- + * Copyright (C) 2013 g10 Code GmbH + * + * This file is free software; as a special exception the author gives + * unlimited permission to copy and/or distribute it, with or without + * modifications, as long as this notice is preserved. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "afxres.h" +#include "../common/w32info-rc.h" + +1 ICON "../common/gnupg.ico" + +1 VERSIONINFO + FILEVERSION W32INFO_VI_FILEVERSION + PRODUCTVERSION W32INFO_VI_PRODUCTVERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x01L /* VS_FF_DEBUG (0x1)*/ +#else + FILEFLAGS 0x00L +#endif + FILEOS 0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4) */ + FILETYPE 0x1L /* VFT_APP (0x1) */ + FILESUBTYPE 0x0L /* VFT2_UNKNOWN */ + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" /* US English (0409), Unicode (04b0) */ + BEGIN + VALUE "FileDescription", L"GnuPG\x2019s command line access \ +to the agent\0" + VALUE "InternalName", "gpg-connect-agent\0" + VALUE "OriginalFilename", "gpg-connect-agent.exe\0" + VALUE "ProductName", W32INFO_PRODUCTNAME + VALUE "ProductVersion", W32INFO_PRODUCTVERSION + VALUE "CompanyName", W32INFO_COMPANYNAME + VALUE "FileVersion", W32INFO_FILEVERSION + VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT + VALUE "Comments", W32INFO_COMMENTS + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 0x4b0 + END + END commit 4d67f59a336bfa0ff19fc23209940724196fd886 Author: Ian Abbott Date: Thu Apr 25 12:00:16 2013 +0100 doc: fix some Texinfo warnings. * doc/gpg.texi: Fix syntax and add missing menu entries. * doc/gpgsm.texi: Fix subsectioning. -- These five patches fix some warnings from Texinfo 5 by adding some missing nodes and changing some sections to subsections, and moving an '@end ifset' to the start of a line. I also noticed the 'Deprecated options' subsection didn't appear in the GPG options menu, so I added it. (Texinfo never warned about it because it was after the last node in the menu.) 1) doc/gpg.texi: move '@end ifset' to start of line 2) doc/gpg.texi: Add missing node for 'Compliance options' section. 3) doc/gpg.texi: add node for 'Deprecated options' subsection. 4) doc/gpg.texi: make 'Unattended key generation' a subsection 5) doc/gpgsm.texi: fix subsectioning for Unattended Usage (all 5 merged into one patch by wk) diff --git a/doc/gpg.texi b/doc/gpg.texi index cec4581..a88ddca 100644 --- a/doc/gpg.texi +++ b/doc/gpg.texi @@ -926,7 +926,9 @@ behaviour and to change the default configuration. * GPG Key related Options:: Key related options. * GPG Input and Output:: Input and Output. * OpenPGP Options:: OpenPGP protocol specific options. +* Compliance Options:: Compliance options. * GPG Esoteric Options:: Doing things one usually don't want to do. +* Deprecated Options:: Deprecated options. @end menu Long options can be put in an options file (default @@ -2183,6 +2185,7 @@ meaningful if @option{--s2k-mode} is 3. @c *************************** @c ******* Compliance ******** @c *************************** + at node Compliance Options @subsection Compliance options These options control what GnuPG is compliant to. Only one of these @@ -2845,6 +2848,7 @@ on the configuration file. @c ******************************* @c ******* Deprecated ************ @c ******************************* + at node Deprecated Options @subsection Deprecated options @table @gnupgtabopt @@ -2990,9 +2994,9 @@ Operation is further controlled by a few environment variables: @item GPG_AGENT_INFO Used to locate the gpg-agent. - @ifset gpgone + at ifset gpgone This is only honored when @option{--use-agent} is set. - @end ifset + at end ifset The value consists of 3 colon delimited fields: The first is the path to the Unix Domain Socket, the second the PID of the gpg-agent and the protocol version which should be set to 1. When starting the gpg-agent @@ -3167,8 +3171,8 @@ are almost always required for this. @end menu - at node Unattended GPG key generation,,,Unattended Usage of GPG - at section Unattended key generation + at node Unattended GPG key generation + at subsection Unattended key generation The command @option{--gen-key} may be used along with the option @option{--batch} for unattended key generation. The parameters are diff --git a/doc/gpgsm.texi b/doc/gpgsm.texi index 6a84391..f7cedaf 100644 --- a/doc/gpgsm.texi +++ b/doc/gpgsm.texi @@ -916,8 +916,8 @@ but may also be used in the standard operation mode by using the * CSR and certificate creation:: CSR and certificate creation. @end menu - at node Automated signature checking,,,Unattended Usage - at section Automated signature checking + at node Automated signature checking + at subsection Automated signature checking It is very important to understand the semantics used with signature verification. Checking a signature is not as simple as it may sound and @@ -960,8 +960,8 @@ this is a missing certificate. @end table - at node CSR and certificate creation,,,Unattended Usage - at section CSR and certificate creation + at node CSR and certificate creation + at subsection CSR and certificate creation @ifclear gpgtwoone @strong{Please notice}: The immediate creation of certificates is only ----------------------------------------------------------------------- Summary of changes: agent/Makefile.am | 28 +++--------- agent/gpg-agent-w32info.rc | 50 ++++++++++++++++++++++ am/cmacros.am | 12 ++++- common/Makefile.am | 3 +- artwork/gnupg-favicon-1.ico => common/gnupg.ico | Bin 10134 -> 10134 bytes common/w32info-rc.h.in | 32 ++++++++++++++ configure.ac | 23 ++++++++++ doc/gpg.texi | 12 ++++-- doc/gpgsm.texi | 8 ++-- g10/Makefile.am | 9 +++- g10/gpg-w32info.rc | 50 ++++++++++++++++++++++ scd/Makefile.am | 8 +++- scd/scdaemon-w32info.rc | 50 ++++++++++++++++++++++ sm/Makefile.am | 13 +++--- sm/gpgsm-w32info.rc | 50 ++++++++++++++++++++++ tools/Makefile.am | 9 +++- tools/gpg-connect-agent-w32info.rc | 51 +++++++++++++++++++++++ 17 files changed, 361 insertions(+), 47 deletions(-) create mode 100644 agent/gpg-agent-w32info.rc copy artwork/gnupg-favicon-1.ico => common/gnupg.ico (100%) create mode 100644 common/w32info-rc.h.in create mode 100644 g10/gpg-w32info.rc create mode 100644 scd/scdaemon-w32info.rc create mode 100644 sm/gpgsm-w32info.rc create mode 100644 tools/gpg-connect-agent-w32info.rc hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 7 22:18:15 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 07 May 2013 22:18:15 +0200 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-0, updated. gnupg-2.0.19-123-ge877f9e Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-0 has been updated via e877f9ee129dcbc245736e9334cfbc6725f19f9a (commit) from 049b3d9ca0285d15c00c215ac9b533c994196ca4 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit e877f9ee129dcbc245736e9334cfbc6725f19f9a Author: Werner Koch Date: Thu Apr 25 12:00:16 2013 +0100 Note: Wrong author in previous commit 049b3d9. -- Magit keeps the author and date from the last commit unless reset with a c-t. Time for Jim's git-log-fix. diff --git a/scripts/git-log-fix b/scripts/git-log-fix index 2879d92..e12b6ac 100644 --- a/scripts/git-log-fix +++ b/scripts/git-log-fix @@ -8,3 +8,7 @@ s/Conflicts:/--/ d9d98c510b936d48755f8c01165d7efa32502d24 # Fix old cherry-picked message. s/(fix wLangId in.*)/\1\n--/ + +049b3d9ca0285d15c00c215ac9b533c994196ca4 +# Fix wrong author +s/Ian Abbott.*>/Werner Koch / ----------------------------------------------------------------------- Summary of changes: scripts/git-log-fix | 4 ++++ 1 files changed, 4 insertions(+), 0 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 8 21:03:08 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 08 May 2013 21:03:08 +0200 Subject: [git] GPGME - branch, master, updated. gpgme-1.4.1-4-g9f330be Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via 9f330be8210d2498fe93d4166b6f6c02fca76475 (commit) via 2118f497010a9a41c29d062a7605ff2e136f8f4e (commit) via a7e5f1096f02af7bfb678b0bea8da6ccfc28cc79 (commit) from de30df9ce359202b2449697c7e16dc0311e9050f (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 9f330be8210d2498fe93d4166b6f6c02fca76475 Author: Werner Koch Date: Thu Apr 25 12:00:16 2013 +0100 Fix hang in socket closing. * src/w32-io.c (destroy_reader): Call shutdown. (reader): Do not print an error in the shutdown case. diff --git a/src/w32-io.c b/src/w32-io.c index 164205e..776e379 100644 --- a/src/w32-io.c +++ b/src/w32-io.c @@ -316,6 +316,21 @@ reader (void *arg) } else { + /* Check whether the shutdown triggered the error - + no need to to print a warning in this case. */ + if ( ctx->error_code == WSAECONNABORTED + || ctx->error_code == WSAECONNRESET) + { + LOCK (ctx->mutex); + if (ctx->stop_me) + { + UNLOCK (ctx->mutex); + TRACE_LOG ("got shutdown"); + break; + } + UNLOCK (ctx->mutex); + } + ctx->error = 1; TRACE_LOG1 ("recv error: ec=%d", ctx->error_code); } @@ -357,6 +372,7 @@ reader (void *arg) UNLOCK (ctx->mutex); break; } + TRACE_LOG1 ("got %u bytes", nread); ctx->writepos = (ctx->writepos + nread) % READBUF_SIZE; @@ -495,6 +511,26 @@ destroy_reader (struct reader_context_s *ctx) } #endif + /* The reader thread is usually blocking in recv or ReadFile. If + the peer does not send an EOF or breaks the pipe the WFSO might + get stuck waiting for the termination of the reader thread. This + happens quite often with sockets, thus we definitely need to get + out of the recv. A shutdown does this nicely. For handles + (i.e. pipes) it would also be nice to cancel the operation, but + such a feature is only available since Vista. Thus we need to + dlopen that syscall. */ + if (ctx->file_hd != INVALID_HANDLE_VALUE) + { + /* Fixme: Call CancelSynchronousIo (handle_of_thread). */ + } + else if (ctx->file_sock != INVALID_SOCKET) + { + if (shutdown (ctx->file_sock, 2)) + TRACE2 (DEBUG_SYSIO, "gpgme:destroy_reader", ctx->file_hd, + "shutdown socket %d failed: %s", + ctx->file_sock, (int) WSAGetLastError ()); + } + TRACE1 (DEBUG_SYSIO, "gpgme:destroy_reader", ctx->file_hd, "waiting for termination of thread %p", ctx->thread_hd); WaitForSingleObject (ctx->stopped, INFINITE); commit 2118f497010a9a41c29d062a7605ff2e136f8f4e Author: Werner Koch Date: Mon May 6 20:23:47 2013 +0200 Improve debug output of the I/O reader and writer. * src/w32-io.c (reader, writer): Also print file_sock. diff --git a/src/w32-io.c b/src/w32-io.c index cbc3064..164205e 100644 --- a/src/w32-io.c +++ b/src/w32-io.c @@ -264,8 +264,8 @@ reader (void *arg) int nbytes; DWORD nread; int sock; - TRACE_BEG1 (DEBUG_SYSIO, "gpgme:reader", ctx->file_hd, - "thread=%p", ctx->thread_hd); + TRACE_BEG2 (DEBUG_SYSIO, "gpgme:reader", ctx->file_hd, + "file_sock=%d, thread=%p", ctx->file_sock, ctx->thread_hd); if (ctx->file_hd != INVALID_HANDLE_VALUE) sock = 0; @@ -400,6 +400,9 @@ create_reader (int fd) TRACE_SYSERR (EIO); return NULL; } + TRACE_LOG4 ("fd=%d -> handle=%p socket=%d dupfrom=%d", + fd, fd_table[fd].handle, fd_table[fd].socket, + fd_table[fd].dup_from); ctx->file_hd = fd_table[fd].handle; ctx->file_sock = fd_table[fd].socket; @@ -652,8 +655,8 @@ writer (void *arg) struct writer_context_s *ctx = arg; DWORD nwritten; int sock; - TRACE_BEG1 (DEBUG_SYSIO, "gpgme:writer", ctx->file_hd, - "thread=%p", ctx->thread_hd); + TRACE_BEG2 (DEBUG_SYSIO, "gpgme:writer", ctx->file_hd, + "file_sock=%d, thread=%p", ctx->file_sock, ctx->thread_hd); if (ctx->file_hd != INVALID_HANDLE_VALUE) sock = 0; @@ -766,6 +769,9 @@ create_writer (int fd) TRACE_SYSERR (EIO); return NULL; } + TRACE_LOG4 ("fd=%d -> handle=%p socket=%d dupfrom=%d", + fd, fd_table[fd].handle, fd_table[fd].socket, + fd_table[fd].dup_from); ctx->file_hd = fd_table[fd].handle; ctx->file_sock = fd_table[fd].socket; @@ -1149,6 +1155,10 @@ _gpgme_io_close (int fd) return TRACE_SYSRES (-1); } + TRACE_LOG4 ("fd=%d -> handle=%p socket=%d dupfrom=%d", + fd, fd_table[fd].handle, fd_table[fd].socket, + fd_table[fd].dup_from); + kill_reader (fd); kill_writer (fd); LOCK (notify_table_lock); @@ -1544,7 +1554,7 @@ _gpgme_io_spawn (const char *path, char *const argv[], unsigned int flags, args = calloc (2 + i + 1, sizeof (*args)); args[0] = (char *) _gpgme_get_w32spawn_path (); args[1] = tmp_name; - args[2] = path; + args[2] = (char *)path; memcpy (&args[3], &argv[1], i * sizeof (*args)); memset (&sec_attr, 0, sizeof sec_attr); @@ -1734,7 +1744,9 @@ _gpgme_io_select (struct io_select_fd_s *fds, size_t nfds, int nonblock) TRACE_BEG2 (DEBUG_SYSIO, "_gpgme_io_select", fds, "nfds=%u, nonblock=%u", nfds, nonblock); +#if 0 restart: +#endif TRACE_SEQ (dbg_help, "select on [ "); any = 0; nwait = 0; commit a7e5f1096f02af7bfb678b0bea8da6ccfc28cc79 Author: Werner Koch Date: Mon May 6 20:22:23 2013 +0200 Simplify a debug code function. * src/debug.c (_gpgme_debug): Remove static space string. diff --git a/src/debug.c b/src/debug.c index 56effa7..ca0bb21 100644 --- a/src/debug.c +++ b/src/debug.c @@ -258,17 +258,10 @@ _gpgme_debug (int level, const char *format, ...) } #ifdef FRAME_NR { - char spaces[] = " "; - int nr_spaces = sizeof (spaces) - 1; - int nr_columns; - - nr_columns = 2 * (frame_nr - 1); - if (nr_columns > nr_spaces) - nr_columns = nr_spaces; - if (nr_columns < 0) - nr_columns = 0; - spaces[nr_columns] = '\0'; - fprintf (errfp, "%s", spaces); + int indent; + + indent = frame_nr > 0? (2 * (frame_nr - 1)):0; + fprintf (errfp, "%*s", indent < 40? indent : 40, ""); } #endif ----------------------------------------------------------------------- Summary of changes: src/debug.c | 15 ++++----------- src/w32-io.c | 58 +++++++++++++++++++++++++++++++++++++++++++++++++++++----- 2 files changed, 57 insertions(+), 16 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Fri May 10 00:05:09 2013 From: cvs at cvs.gnupg.org (by Andrey) Date: Fri, 10 May 2013 00:05:09 +0200 Subject: [git] GCRYPT - branch, compliant-ecc-keygen, created. libgcrypt-1.5.0-124-g296f38a Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, compliant-ecc-keygen has been created at 296f38a2bd2e25788643a42e4881faed00884a40 (commit) - Log ----------------------------------------------------------------- commit 296f38a2bd2e25788643a42e4881faed00884a40 Author: Andrey Date: Thu May 9 14:38:46 2013 -0700 Generate ECC keys Q=(x,y) as compliant keys, enabling their compact representation as simply x. See http://tools.ietf.org/html/draft-jivsov-ecc-compact 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. diff --git a/cipher/ecc.c b/cipher/ecc.c index 34ed2c3..d56c1a8 100644 --- a/cipher/ecc.c +++ b/cipher/ecc.c @@ -569,19 +569,64 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name, point_set (&sk->E.G, &E.G); sk->E.n = mpi_copy (E.n); point_init (&sk->Q); - point_set (&sk->Q, &Q); - sk->d = mpi_copy (d); + + /* We want the Q=(x,y) be a "compliant key" in terms of the http://tools.ietf.org/html/draft-jivsov-ecc-compact, + * which simply means that we choose either Q=(x,y) or -Q=(x,p-y) such that we end up with the min(y,p-y) as the y coordinate. + * Such a public key allows the most efficient compression: y can simply be dropped because we know that it's a minimum of the two + * possibilities without any loss of security. + */ + { + gcry_mpi_t x, p_y, y, z = mpi_copy(mpi_const (MPI_C_ONE)); + const unsigned int nbits = mpi_get_nbits (E.p); + x = mpi_new (nbits); + p_y = mpi_new (nbits); + y = mpi_new (nbits); + + if (_gcry_mpi_ec_get_affine (x, y, &Q, ctx)) + log_fatal ("ecgen: Failed to get affine coordinates for Q\n"); + + mpi_sub( p_y, E.p, y ); /* p_y = p-y */ + + if( mpi_cmp( p_y /*p-y*/, y ) < 0 ) { /* is p-y < p ? */ + log_mpidump ("ecgen p-y", p_y); + log_mpidump ("ecgen y ", y); + log_debug ("ecgen will replace y with p-y\n"); + /* log_mpidump ("ecgen d before", d); */ + /* we need to end up with -Q; this assures that new Q's y is the smallest one */ + mpi_sub( sk->d, E.n, d ); /* d = order-d */ + /* log_mpidump ("ecgen d after ", sk->d); */ + gcry_mpi_point_set (&sk->Q, x, p_y/*p-y*/, z); /* Q = -Q */ + if (DBG_CIPHER) + { + log_debug ("ecgen converted Q to a compliant point\n"); + } + } + else { + /* no change is needed exactly 50% of the time: just copy */ + sk->d = mpi_copy (d); + point_set (&sk->Q, &Q); + if (DBG_CIPHER) + { + log_debug ("ecgen didn't need to convert Q to a compliant point\n"); + } + } + mpi_free (x); + mpi_free (p_y); + mpi_free (y); + mpi_free (z); + } + /* We also return copies of G and Q in affine coordinates if requested. */ if (g_x && g_y) { if (_gcry_mpi_ec_get_affine (g_x, g_y, &sk->E.G, ctx)) - log_fatal ("ecgen: Failed to get affine coordinates\n"); + log_fatal ("ecgen: Failed to get affine coordinates for G\n"); } if (q_x && q_y) { if (_gcry_mpi_ec_get_affine (q_x, q_y, &sk->Q, ctx)) - log_fatal ("ecgen: Failed to get affine coordinates\n"); + log_fatal ("ecgen: Failed to get affine coordinates for Q\n"); } _gcry_mpi_ec_free (ctx); ----------------------------------------------------------------------- hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Fri May 10 18:52:01 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Fri, 10 May 2013 18:52:01 +0200 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-0, updated. gnupg-2.0.19-128-g9b87602 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-0 has been updated via 9b8760233fa3416b0bda7db8ee8f4eaaaa8190a8 (commit) via 11ce4c79bb953ae3a20f6de609655f6949017c54 (commit) via 45451565b9d1ec08dbd44165998dd1272c7a6590 (commit) via 3f79a0b4b4bffa6b04ec7fb0eb82c3bb3ae70d16 (commit) via 0a9a4a38df0a5d6a84302154470904b9ec8014f5 (commit) from e877f9ee129dcbc245736e9334cfbc6725f19f9a (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 9b8760233fa3416b0bda7db8ee8f4eaaaa8190a8 Author: Werner Koch Date: Thu Apr 25 12:00:16 2013 +0100 Post release version bump. -- diff --git a/NEWS b/NEWS index 9e64e46..bf6e11c 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,6 @@ +Noteworthy changes in version 2.0.21 (unreleased) +------------------------------------------------- + Noteworthy changes in version 2.0.20 (2013-05-10) ------------------------------------------------- diff --git a/announce.txt b/announce.txt index 4171d94..d4e11b1 100644 --- a/announce.txt +++ b/announce.txt @@ -5,7 +5,7 @@ Mail-Followup-To: gnupg-users at gnupg.org Hello! We are pleased to announce the availability of a new stable GnuPG-2 -release: Version 2.0.19. +release: Version 2.0.20. The GNU Privacy Guard (GnuPG) is GNU's tool for secure communication and data storage. It can be used to encrypt data, create digital @@ -14,7 +14,7 @@ framework for public key cryptography. It includes an advanced key management facility and is compliant with the OpenPGP and S/MIME standards. -GnuPG-2 has a different architecture than GnuPG-1 (e.g. 1.4.12) in +GnuPG-2 has a different architecture than GnuPG-1 (e.g. 1.4.13) in that it splits up functionality into several modules. However, both versions may be installed alongside without any conflict. In fact, the gpg version from GnuPG-1 is able to make use of the gpg-agent as @@ -29,24 +29,43 @@ GnuPG is distributed under the terms of the GNU General Public License also available for other Unices, Microsoft Windows and Mac OS X. -What's New in 2.0.19 +What's New in 2.0.20 ==================== - * GPG now accepts a space separated fingerprint as a user ID. This - allows to copy and paste the fingerprint from the key listing. + * Decryption using smartcards keys > 3072 bit does now work. - * GPG now uses the longest key ID available. Removed support for the - original HKP keyserver which is not anymore used by any site. + * New meta option ignore-invalid-option to allow using the same + option file by other GnuPG versions. - * Rebuild the trustdb after changing the option --min-cert-level. + * gpg: The hash algorithm is now printed for sig records in key listings. - * Ukrainian translation. + * gpg: Skip invalid keyblock packets during import to avoid a DoS. - * Honor option --cert-digest-algo when creating a cert. + * gpg: Correctly handle ports from DNS SRV records. - * Emit a DECRYPTION_INFO status line. + * keyserver: Improve use of SRV records - * Improved detection of JPEG files. + * gpg-agent: Avoid tty corruption when killing pinentry. + + * scdaemon: Improve detection of card insertion and removal. + + * scdaemon: Rename option --disable-keypad to --disable-pinpad. + + * scdaemon: Better support for CCID readers. Now, the internal CCID + driver supports readers without the auto configuration feature. + + * scdaemon: Add pinpad input for PC/SC, if your reader has pinpad and + it supports variable length PIN input, and you specify + --enable-pinpad-varlen option. + + * scdaemon: New option --enable-pinpad-varlen. + + * scdaemon: Install into libexecdir to avoid accidental execution + from the command line. + + * Support building using w64-mingw32. + + * Assorted bug fixes. Getting the Software @@ -55,7 +74,7 @@ Getting the Software Please follow the instructions found at http://www.gnupg.org/download/ or read on: -GnuPG 2.0.19 may be downloaded from one of the GnuPG mirror sites or +GnuPG 2.0.20 may be downloaded from one of the GnuPG mirror sites or direct from ftp://ftp.gnupg.org/gcrypt/gnupg/ . The list of mirrors can be found at http://www.gnupg.org/mirrors.html . Note, that GnuPG is not available at ftp.gnu.org. @@ -63,14 +82,14 @@ is not available at ftp.gnu.org. On the FTP server and its mirrors you should find the following files in the gnupg/ directory: - gnupg-2.0.19.tar.bz2 (4089k) - gnupg-2.0.19.tar.bz2.sig + gnupg-2.0.20.tar.bz2 (4186k) + gnupg-2.0.20.tar.bz2.sig GnuPG source compressed using BZIP2 and OpenPGP signature. - gnupg-2.0.18-2.0.19.diff.bz2 (305k) + gnupg-2.0.19-2.0.20.diff.bz2 (249k) - A patch file to upgrade a 2.0.18 GnuPG source tree. This patch + A patch file to upgrade a 2.0.19 GnuPG source tree. This patch does not include updates of the language files. Note, that we don't distribute gzip compressed tarballs for GnuPG-2. @@ -85,9 +104,9 @@ the following ways: * If you already have a trusted version of GnuPG installed, you can simply check the supplied signature. For example to check the - signature of the file gnupg-2.0.19.tar.bz2 you would use this command: + signature of the file gnupg-2.0.20.tar.bz2 you would use this command: - gpg --verify gnupg-2.0.19.tar.bz2.sig + gpg --verify gnupg-2.0.20.tar.bz2.sig This checks whether the signature file matches the source file. You should see a message indicating that the signature is good and @@ -110,15 +129,15 @@ the following ways: * If you are not able to use an old version of GnuPG, you have to verify the SHA-1 checksum. Assuming you downloaded the file - gnupg-2.0.19.tar.bz2, you would run the sha1sum command like this: + gnupg-2.0.20.tar.bz2, you would run the sha1sum command like this: - sha1sum gnupg-2.0.19.tar.bz2 + sha1sum gnupg-2.0.20.tar.bz2 and check that the output matches the first line from the following list: -190c09e6688f688fb0a5cf884d01e240d957ac1f gnupg-2.0.19.tar.bz2 -d5e5643dc5ecb4e5296f1a9500f850cfbfd0f8ff gnupg-2.0.18-2.0.19.diff.bz2 +7ddfefa37ee9da89a8aaa8f9059d251b4cd02562 gnupg-2.0.20.tar.bz2 +4afefda1f42c7b8065e97c6df051fab2db552642 gnupg-2.0.19-2.0.20.diff.bz2 Documentation @@ -158,11 +177,11 @@ service directory at: http://www.gnupg.org/service.html -Maintaining and improving GnuPG is costly. For more than 10 years -now, g10 Code, a German company owned and headed by GnuPG's principal -author Werner Koch, is bearing the majority of these costs. To help -them carry on this work, they need your support. Please consider to -visit the GnuPG donation page at: +The driving force behind the development of GnuPG is the company of +its principal author, Werner Koch. Maintenance and improvement of +GnuPG and related software takes up most of their resources. To +allow him them continue his work he asks to either purchase a support +contract, engage them for custom enhancements, or to donate money: http://g10code.com/gnupg-donation.html diff --git a/configure.ac b/configure.ac index 4752772..b85124c 100644 --- a/configure.ac +++ b/configure.ac @@ -26,7 +26,7 @@ min_automake_version="1.10" # (git tag -s gnupg-2.n.m) and run "./autogen.sh --force". Please # bump the version number immediately *after* the release and do # another commit and push so that the git magic is able to work. -m4_define([mym4_version], [2.0.20]) +m4_define([mym4_version], [2.0.21]) # Below is m4 magic to extract and compute the git revision number, # the decimalized short revision number, a beta version string and a commit 11ce4c79bb953ae3a20f6de609655f6949017c54 Author: Werner Koch Date: Thu Apr 25 12:00:16 2013 +0100 Release 2.0.20 diff --git a/AUTHORS b/AUTHORS index 92f44cb..c787c7c 100644 --- a/AUTHORS +++ b/AUTHORS @@ -180,7 +180,7 @@ name gpg2keys_*. Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, - 2012 Free Software Foundation, Inc. + 2012, 2013 Free Software Foundation, Inc. This file is free software; as a special exception the author gives unlimited permission to copy and/or distribute it, with or without diff --git a/NEWS b/NEWS index 9ead9bf..9e64e46 100644 --- a/NEWS +++ b/NEWS @@ -1,33 +1,40 @@ -Noteworthy changes in version 2.0.20 (unreleased) +Noteworthy changes in version 2.0.20 (2013-05-10) ------------------------------------------------- - * The hash algorithm is now printed for sig records in key listings. - * Decryption using smartcards keys > 3072 bit does now work. * New meta option ignore-invalid-option to allow using the same option file by other GnuPG versions. - * [gpg] Skip invalid keyblock packets during import to avoid a DoS. + * gpg: The hash algorithm is now printed for sig records in key listings. + + * gpg: Skip invalid keyblock packets during import to avoid a DoS. + + * gpg: Correctly handle ports from DNS SRV records. - * [gpg] Correctly handle ports from DNS SRV records. + * keyserver: Improve use of SRV records - * [gpg-agent] Avoid tty corruption when killing pinentry. + * gpg-agent: Avoid tty corruption when killing pinentry. - * [scdaemon] Rename option --disable-keypad to --disable-pinpad. + * scdaemon: Improve detection of card insertion and removal. - * [scdaemon] Better support for CCID readers. Now, the internal CCID + * scdaemon: Rename option --disable-keypad to --disable-pinpad. + + * scdaemon: Better support for CCID readers. Now, the internal CCID driver supports readers without the auto configuration feature. - * [scdaemon] Add pinpad input for PC/SC, if your reader has pinpad - and it supports variable length PIN input, and you specify + * scdaemon: Add pinpad input for PC/SC, if your reader has pinpad and + it supports variable length PIN input, and you specify --enable-pinpad-varlen option. - * [scdaemon] New option --enable-pinpad-varlen. + * scdaemon: New option --enable-pinpad-varlen. - * [scdaemon] Install into libexecdir to avoid accidental execution + * scdaemon: Install into libexecdir to avoid accidental execution from the command line. + * Support building using w64-mingw32. + + * Assorted bug fixes. Noteworthy changes in version 2.0.19 (2012-03-27) diff --git a/jnlib/argparse.c b/jnlib/argparse.c index ea624e8..c457953 100644 --- a/jnlib/argparse.c +++ b/jnlib/argparse.c @@ -1266,7 +1266,7 @@ strusage( int level ) break; case 11: p = "foo"; break; case 13: p = "0.0"; break; - case 14: p = "Copyright (C) 2012 Free Software Foundation, Inc."; break; + case 14: p = "Copyright (C) 2013 Free Software Foundation, Inc."; break; case 15: p = "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n"; diff --git a/tools/watchgnupg.c b/tools/watchgnupg.c index aae1120..4bbf212 100644 --- a/tools/watchgnupg.c +++ b/tools/watchgnupg.c @@ -188,7 +188,7 @@ static void print_version (int with_help) { fputs (MYVERSION_LINE "\n" - "Copyright (C) 2012 Free Software Foundation, Inc.\n" + "Copyright (C) 2013 Free Software Foundation, Inc.\n" "This program comes with ABSOLUTELY NO WARRANTY.\n" "This is free software, and you are welcome to redistribute it\n" "under certain conditions. See the file COPYING for details.\n", commit 45451565b9d1ec08dbd44165998dd1272c7a6590 Author: Werner Koch Date: Thu Apr 25 12:00:16 2013 +0100 po: Auto updates -- diff --git a/po/uk.po b/po/uk.po index 4eced4b..e14cc6e 100644 --- a/po/uk.po +++ b/po/uk.po @@ -186,7 +186,6 @@ msgid "Reset Code" msgstr "??? ????????" #, c-format -#| msgid "%s%%0A%%0AUse the reader's keypad for input." msgid "%s%%0A%%0AUse the reader's pinpad for input." msgstr "%s%%0A%%0A????????????? ?????????? ??????????? ????????? ??? ????????." @@ -285,7 +284,6 @@ msgid "Yes, protection is not needed" msgstr "???, ? ??????? ????? ???????" #, c-format -#| msgid "Please enter the passphrase to%0Ato protect your new key" msgid "Please enter the passphrase to%0Aprotect your new key" msgstr "??????? ?????? ??%0A? ????? ??????? ?????? ?????? ?????" @@ -1694,10 +1692,6 @@ msgstr "" msgid "Usage: gpg [options] [files] (-h for help)" msgstr "????????????: gpg [?????????] [?????] (-h ? ???????)" -#| msgid "" -#| "Syntax: gpg [options] [files]\n" -#| "sign, check, encrypt or decrypt\n" -#| "default operation depends on the input data\n" msgid "" "Syntax: gpg [options] [files]\n" "Sign, check, encrypt or decrypt\n" @@ -5383,9 +5377,6 @@ msgstr "????????? ????? ???????????" msgid "Usage: kbxutil [options] [files] (-h for help)" msgstr "????????????: kbxutil [?????????] [?????] (-h ? ???????)" -#| msgid "" -#| "Syntax: kbxutil [options] [files]\n" -#| "list, export, import Keybox data\n" msgid "" "Syntax: kbxutil [options] [files]\n" "List, export, import Keybox data\n" @@ -5546,11 +5537,9 @@ msgstr "|AN|????? ???????????????? ??????" msgid "|N|New PIN" msgstr "|N|????? ??????" -#| msgid "|A|Please enter the Admin PIN" msgid "||Please enter the Admin PIN and New Admin PIN" msgstr "|A|??????? ????? ???????????????? ??????" -#| msgid "||Please enter the PIN" msgid "||Please enter the PIN and New PIN" msgstr "||??????? ????? ??????" @@ -5616,7 +5605,6 @@ msgstr "????????? ????????????????? ??????? ? msgid "can't access %s - invalid OpenPGP card?\n" msgstr "?? ??????? ???????? ?????? ?? %s ? ?????????? ?????? OpenPGP?\n" -#| msgid "||Please enter your PIN at the reader's keypad" msgid "||Please enter your PIN at the reader's pinpad" msgstr "||??????? ??? ?????? ?? ????????? ???????????? ?????? ?????????" @@ -5650,7 +5638,6 @@ msgstr "?? ??????????????? ??????????? ?????? msgid "|N|disconnect the card after N seconds of inactivity" msgstr "|N|?????????? ?????????? ??????? ????????? ?????? ??????" -#| msgid "do not use a reader's keypad" msgid "do not use a reader's pinpad" msgstr "?? ??????????????? ????????? ?????????? ?????????" @@ -5931,19 +5918,15 @@ msgstr "?? ??????? ???????????? ????? ? ?????? msgid "error getting key usage information: %s\n" msgstr "??????? ??? ??? ?????? ????????? ????? ???? ???????????? ?????: %s\n" -#| msgid "certificate should have not been used for certification\n" msgid "certificate should not have been used for certification\n" msgstr "?????????? ?? ??? ????????????????? ??? ????????????\n" -#| msgid "certificate should have not been used for OCSP response signing\n" msgid "certificate should not have been used for OCSP response signing\n" msgstr "?????????? ?? ??? ????????????????? ??? ???????????? ?????????? OCSP\n" -#| msgid "certificate should have not been used for encryption\n" msgid "certificate should not have been used for encryption\n" msgstr "?????????? ?? ??? ????????????????? ??? ??????????\n" -#| msgid "certificate should have not been used for signing\n" msgid "certificate should not have been used for signing\n" msgstr "?????????? ?? ??? ????????????????? ??? ????????????\n" @@ -6220,10 +6203,6 @@ msgstr "" msgid "Usage: gpgsm [options] [files] (-h for help)" msgstr "????????????: gpgsm [?????????] [?????] (-h ? ???????)" -#| msgid "" -#| "Syntax: gpgsm [options] [files]\n" -#| "sign, check, encrypt or decrypt using the S/MIME protocol\n" -#| "default operation depends on the input data\n" msgid "" "Syntax: gpgsm [options] [files]\n" "Sign, check, encrypt or decrypt using the S/MIME protocol\n" commit 3f79a0b4b4bffa6b04ec7fb0eb82c3bb3ae70d16 Author: Werner Koch Date: Thu Apr 25 12:00:16 2013 +0100 Update gpg-error, libgcrypt, and ksba m4 scripts. * m4/gpg-error.m4: Update from libgpg-error repo. * m4/ksba.m4: Likewise. * m4/libgcrypt.m4: Likewise. -- GnuPG-bug-id: 1496. Signed-off-by: Werner Koch diff --git a/m4/gpg-error.m4 b/m4/gpg-error.m4 index 9d96d16..feb963c 100644 --- a/m4/gpg-error.m4 +++ b/m4/gpg-error.m4 @@ -1,5 +1,5 @@ # gpg-error.m4 - autoconf macro to detect libgpg-error. -# Copyright (C) 2002, 2003, 2004 g10 Code GmbH +# Copyright (C) 2002, 2003, 2004, 2011 g10 Code GmbH # # This file is free software; as a special exception the author gives # unlimited permission to copy and/or distribute it, with or without @@ -14,21 +14,34 @@ dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) dnl Test for libgpg-error and define GPG_ERROR_CFLAGS and GPG_ERROR_LIBS dnl AC_DEFUN([AM_PATH_GPG_ERROR], -[ AC_ARG_WITH(gpg-error-prefix, - AC_HELP_STRING([--with-gpg-error-prefix=PFX], - [prefix where GPG Error is installed (optional)]), - gpg_error_config_prefix="$withval", gpg_error_config_prefix="") +[ AC_REQUIRE([AC_CANONICAL_HOST]) + gpg_error_config_prefix="" + dnl --with-libgpg-error-prefix=PFX is the preferred name for this option, + dnl since that is consistent with how our three siblings use the directory/ + dnl package name in --with-$dir_name-prefix=PFX. + AC_ARG_WITH(libgpg-error-prefix, + AC_HELP_STRING([--with-libgpg-error-prefix=PFX], + [prefix where GPG Error is installed (optional)]), + [gpg_error_config_prefix="$withval"]) + + dnl Accept --with-gpg-error-prefix and make it work the same as + dnl --with-libgpg-error-prefix above, for backwards compatibility, + dnl but do not document this old, inconsistently-named option. + AC_ARG_WITH(gpg-error-prefix,, + [gpg_error_config_prefix="$withval"]) + if test x$gpg_error_config_prefix != x ; then if test x${GPG_ERROR_CONFIG+set} != xset ; then GPG_ERROR_CONFIG=$gpg_error_config_prefix/bin/gpg-error-config fi fi - AC_PATH_PROG(GPG_ERROR_CONFIG, gpg-error-config, no) + AC_PATH_TOOL(GPG_ERROR_CONFIG, gpg-error-config, no) min_gpg_error_version=ifelse([$1], ,0.0,$1) AC_MSG_CHECKING(for GPG Error - version >= $min_gpg_error_version) ok=no - if test "$GPG_ERROR_CONFIG" != "no" ; then + if test "$GPG_ERROR_CONFIG" != "no" \ + && test -f "$GPG_ERROR_CONFIG" ; then req_major=`echo $min_gpg_error_version | \ sed 's/\([[0-9]]*\)\.\([[0-9]]*\)/\1/'` req_minor=`echo $min_gpg_error_version | \ @@ -40,7 +53,7 @@ AC_DEFUN([AM_PATH_GPG_ERROR], sed 's/\([[0-9]]*\)\.\([[0-9]]*\).*/\2/'` if test "$major" -gt "$req_major"; then ok=yes - else + else if test "$major" -eq "$req_major"; then if test "$minor" -ge "$req_minor"; then ok=yes @@ -53,6 +66,19 @@ AC_DEFUN([AM_PATH_GPG_ERROR], GPG_ERROR_LIBS=`$GPG_ERROR_CONFIG $gpg_error_config_args --libs` AC_MSG_RESULT([yes ($gpg_error_config_version)]) ifelse([$2], , :, [$2]) + gpg_error_config_host=`$GPG_ERROR_CONFIG $gpg_error_config_args --host 2>/dev/null || echo none` + if test x"$gpg_error_config_host" != xnone ; then + if test x"$gpg_error_config_host" != x"$host" ; then + AC_MSG_WARN([[ +*** +*** The config script $GPG_ERROR_CONFIG was +*** built for $gpg_error_config_host and thus may not match the +*** used host $host. +*** You may want to use the configure option --with-gpg-error-prefix +*** to specify a matching config script. +***]]) + fi + fi else GPG_ERROR_CFLAGS="" GPG_ERROR_LIBS="" @@ -62,4 +88,3 @@ AC_DEFUN([AM_PATH_GPG_ERROR], AC_SUBST(GPG_ERROR_CFLAGS) AC_SUBST(GPG_ERROR_LIBS) ]) - diff --git a/m4/ksba.m4 b/m4/ksba.m4 index 1100387..73b2e26 100644 --- a/m4/ksba.m4 +++ b/m4/ksba.m4 @@ -15,13 +15,14 @@ dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) dnl Test for libksba and define KSBA_CFLAGS and KSBA_LIBS dnl MINIMUN-VERSION is a string with the version number optionalliy prefixed dnl with the API version to also check the API compatibility. Example: -dnl a MINIMUN-VERSION of 1:1.0.7 won't pass the test unless the installed +dnl a MINIMUN-VERSION of 1:1.0.7 won't pass the test unless the installed dnl version of libksba is at least 1.0.7 *and* the API number is 1. Using dnl this features allows to prevent build against newer versions of libksba dnl with a changed API. dnl AC_DEFUN([AM_PATH_KSBA], -[ AC_ARG_WITH(ksba-prefix, +[AC_REQUIRE([AC_CANONICAL_HOST]) + AC_ARG_WITH(ksba-prefix, AC_HELP_STRING([--with-ksba-prefix=PFX], [prefix where KSBA is installed (optional)]), ksba_config_prefix="$withval", ksba_config_prefix="") @@ -60,7 +61,7 @@ AC_DEFUN([AM_PATH_KSBA], sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'` if test "$major" -gt "$req_major"; then ok=yes - else + else if test "$major" -eq "$req_major"; then if test "$minor" -gt "$req_minor"; then ok=yes @@ -99,6 +100,19 @@ AC_DEFUN([AM_PATH_KSBA], KSBA_CFLAGS=`$KSBA_CONFIG $ksba_config_args --cflags` KSBA_LIBS=`$KSBA_CONFIG $ksba_config_args --libs` ifelse([$2], , :, [$2]) + libksba_config_host=`$LIBKSBA_CONFIG $ksba_config_args --host 2>/dev/null || echo none` + if test x"$libksba_config_host" != xnone ; then + if test x"$libksba_config_host" != x"$host" ; then + AC_MSG_WARN([[ +*** +*** The config script $LIBKSBA_CONFIG was +*** built for $libksba_config_host and thus may not match the +*** used host $host. +*** You may want to use the configure option --with-libksba-prefix +*** to specify a matching config script. +***]]) + fi + fi else KSBA_CFLAGS="" KSBA_LIBS="" diff --git a/m4/libgcrypt.m4 b/m4/libgcrypt.m4 index 854eaaa..6cf482f 100644 --- a/m4/libgcrypt.m4 +++ b/m4/libgcrypt.m4 @@ -1,5 +1,5 @@ dnl Autoconf macros for libgcrypt -dnl Copyright (C) 2002, 2004 Free Software Foundation, Inc. +dnl Copyright (C) 2002, 2004, 2011 Free Software Foundation, Inc. dnl dnl This file is free software; as a special exception the author gives dnl unlimited permission to copy and/or distribute it, with or without @@ -15,13 +15,14 @@ dnl [ACTION-IF-FOUND [, ACTION-IF-NOT-FOUND ]]]) dnl Test for libgcrypt and define LIBGCRYPT_CFLAGS and LIBGCRYPT_LIBS. dnl MINIMUN-VERSION is a string with the version number optionalliy prefixed dnl with the API version to also check the API compatibility. Example: -dnl a MINIMUN-VERSION of 1:1.2.5 won't pass the test unless the installed +dnl a MINIMUN-VERSION of 1:1.2.5 won't pass the test unless the installed dnl version of libgcrypt is at least 1.2.5 *and* the API number is 1. Using dnl this features allows to prevent build against newer versions of libgcrypt dnl with a changed API. dnl AC_DEFUN([AM_PATH_LIBGCRYPT], -[ AC_ARG_WITH(libgcrypt-prefix, +[ AC_REQUIRE([AC_CANONICAL_HOST]) + AC_ARG_WITH(libgcrypt-prefix, AC_HELP_STRING([--with-libgcrypt-prefix=PFX], [prefix where LIBGCRYPT is installed (optional)]), libgcrypt_config_prefix="$withval", libgcrypt_config_prefix="") @@ -31,7 +32,7 @@ AC_DEFUN([AM_PATH_LIBGCRYPT], fi fi - AC_PATH_PROG(LIBGCRYPT_CONFIG, libgcrypt-config, no) + AC_PATH_TOOL(LIBGCRYPT_CONFIG, libgcrypt-config, no) tmp=ifelse([$1], ,1:1.2.0,$1) if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then req_libgcrypt_api=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\1/'` @@ -59,7 +60,7 @@ AC_DEFUN([AM_PATH_LIBGCRYPT], sed 's/\([[0-9]]*\)\.\([[0-9]]*\)\.\([[0-9]]*\).*/\3/'` if test "$major" -gt "$req_major"; then ok=yes - else + else if test "$major" -eq "$req_major"; then if test "$minor" -gt "$req_minor"; then ok=yes @@ -98,6 +99,19 @@ AC_DEFUN([AM_PATH_LIBGCRYPT], LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags` LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs` ifelse([$2], , :, [$2]) + libgcrypt_config_host=`$LIBGCRYPT_CONFIG --host 2>/dev/null || echo none` + if test x"$libgcrypt_config_host" != xnone ; then + if test x"$libgcrypt_config_host" != x"$host" ; then + AC_MSG_WARN([[ +*** +*** The config script $LIBGCRYPT_CONFIG was +*** built for $libgcrypt_config_host and thus may not match the +*** used host $host. +*** You may want to use the configure option --with-libgcrypt-prefix +*** to specify a matching config script. +***]]) + fi + fi else LIBGCRYPT_CFLAGS="" LIBGCRYPT_LIBS="" commit 0a9a4a38df0a5d6a84302154470904b9ec8014f5 Author: Yuri Chornoivan Date: Thu Apr 25 12:00:16 2013 +0100 Update Ukrainian translation. diff --git a/po/uk.po b/po/uk.po index d87dba7..4eced4b 100644 --- a/po/uk.po +++ b/po/uk.po @@ -2,12 +2,12 @@ # Copyright (C) 2011 Free Software Foundation, Inc. # This file is distributed under the same license as the GnuPG package. # -# Yuri Chornoivan , 2011. +# Yuri Chornoivan , 2011, 2013. msgid "" msgstr "" "Project-Id-Version: gnupg2\n" "Report-Msgid-Bugs-To: translations at gnupg.org\n" -"PO-Revision-Date: 2011-08-28 10:55+0300\n" +"PO-Revision-Date: 2013-04-27 14:41+0300\n" "Last-Translator: Yuri Chornoivan \n" "Language-Team: Ukrainian \n" "Language: uk\n" @@ -16,7 +16,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Lokalize 1.2\n" +"X-Generator: Lokalize 1.5\n" #, c-format msgid "failed to acquire the pinentry lock: %s\n" @@ -185,7 +185,7 @@ msgstr "PUK" msgid "Reset Code" msgstr "??? ????????" -#, fuzzy, c-format +#, c-format #| msgid "%s%%0A%%0AUse the reader's keypad for input." msgid "%s%%0A%%0AUse the reader's pinpad for input." msgstr "%s%%0A%%0A????????????? ?????????? ??????????? ????????? ??? ????????." @@ -284,7 +284,7 @@ msgstr "" msgid "Yes, protection is not needed" msgstr "???, ? ??????? ????? ???????" -#, fuzzy, c-format +#, c-format #| msgid "Please enter the passphrase to%0Ato protect your new key" msgid "Please enter the passphrase to%0Aprotect your new key" msgstr "??????? ?????? ??%0A? ????? ??????? ?????? ?????? ?????" @@ -1694,7 +1694,6 @@ msgstr "" msgid "Usage: gpg [options] [files] (-h for help)" msgstr "????????????: gpg [?????????] [?????] (-h ? ???????)" -#, fuzzy #| msgid "" #| "Syntax: gpg [options] [files]\n" #| "sign, check, encrypt or decrypt\n" @@ -5384,7 +5383,6 @@ msgstr "????????? ????? ???????????" msgid "Usage: kbxutil [options] [files] (-h for help)" msgstr "????????????: kbxutil [?????????] [?????] (-h ? ???????)" -#, fuzzy #| msgid "" #| "Syntax: kbxutil [options] [files]\n" #| "list, export, import Keybox data\n" @@ -5393,7 +5391,7 @@ msgid "" "List, export, import Keybox data\n" msgstr "" "?????????: kbxutil [?????????] [?????]\n" -"????????, ?????????????, ???????????? ????? Keybox\n" +"????????, ?????????????, ???????????? ????? Keybox\n" #, c-format msgid "RSA modulus missing or not of size %d bits\n" @@ -5548,15 +5546,13 @@ msgstr "|AN|????? ???????????????? ??????" msgid "|N|New PIN" msgstr "|N|????? ??????" -#, fuzzy #| msgid "|A|Please enter the Admin PIN" msgid "||Please enter the Admin PIN and New Admin PIN" -msgstr "|A|??????? ???????????????? ??????" +msgstr "|A|??????? ????? ???????????????? ??????" -#, fuzzy #| msgid "||Please enter the PIN" msgid "||Please enter the PIN and New PIN" -msgstr "||??????? ??????" +msgstr "||??????? ????? ??????" msgid "error reading application data\n" msgstr "??????? ??????? ????? ????????\n" @@ -5620,7 +5616,6 @@ msgstr "????????? ????????????????? ??????? ? msgid "can't access %s - invalid OpenPGP card?\n" msgstr "?? ??????? ???????? ?????? ?? %s ? ?????????? ?????? OpenPGP?\n" -#, fuzzy #| msgid "||Please enter your PIN at the reader's keypad" msgid "||Please enter your PIN at the reader's pinpad" msgstr "||??????? ??? ?????? ?? ????????? ???????????? ?????? ?????????" @@ -5655,7 +5650,6 @@ msgstr "?? ??????????????? ??????????? ?????? msgid "|N|disconnect the card after N seconds of inactivity" msgstr "|N|?????????? ?????????? ??????? ????????? ?????? ??????" -#, fuzzy #| msgid "do not use a reader's keypad" msgid "do not use a reader's pinpad" msgstr "?? ??????????????? ????????? ?????????? ?????????" @@ -5664,7 +5658,7 @@ msgid "deny the use of admin card commands" msgstr "?????????? ???????????? ?????? ? ??????????????? ??????" msgid "use variable length input for pinpad" -msgstr "" +msgstr "??????????????? ??? ???????????? ?????? ?????? ??????? ???????? ?????" msgid "Usage: scdaemon [options] (-h for help)" msgstr "????????????: scdaemon [?????????] (-h ? ???????)" @@ -5937,22 +5931,18 @@ msgstr "?? ??????? ???????????? ????? ? ?????? msgid "error getting key usage information: %s\n" msgstr "??????? ??? ??? ?????? ????????? ????? ???? ???????????? ?????: %s\n" -#, fuzzy #| msgid "certificate should have not been used for certification\n" msgid "certificate should not have been used for certification\n" msgstr "?????????? ?? ??? ????????????????? ??? ????????????\n" -#, fuzzy #| msgid "certificate should have not been used for OCSP response signing\n" msgid "certificate should not have been used for OCSP response signing\n" msgstr "?????????? ?? ??? ????????????????? ??? ???????????? ?????????? OCSP\n" -#, fuzzy #| msgid "certificate should have not been used for encryption\n" msgid "certificate should not have been used for encryption\n" msgstr "?????????? ?? ??? ????????????????? ??? ??????????\n" -#, fuzzy #| msgid "certificate should have not been used for signing\n" msgid "certificate should not have been used for signing\n" msgstr "?????????? ?? ??? ????????????????? ??? ????????????\n" @@ -6230,7 +6220,6 @@ msgstr "" msgid "Usage: gpgsm [options] [files] (-h for help)" msgstr "????????????: gpgsm [?????????] [?????] (-h ? ???????)" -#, fuzzy #| msgid "" #| "Syntax: gpgsm [options] [files]\n" #| "sign, check, encrypt or decrypt using the S/MIME protocol\n" ----------------------------------------------------------------------- Summary of changes: AUTHORS | 2 +- NEWS | 32 ++++++++++++++------- announce.txt | 75 ++++++++++++++++++++++++++++++++------------------- configure.ac | 2 +- jnlib/argparse.c | 2 +- m4/gpg-error.m4 | 43 +++++++++++++++++++++++------ m4/ksba.m4 | 20 ++++++++++++-- m4/libgcrypt.m4 | 24 +++++++++++++--- po/uk.po | 50 ++++++---------------------------- tools/watchgnupg.c | 2 +- 10 files changed, 151 insertions(+), 101 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Sat May 11 16:07:00 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Sat, 11 May 2013 16:07:00 +0200 Subject: [git] GPGME - branch, master, updated. gpgme-1.4.1-5-g9e7df9a Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via 9e7df9aa6d81f0abbabb03a2346d80eb5d375f81 (commit) from 9f330be8210d2498fe93d4166b6f6c02fca76475 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 9e7df9aa6d81f0abbabb03a2346d80eb5d375f81 Author: Werner Koch Date: Thu Apr 25 12:00:16 2013 +0100 w32: Change the way the I/O threads are cleaned up. * src/w32-io.c (reader_context_s, create_reader) (writer_context_s, create_writer): Rename STOPPED to CLOSE_EV. (reader, writer): Remove setting of STOPPED. Wait for CLOSE_EV and then release the context. (destroy_reader, destroy_writer): Do not wait but set the CLOSE_EV. (kill_reader, kill_writer): Remove. (_gpgme_io_close): Add code from kill_reader and kill_writer. -- The old code was prone to deadlocks which were actually exhibited at Kleopatra startup. The new code is much more straightforward and easier to understand. The reason for the complex old code was probably due to our former idea to allow re-use of the I/O threads. However we have long given up on this. diff --git a/src/w32-io.c b/src/w32-io.c index 776e379..d896ec0 100644 --- a/src/w32-io.c +++ b/src/w32-io.c @@ -162,7 +162,9 @@ struct reader_context_s HANDLE have_data_ev; /* This is automatically reset. */ HANDLE have_space_ev; - HANDLE stopped; + /* This is manually reset but actually only triggered once. */ + HANDLE close_ev; + size_t readpos, writepos; char buffer[READBUF_SIZE]; }; @@ -194,7 +196,7 @@ struct writer_context_s /* This is manually reset. */ HANDLE have_data; HANDLE is_empty; - HANDLE stopped; + HANDLE close_ev; size_t nbytes; char buffer[WRITEBUF_SIZE]; }; @@ -383,9 +385,18 @@ reader (void *arg) } /* Indicate that we have an error or EOF. */ if (!SetEvent (ctx->have_data_ev)) - TRACE_LOG2 ("SetEvent (0x%x) failed: ec=%d", ctx->have_data_ev, - (int) GetLastError ()); - SetEvent (ctx->stopped); + TRACE_LOG2 ("SetEvent (0x%x) failed: ec=%d", ctx->have_data_ev, + (int) GetLastError ()); + + TRACE_LOG ("waiting for close"); + WaitForSingleObject (ctx->close_ev, INFINITE); + + CloseHandle (ctx->close_ev); + CloseHandle (ctx->have_data_ev); + CloseHandle (ctx->have_space_ev); + CloseHandle (ctx->thread_hd); + DESTROY_LOCK (ctx->mutex); + free (ctx); return TRACE_SUC (); } @@ -427,16 +438,16 @@ create_reader (int fd) if (ctx->have_data_ev) ctx->have_space_ev = CreateEvent (&sec_attr, FALSE, TRUE, NULL); if (ctx->have_space_ev) - ctx->stopped = CreateEvent (&sec_attr, TRUE, FALSE, NULL); - if (!ctx->have_data_ev || !ctx->have_space_ev || !ctx->stopped) + ctx->close_ev = CreateEvent (&sec_attr, TRUE, FALSE, NULL); + if (!ctx->have_data_ev || !ctx->have_space_ev || !ctx->close_ev) { TRACE_LOG1 ("CreateEvent failed: ec=%d", (int) GetLastError ()); if (ctx->have_data_ev) CloseHandle (ctx->have_data_ev); if (ctx->have_space_ev) CloseHandle (ctx->have_space_ev); - if (ctx->stopped) - CloseHandle (ctx->stopped); + if (ctx->close_ev) + CloseHandle (ctx->close_ev); free (ctx); /* FIXME: Translate the error code. */ TRACE_SYSERR (EIO); @@ -461,8 +472,8 @@ create_reader (int fd) CloseHandle (ctx->have_data_ev); if (ctx->have_space_ev) CloseHandle (ctx->have_space_ev); - if (ctx->stopped) - CloseHandle (ctx->stopped); + if (ctx->close_ev) + CloseHandle (ctx->close_ev); free (ctx); TRACE_SYSERR (EIO); return NULL; @@ -480,6 +491,9 @@ create_reader (int fd) } +/* Prepare destruction of the reader thread for CTX. Returns 0 if a + call to this function is sufficient and destroy_reader_finish shall + not be called. */ static void destroy_reader (struct reader_context_s *ctx) { @@ -531,24 +545,12 @@ destroy_reader (struct reader_context_s *ctx) ctx->file_sock, (int) WSAGetLastError ()); } - TRACE1 (DEBUG_SYSIO, "gpgme:destroy_reader", ctx->file_hd, - "waiting for termination of thread %p", ctx->thread_hd); - WaitForSingleObject (ctx->stopped, INFINITE); - TRACE1 (DEBUG_SYSIO, "gpgme:destroy_reader", ctx->file_hd, - "thread %p has terminated", ctx->thread_hd); - - if (ctx->stopped) - CloseHandle (ctx->stopped); - if (ctx->have_data_ev) - CloseHandle (ctx->have_data_ev); - if (ctx->have_space_ev) - CloseHandle (ctx->have_space_ev); - CloseHandle (ctx->thread_hd); - DESTROY_LOCK (ctx->mutex); - free (ctx); + /* After setting this event CTX is void. */ + SetEvent (ctx->close_ev); } + /* Find a reader context or create a new one. Note that the reader context will last until a _gpgme_io_close. */ static struct reader_context_s * @@ -585,26 +587,6 @@ find_reader (int fd, int start_it) } -static void -kill_reader (int fd) -{ - int i; - - LOCK (reader_table_lock); - for (i = 0; i < reader_table_size; i++) - { - if (reader_table[i].used && reader_table[i].fd == fd) - { - destroy_reader (reader_table[i].context); - reader_table[i].context = NULL; - reader_table[i].used = 0; - break; - } - } - UNLOCK (reader_table_lock); -} - - int _gpgme_io_read (int fd, void *buffer, size_t count) { @@ -774,7 +756,16 @@ writer (void *arg) /* Indicate that we have an error. */ if (!SetEvent (ctx->is_empty)) TRACE_LOG1 ("SetEvent failed: ec=%d", (int) GetLastError ()); - SetEvent (ctx->stopped); + + TRACE_LOG ("waiting for close"); + WaitForSingleObject (ctx->close_ev, INFINITE); + + CloseHandle (ctx->close_ev); + CloseHandle (ctx->have_data); + CloseHandle (ctx->is_empty); + CloseHandle (ctx->thread_hd); + DESTROY_LOCK (ctx->mutex); + free (ctx); return TRACE_SUC (); } @@ -816,16 +807,16 @@ create_writer (int fd) if (ctx->have_data) ctx->is_empty = CreateEvent (&sec_attr, TRUE, TRUE, NULL); if (ctx->is_empty) - ctx->stopped = CreateEvent (&sec_attr, TRUE, FALSE, NULL); - if (!ctx->have_data || !ctx->is_empty || !ctx->stopped) + ctx->close_ev = CreateEvent (&sec_attr, TRUE, FALSE, NULL); + if (!ctx->have_data || !ctx->is_empty || !ctx->close_ev) { TRACE_LOG1 ("CreateEvent failed: ec=%d", (int) GetLastError ()); if (ctx->have_data) CloseHandle (ctx->have_data); if (ctx->is_empty) CloseHandle (ctx->is_empty); - if (ctx->stopped) - CloseHandle (ctx->stopped); + if (ctx->close_ev) + CloseHandle (ctx->close_ev); free (ctx); /* FIXME: Translate the error code. */ TRACE_SYSERR (EIO); @@ -850,8 +841,8 @@ create_writer (int fd) CloseHandle (ctx->have_data); if (ctx->is_empty) CloseHandle (ctx->is_empty); - if (ctx->stopped) - CloseHandle (ctx->stopped); + if (ctx->close_ev) + CloseHandle (ctx->close_ev); free (ctx); TRACE_SYSERR (EIO); return NULL; @@ -868,6 +859,7 @@ create_writer (int fd) return ctx; } + static void destroy_writer (struct writer_context_s *ctx) { @@ -897,21 +889,8 @@ destroy_writer (struct writer_context_s *ctx) } #endif - TRACE1 (DEBUG_SYSIO, "gpgme:destroy_writer", ctx->file_hd, - "waiting for termination of thread %p", ctx->thread_hd); - WaitForSingleObject (ctx->stopped, INFINITE); - TRACE1 (DEBUG_SYSIO, "gpgme:destroy_writer", ctx->file_hd, - "thread %p has terminated", ctx->thread_hd); - - if (ctx->stopped) - CloseHandle (ctx->stopped); - if (ctx->have_data) - CloseHandle (ctx->have_data); - if (ctx->is_empty) - CloseHandle (ctx->is_empty); - CloseHandle (ctx->thread_hd); - DESTROY_LOCK (ctx->mutex); - free (ctx); + /* After setting this event CTX is void. */ + SetEvent (ctx->close_ev); } @@ -951,26 +930,6 @@ find_writer (int fd, int start_it) } -static void -kill_writer (int fd) -{ - int i; - - LOCK (writer_table_lock); - for (i = 0; i < writer_table_size; i++) - { - if (writer_table[i].used && writer_table[i].fd == fd) - { - destroy_writer (writer_table[i].context); - writer_table[i].context = NULL; - writer_table[i].used = 0; - break; - } - } - UNLOCK (writer_table_lock); -} - - int _gpgme_io_write (int fd, const void *buffer, size_t count) { @@ -1195,8 +1154,32 @@ _gpgme_io_close (int fd) fd, fd_table[fd].handle, fd_table[fd].socket, fd_table[fd].dup_from); - kill_reader (fd); - kill_writer (fd); + LOCK (reader_table_lock); + for (i = 0; i < reader_table_size; i++) + { + if (reader_table[i].used && reader_table[i].fd == fd) + { + destroy_reader (reader_table[i].context); + reader_table[i].context = NULL; + reader_table[i].used = 0; + break; + } + } + UNLOCK (reader_table_lock); + + LOCK (writer_table_lock); + for (i = 0; i < writer_table_size; i++) + { + if (writer_table[i].used && writer_table[i].fd == fd) + { + destroy_writer (writer_table[i].context); + writer_table[i].context = NULL; + writer_table[i].used = 0; + break; + } + } + UNLOCK (writer_table_lock); + LOCK (notify_table_lock); for (i = 0; i < DIM (notify_table); i++) { ----------------------------------------------------------------------- Summary of changes: src/w32-io.c | 163 ++++++++++++++++++++++++++-------------------------------- 1 files changed, 73 insertions(+), 90 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Sat May 11 22:07:54 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Sat, 11 May 2013 22:07:54 +0200 Subject: [git] GnuPG - branch, STABLE-BRANCH-2-0, updated. gnupg-2.0.20-2-g8ddf604 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, STABLE-BRANCH-2-0 has been updated via 8ddf604659b93754ffa6dea295678a8adc293f90 (commit) from 9b8760233fa3416b0bda7db8ee8f4eaaaa8190a8 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 8ddf604659b93754ffa6dea295678a8adc293f90 Author: Werner Koch Date: Thu Apr 25 12:00:16 2013 +0100 Fix syntax error for building on APPLE. * scd/pcsc-wrapper.c [__APPLE__]: Fix syntax error. -- For W32 and probably for Cygwin we don't need the wrapper, thus the problems does not exhibit itself. diff --git a/scd/pcsc-wrapper.c b/scd/pcsc-wrapper.c index 7d9415a..f3d92ff 100644 --- a/scd/pcsc-wrapper.c +++ b/scd/pcsc-wrapper.c @@ -66,7 +66,7 @@ static int verbose; #if defined(__APPLE__) || defined(_WIN32) || defined(__CYGWIN__) -typedef unsinged int pcsc_dword_t; +typedef unsigned int pcsc_dword_t; #else typedef unsigned long pcsc_dword_t; #endif ----------------------------------------------------------------------- Summary of changes: scd/pcsc-wrapper.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 16 18:10:36 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 16 May 2013 18:10:36 +0200 Subject: [git] GPGME - branch, master, updated. gpgme-1.4.1-6-g6d0d8e7 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via 6d0d8e7ba0bb989c251545fa8af35b97d1a703ba (commit) from 9e7df9aa6d81f0abbabb03a2346d80eb5d375f81 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 6d0d8e7ba0bb989c251545fa8af35b97d1a703ba Author: Werner Koch Date: Thu Apr 25 12:00:16 2013 +0100 Make definition of off_t robust against misbehaving w32 toolchains. * configure.ac (NEED__FILE_OFFSET_BITS): Change to define gpgme_off_t and gpgme_ssize_t. (API__OFF_T, API__SSIZE_T): New ac_subst. * src/gpgme.h.in: Replace all ssize_t and off_t by ac_subst macros. * src/assuan-support.c, src/ath-pthread.c, src/ath.c, src/ath.h * src/data-compat.c, src/data-fd.c, src/data-mem.c, src/data-stream.c * src/data-user.c, src/data.c, src/data.h, src/engine-gpgsm.c * src/engine-uiserver.c, src/gpgme-tool.c, src/gpgme.c: Replace off_t by gpgme_off_t and sszie_t by gpgme_ssize_t. * src/ath-pthread.c, src/ath.h: Include gpgme.h. -- For a detailed description, see the gpgme.texi diff. diff --git a/NEWS b/NEWS index bf8c2f9..dc67bf7 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,11 @@ Noteworthy changes in version 1.4.2 (unreleased) ------------------------------------------------ + * Interface changes relative to the 1.4.1 release: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + gpgme_off_t NEW. + gpgme_size_t NEW. + Noteworthy changes in version 1.4.1 (2013-05-01) ------------------------------------------------ diff --git a/configure.ac b/configure.ac index 25dce1c..015995b 100644 --- a/configure.ac +++ b/configure.ac @@ -282,25 +282,31 @@ AC_SUBST(NEED__FILE_OFFSET_BITS) # Figure out platform dependent typedefs for gpgme.h if test "$have_w32_system" = yes; then - if test "$have_w64_system" = yes; then - INSERT__TYPEDEFS_FOR_GPGME_H="/* Typedefs for the 64 bit W32 API. */ -#include -typedef long off_t; -typedef __int64 ssize_t;" - else - INSERT__TYPEDEFS_FOR_GPGME_H="/* Typedefs for the 32 bit W32 API. */ -#ifndef _OFF_T_DEFINED /* Defined by newer mingw32 toolkits. */ -typedef long off_t; -#endif -#ifndef _SSIZE_T_DEFINED /* Defined by newer mingw32 toolkits. */ -typedef long ssize_t; -#endif" - fi + INSERT__TYPEDEFS_FOR_GPGME_H=" +#ifdef _WIN64 +# include + typedef int64_t gpgme_off_t; + typedef int64_t gpgme_ssize_t; +#else /* _WIN32 */ + typedef long gpgme_off_t; + typedef long gpgme_ssize_t; +#endif /* _WIN32 */" + API__OFF_T="gpgme_off_t" + API__SSIZE_T="gpgme_ssize_t" else - INSERT__TYPEDEFS_FOR_GPGME_H="#include " + INSERT__TYPEDEFS_FOR_GPGME_H=" +#include +typedef off_t gpgme_off_t; +typedef ssize_t gpgme_ssize_t;" + API__OFF_T="off_t" + API__SSIZE_T="ssize_t" fi AC_SUBST(INSERT__TYPEDEFS_FOR_GPGME_H) AM_SUBST_NOTMAKE(INSERT__TYPEDEFS_FOR_GPGME_H) +AC_SUBST(API__OFF_T) +AM_SUBST_NOTMAKE(API__OFF_T) +AC_SUBST(API__SSIZE_T) +AM_SUBST_NOTMAKE(API__SSIZE_T) # Checks for compiler features. if test "$GCC" = yes; then diff --git a/doc/gpgme.texi b/doc/gpgme.texi index b47d438..589747d 100644 --- a/doc/gpgme.texi +++ b/doc/gpgme.texi @@ -493,18 +493,42 @@ support by default and just use that. The compatibility modes (small file sizes or dual mode) can be considered an historic artefact, only useful to allow for a transitional period. - at acronym{GPGME} is compiled using largefile support by default. This -means that your application must do the same, at least as far as it is -relevant for using the @file{gpgme.h} header file. All types in this -header files refer to their largefile counterparts, if they are -different from any default types on the system. - -You can enable largefile support, if it is different from the default -on the system the application is compiled on, by using the Autoconf -macro @code{AC_SYS_LARGEFILE}. If you do this, then you don't need to -worry about anything else: It will just work. In this case you might -also want to use @code{AC_FUNC_FSEEKO} to take advantage of some new -interfaces, and @code{AC_TYPE_OFF_T} (just in case). +On POSIX platforms @acronym{GPGME} is compiled using largefile support +by default. This means that your application must do the same, at +least as far as it is relevant for using the @file{gpgme.h} header +file. All types in this header files refer to their largefile +counterparts, if they are different from any default types on the +system. + +On 32 and 64 bit Windows platforms @code{off_t} is declared as 32 bit +signed integer. There is no specific support for LFS in the C +library. The recommendation from Microsoft is to use the native +interface (@code{CreateFile} et al.) for large files. Released binary +versions of @acronym{GPGME} (libgpgme-11.dll) have always been build +with a 32 bit @code{off_t}. To avoid an ABI break we stick to this +convention for 32 bit Windows by using @code{long} there. + at acronym{GPGME} versions for 64 bit Windows have never been released +and thus we are able to use @code{int64_t} instead of @code{off_t} +there. For easier migration the typedef @code{gpgme_off_t} has been +defined. The reason we cannot use @code{off_t} directly is that some +toolchains (e.g. mingw64) introduce a POSIX compatible hack for + at code{off_t}. Some widely used toolkits make use of this hack and in +turn @acronym{GPGME} would need to use it also. However, this would +introduce an ABI break and existing software making use of libgpgme +might suffer from a severe break. Thus with version 1.4.2 we +redefined all functions using @code{off_t} to use @code{gpgme_off_t} +which is defined as explained above. This way we keep the ABI well +defined and independent of any toolchain hacks. The bottom line is +that LFS support in @acronym{GPGME} is only available on 64 bit +versions of Windows. + +On POSIX platforms you can enable largefile support, if it is +different from the default on the system the application is compiled +on, by using the Autoconf macro @code{AC_SYS_LARGEFILE}. If you do +this, then you don't need to worry about anything else: It will just +work. In this case you might also want to use @code{AC_FUNC_FSEEKO} +to take advantage of some new interfaces, and @code{AC_TYPE_OFF_T} +(just in case). If you do not use Autoconf, you can define the preprocessor symbol @code{_FILE_OFFSET_BITS} to 64 @emph{before} including any header @@ -1538,6 +1562,20 @@ by using memory buffers or files rather than pipes or sockets. This might be relevant, for example, if the external event loop mechanism is used. + at deftp {Data type} {gpgme_off_t} +On POSIX platforms the @code{gpgme_off_t} type is an alias for + at code{off_t}; it may be used interchangeable. On Windows platforms + at code{gpgme_off_t} is defined as a long (i.e. 32 bit) for 32 bit +Windows and as a 64 bit signed integer for 64 bit Windows. + at end deftp + + at deftp {Data type} {gpgme_ssize_t} +The @code{gpgme_ssize_t} type is an alias for @code{ssize_t}. It has +only been introduced to overcome portability problems pertaining to +the declaration of @code{ssize_t} by different toolchains. + at end deftp + + @menu * Creating Data Buffers:: Creating new data buffers. * Destroying Data Buffers:: Releasing data buffers. diff --git a/src/assuan-support.c b/src/assuan-support.c index 6ff0679..d06518a 100644 --- a/src/assuan-support.c +++ b/src/assuan-support.c @@ -68,14 +68,14 @@ my_close (assuan_context_t ctx, assuan_fd_t fd) } -static ssize_t +static gpgme_ssize_t my_read (assuan_context_t ctx, assuan_fd_t fd, void *buffer, size_t size) { return _gpgme_io_read ((int) fd, buffer, size); } -static ssize_t +static gpgme_ssize_t my_write (assuan_context_t ctx, assuan_fd_t fd, const void *buffer, size_t size) { return _gpgme_io_write ((int) fd, buffer, size); diff --git a/src/ath-pthread.c b/src/ath-pthread.c index dfbdac2..47b38ee 100644 --- a/src/ath-pthread.c +++ b/src/ath-pthread.c @@ -39,6 +39,8 @@ #include +#include "gpgme.h" + #include "ath.h" @@ -130,21 +132,21 @@ ath_mutex_unlock (ath_mutex_t *lock) } -ssize_t +gpgme_ssize_t ath_read (int fd, void *buf, size_t nbytes) { return read (fd, buf, nbytes); } -ssize_t +gpgme_ssize_t ath_write (int fd, const void *buf, size_t nbytes) { return write (fd, buf, nbytes); } -ssize_t +gpgme_ssize_t ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset, struct timeval *timeout) { @@ -152,7 +154,7 @@ ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset, } -ssize_t +gpgme_ssize_t ath_waitpid (pid_t pid, int *status, int options) { return waitpid (pid, status, options); diff --git a/src/ath.c b/src/ath.c index 52cee45..ddd8a87 100644 --- a/src/ath.c +++ b/src/ath.c @@ -40,8 +40,9 @@ #include #endif +#include "gpgme.h" + #ifdef _MSC_VER - typedef long ssize_t; typedef int pid_t; #endif @@ -125,7 +126,7 @@ ath_mutex_unlock (ath_mutex_t *lock) } -ssize_t +gpgme_ssize_t ath_read (int fd, void *buf, size_t nbytes) { #if defined(HAVE_W32CE_SYSTEM) && defined(_MSC_VER) @@ -136,7 +137,7 @@ ath_read (int fd, void *buf, size_t nbytes) } -ssize_t +gpgme_ssize_t ath_write (int fd, const void *buf, size_t nbytes) { #if defined(HAVE_W32CE_SYSTEM) && defined(_MSC_VER) @@ -147,7 +148,7 @@ ath_write (int fd, const void *buf, size_t nbytes) } -ssize_t +gpgme_ssize_t ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset, struct timeval *timeout) { @@ -159,7 +160,7 @@ ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset, } -ssize_t +gpgme_ssize_t ath_waitpid (pid_t pid, int *status, int options) { #ifdef HAVE_W32_SYSTEM diff --git a/src/ath.h b/src/ath.h index eecf8d1..8eb9eb9 100644 --- a/src/ath.h +++ b/src/ath.h @@ -88,11 +88,11 @@ int ath_mutex_unlock (ath_mutex_t *mutex); /* Replacement for the POSIX functions, which can be used to allow other (user-level) threads to run. */ -ssize_t ath_read (int fd, void *buf, size_t nbytes); -ssize_t ath_write (int fd, const void *buf, size_t nbytes); -ssize_t ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset, - struct timeval *timeout); -ssize_t ath_waitpid (pid_t pid, int *status, int options); +gpgme_ssize_t ath_read (int fd, void *buf, size_t nbytes); +gpgme_ssize_t ath_write (int fd, const void *buf, size_t nbytes); +gpgme_ssize_t ath_select (int nfd, fd_set *rset, fd_set *wset, fd_set *eset, + struct timeval *timeout); +gpgme_ssize_t ath_waitpid (pid_t pid, int *status, int options); int ath_accept (int s, struct sockaddr *addr, socklen_t *length_ptr); int ath_connect (int s, const struct sockaddr *addr, socklen_t length); int ath_sendmsg (int s, const struct msghdr *msg, int flags); diff --git a/src/data-compat.c b/src/data-compat.c index e9ca90a..99827f1 100644 --- a/src/data-compat.c +++ b/src/data-compat.c @@ -41,7 +41,7 @@ non-zero). */ gpgme_error_t gpgme_data_new_from_filepart (gpgme_data_t *r_dh, const char *fname, - FILE *stream, off_t offset, size_t length) + FILE *stream, gpgme_off_t offset, size_t length) { #if defined (HAVE_W32CE_SYSTEM) && defined (_MSC_VER) return gpgme_error (GPG_ERR_NOT_IMPLEMENTED); @@ -175,7 +175,7 @@ gpgme_error_to_errno (gpgme_error_t err) } -static ssize_t +static gpgme_ssize_t old_user_read (gpgme_data_t dh, void *buffer, size_t size) { gpgme_error_t err; @@ -191,8 +191,8 @@ old_user_read (gpgme_data_t dh, void *buffer, size_t size) } -static off_t -old_user_seek (gpgme_data_t dh, off_t offset, int whence) +static gpgme_off_t +old_user_seek (gpgme_data_t dh, gpgme_off_t offset, int whence) { gpgme_error_t err; TRACE_BEG2 (DEBUG_DATA, "gpgme:old_user_seek", dh, diff --git a/src/data-fd.c b/src/data-fd.c index 4b75e94..42d6a0d 100644 --- a/src/data-fd.c +++ b/src/data-fd.c @@ -89,22 +89,22 @@ lseek (int fildes, long offset, int whence) -static ssize_t +static gpgme_ssize_t fd_read (gpgme_data_t dh, void *buffer, size_t size) { return read (dh->data.fd, buffer, size); } -static ssize_t +static gpgme_ssize_t fd_write (gpgme_data_t dh, const void *buffer, size_t size) { return write (dh->data.fd, buffer, size); } -static off_t -fd_seek (gpgme_data_t dh, off_t offset, int whence) +static gpgme_off_t +fd_seek (gpgme_data_t dh, gpgme_off_t offset, int whence) { return lseek (dh->data.fd, offset, whence); } diff --git a/src/data-mem.c b/src/data-mem.c index fc7694d..e06a920 100644 --- a/src/data-mem.c +++ b/src/data-mem.c @@ -35,7 +35,7 @@ #include "debug.h" -static ssize_t +static gpgme_ssize_t mem_read (gpgme_data_t dh, void *buffer, size_t size) { size_t amt = dh->data.mem.length - dh->data.mem.offset; @@ -54,7 +54,7 @@ mem_read (gpgme_data_t dh, void *buffer, size_t size) } -static ssize_t +static gpgme_ssize_t mem_write (gpgme_data_t dh, const void *buffer, size_t size) { size_t unused; @@ -109,8 +109,8 @@ mem_write (gpgme_data_t dh, const void *buffer, size_t size) } -static off_t -mem_seek (gpgme_data_t dh, off_t offset, int whence) +static gpgme_off_t +mem_seek (gpgme_data_t dh, gpgme_off_t offset, int whence) { switch (whence) { diff --git a/src/data-stream.c b/src/data-stream.c index a9bb815..f358a0e 100644 --- a/src/data-stream.c +++ b/src/data-stream.c @@ -31,7 +31,7 @@ #include "data.h" -static ssize_t +static gpgme_ssize_t stream_read (gpgme_data_t dh, void *buffer, size_t size) { size_t amt = fread (buffer, 1, size, dh->data.stream); @@ -41,7 +41,7 @@ stream_read (gpgme_data_t dh, void *buffer, size_t size) } -static ssize_t +static gpgme_ssize_t stream_write (gpgme_data_t dh, const void *buffer, size_t size) { size_t amt = fwrite (buffer, 1, size, dh->data.stream); @@ -51,8 +51,8 @@ stream_write (gpgme_data_t dh, const void *buffer, size_t size) } -static off_t -stream_seek (gpgme_data_t dh, off_t offset, int whence) +static gpgme_off_t +stream_seek (gpgme_data_t dh, gpgme_off_t offset, int whence) { int err; diff --git a/src/data-user.c b/src/data-user.c index 5204614..816ad7d 100644 --- a/src/data-user.c +++ b/src/data-user.c @@ -31,7 +31,7 @@ #include "data.h" -static ssize_t +static gpgme_ssize_t user_read (gpgme_data_t dh, void *buffer, size_t size) { if (!dh->data.user.cbs->read) @@ -44,7 +44,7 @@ user_read (gpgme_data_t dh, void *buffer, size_t size) } -static ssize_t +static gpgme_ssize_t user_write (gpgme_data_t dh, const void *buffer, size_t size) { if (!dh->data.user.cbs->write) @@ -57,8 +57,8 @@ user_write (gpgme_data_t dh, const void *buffer, size_t size) } -static off_t -user_seek (gpgme_data_t dh, off_t offset, int whence) +static gpgme_off_t +user_seek (gpgme_data_t dh, gpgme_off_t offset, int whence) { if (!dh->data.user.cbs->seek) { diff --git a/src/data.c b/src/data.c index 0657081..7123a82 100644 --- a/src/data.c +++ b/src/data.c @@ -72,10 +72,10 @@ _gpgme_data_release (gpgme_data_t dh) /* Read up to SIZE bytes into buffer BUFFER from the data object with the handle DH. Return the number of characters read, 0 on EOF and -1 on error. If an error occurs, errno is set. */ -ssize_t +gpgme_ssize_t gpgme_data_read (gpgme_data_t dh, void *buffer, size_t size) { - ssize_t res; + gpgme_ssize_t res; TRACE_BEG2 (DEBUG_DATA, "gpgme_data_read", dh, "buffer=%p, size=%u", buffer, size); @@ -100,10 +100,10 @@ gpgme_data_read (gpgme_data_t dh, void *buffer, size_t size) /* Write up to SIZE bytes from buffer BUFFER to the data object with the handle DH. Return the number of characters written, or -1 on error. If an error occurs, errno is set. */ -ssize_t +gpgme_ssize_t gpgme_data_write (gpgme_data_t dh, const void *buffer, size_t size) { - ssize_t res; + gpgme_ssize_t res; TRACE_BEG2 (DEBUG_DATA, "gpgme_data_write", dh, "buffer=%p, size=%u", buffer, size); @@ -128,8 +128,8 @@ gpgme_data_write (gpgme_data_t dh, const void *buffer, size_t size) /* Set the current position from where the next read or write starts in the data object with the handle DH to OFFSET, relativ to WHENCE. */ -off_t -gpgme_data_seek (gpgme_data_t dh, off_t offset, int whence) +gpgme_off_t +gpgme_data_seek (gpgme_data_t dh, gpgme_off_t offset, int whence) { TRACE_BEG2 (DEBUG_DATA, "gpgme_data_seek", dh, "offset=%lli, whence=%i", offset, whence); @@ -253,7 +253,7 @@ _gpgme_data_inbound_handler (void *opaque, int fd) gpgme_data_t dh = (gpgme_data_t) data->handler_value; char buffer[BUFFER_SIZE]; char *bufp = buffer; - ssize_t buflen; + gpgme_ssize_t buflen; TRACE_BEG1 (DEBUG_CTX, "_gpgme_data_inbound_handler", dh, "fd=0x%x", fd); @@ -268,7 +268,7 @@ _gpgme_data_inbound_handler (void *opaque, int fd) do { - ssize_t amt = gpgme_data_write (dh, bufp, buflen); + gpgme_ssize_t amt = gpgme_data_write (dh, bufp, buflen); if (amt == 0 || (amt < 0 && errno != EINTR)) return TRACE_ERR (gpg_error_from_syserror ()); bufp += amt; @@ -284,13 +284,13 @@ _gpgme_data_outbound_handler (void *opaque, int fd) { struct io_cb_data *data = (struct io_cb_data *) opaque; gpgme_data_t dh = (gpgme_data_t) data->handler_value; - ssize_t nwritten; + gpgme_ssize_t nwritten; TRACE_BEG1 (DEBUG_CTX, "_gpgme_data_outbound_handler", dh, "fd=0x%x", fd); if (!dh->pending_len) { - ssize_t amt = gpgme_data_read (dh, dh->pending, BUFFER_SIZE); + gpgme_ssize_t amt = gpgme_data_read (dh, dh->pending, BUFFER_SIZE); if (amt < 0) return TRACE_ERR (gpg_error_from_syserror ()); if (amt == 0) diff --git a/src/data.h b/src/data.h index 5076619..3d404af 100644 --- a/src/data.h +++ b/src/data.h @@ -36,20 +36,23 @@ /* Read up to SIZE bytes into buffer BUFFER from the data object with the handle DH. Return the number of characters read, 0 on EOF and -1 on error. If an error occurs, errno is set. */ -typedef ssize_t (*gpgme_data_read_cb) (gpgme_data_t dh, void *buffer, - size_t size); +typedef gpgme_ssize_t (*gpgme_data_read_cb) (gpgme_data_t dh, + void *buffer, + size_t size); /* Write up to SIZE bytes from buffer BUFFER to the data object with the handle DH. Return the number of characters written, or -1 on error. If an error occurs, errno is set. */ -typedef ssize_t (*gpgme_data_write_cb) (gpgme_data_t dh, const void *buffer, - size_t size); +typedef gpgme_ssize_t (*gpgme_data_write_cb) (gpgme_data_t dh, + const void *buffer, + size_t size); /* Set the current position from where the next read or write starts in the data object with the handle DH to OFFSET, relativ to WHENCE. */ -typedef off_t (*gpgme_data_seek_cb) (gpgme_data_t dh, off_t offset, - int whence); +typedef gpgme_off_t (*gpgme_data_seek_cb) (gpgme_data_t dh, + gpgme_off_t offset, + int whence); /* Release the data object with the handle DH. */ typedef void (*gpgme_data_release_cb) (gpgme_data_t dh); @@ -109,7 +112,7 @@ struct gpgme_data /* Allocated size of BUFFER. */ size_t size; size_t length; - off_t offset; + gpgme_off_t offset; } mem; /* For gpgme_data_new_from_read_cb. */ diff --git a/src/engine-gpgsm.c b/src/engine-gpgsm.c index 79adde2..391b632 100644 --- a/src/engine-gpgsm.c +++ b/src/engine-gpgsm.c @@ -891,7 +891,7 @@ status_handler (void *opaque, int fd) char *src = line + 2; char *end = line + linelen; char *dst = src; - ssize_t nwritten; + gpgme_ssize_t nwritten; linelen = 0; while (src < end) diff --git a/src/engine-uiserver.c b/src/engine-uiserver.c index a68915a..a0008e4 100644 --- a/src/engine-uiserver.c +++ b/src/engine-uiserver.c @@ -754,7 +754,7 @@ status_handler (void *opaque, int fd) char *src = line + 2; char *end = line + linelen; char *dst = src; - ssize_t nwritten; + gpgme_ssize_t nwritten; linelen = 0; while (src < end) diff --git a/src/gpgme-tool.c b/src/gpgme-tool.c index 978c387..bce52b8 100644 --- a/src/gpgme-tool.c +++ b/src/gpgme-tool.c @@ -3056,7 +3056,7 @@ _cmd_genkey_write (gpgme_data_t data, const void *buf, size_t size) { while (size > 0) { - ssize_t writen = gpgme_data_write (data, buf, size); + gpgme_ssize_t writen = gpgme_data_write (data, buf, size); if (writen < 0 && errno != EAGAIN) return gpg_error_from_syserror (); else if (writen > 0) @@ -3112,7 +3112,7 @@ cmd_genkey (assuan_context_t ctx, char *line) do { char buf[512]; - ssize_t readn = gpgme_data_read (inp_data, buf, sizeof (buf)); + gpgme_ssize_t readn = gpgme_data_read (inp_data, buf, sizeof (buf)); if (readn < 0) { err = gpg_error_from_syserror (); diff --git a/src/gpgme.c b/src/gpgme.c index 281ba9c..a8de64b 100644 --- a/src/gpgme.c +++ b/src/gpgme.c @@ -643,7 +643,7 @@ gpgme_set_io_cbs (gpgme_ctx_t ctx, gpgme_io_cbs_t io_cbs) /* This function provides access to the internal read function; it is normally not used. */ -ssize_t +gpgme_ssize_t gpgme_io_read (int fd, void *buffer, size_t count) { int ret; @@ -659,7 +659,7 @@ gpgme_io_read (int fd, void *buffer, size_t count) /* This function provides access to the internal write function. It is to be used by user callbacks to return data to gpgme. See gpgme_passphrase_cb_t and gpgme_edit_cb_t. */ -ssize_t +gpgme_ssize_t gpgme_io_write (int fd, const void *buffer, size_t count) { int ret; diff --git a/src/gpgme.h.in b/src/gpgme.h.in index 12bd4ac..caf64d4 100644 --- a/src/gpgme.h.in +++ b/src/gpgme.h.in @@ -18,7 +18,7 @@ You should have received a copy of the GNU Lesser General Public License along with this program; if not, see . - File: @configure_input@ */ + Generated from gpgme.h.in for @GPGME_CONFIG_HOST at . */ #ifndef GPGME_H #define GPGME_H @@ -33,10 +33,8 @@ /* Include stdio.h for the FILE type definition. */ #include - - at INSERT__TYPEDEFS_FOR_GPGME_H@ - #include + at INSERT__TYPEDEFS_FOR_GPGME_H@ #include @@ -1043,8 +1041,8 @@ void gpgme_get_io_cbs (gpgme_ctx_t ctx, gpgme_io_cbs_t io_cbs); /* Wrappers around the internal I/O functions for use with gpgme_passphrase_cb_t and gpgme_edit_cb_t. */ -ssize_t gpgme_io_read (int fd, void *buffer, size_t count); -ssize_t gpgme_io_write (int fd, const void *buffer, size_t count); + at API__SSIZE_T@ gpgme_io_read (int fd, void *buffer, size_t count); + at API__SSIZE_T@ gpgme_io_write (int fd, const void *buffer, size_t count); int gpgme_io_writen (int fd, const void *buffer, size_t count); /* Process the pending operation and, if HANG is non-zero, wait for @@ -1060,19 +1058,20 @@ gpgme_ctx_t gpgme_wait_ext (gpgme_ctx_t ctx, gpgme_error_t *status, /* Read up to SIZE bytes into buffer BUFFER from the data object with the handle HANDLE. Return the number of characters read, 0 on EOF and -1 on error. If an error occurs, errno is set. */ -typedef ssize_t (*gpgme_data_read_cb_t) (void *handle, void *buffer, +typedef @API__SSIZE_T@ (*gpgme_data_read_cb_t) (void *handle, void *buffer, size_t size); /* Write up to SIZE bytes from buffer BUFFER to the data object with the handle HANDLE. Return the number of characters written, or -1 on error. If an error occurs, errno is set. */ -typedef ssize_t (*gpgme_data_write_cb_t) (void *handle, const void *buffer, +typedef @API__SSIZE_T@ (*gpgme_data_write_cb_t) (void *handle, const void *buffer, size_t size); /* Set the current position from where the next read or write starts in the data object with the handle HANDLE to OFFSET, relativ to WHENCE. */ -typedef off_t (*gpgme_data_seek_cb_t) (void *handle, off_t offset, int whence); +typedef @API__OFF_T@ (*gpgme_data_seek_cb_t) (void *handle, + @API__OFF_T@ offset, int whence); /* Close the data object with the handle DL. */ typedef void (*gpgme_data_release_cb_t) (void *handle); @@ -1089,17 +1088,17 @@ typedef struct gpgme_data_cbs *gpgme_data_cbs_t; /* Read up to SIZE bytes into buffer BUFFER from the data object with the handle DH. Return the number of characters read, 0 on EOF and -1 on error. If an error occurs, errno is set. */ -ssize_t gpgme_data_read (gpgme_data_t dh, void *buffer, size_t size); + at API__SSIZE_T@ gpgme_data_read (gpgme_data_t dh, void *buffer, size_t size); /* Write up to SIZE bytes from buffer BUFFER to the data object with the handle DH. Return the number of characters written, or -1 on error. If an error occurs, errno is set. */ -ssize_t gpgme_data_write (gpgme_data_t dh, const void *buffer, size_t size); + at API__SSIZE_T@ gpgme_data_write (gpgme_data_t dh, const void *buffer, size_t size); /* Set the current position from where the next read or write starts in the data object with the handle DH to OFFSET, relativ to WHENCE. */ -off_t gpgme_data_seek (gpgme_data_t dh, off_t offset, int whence); + at API__OFF_T@ gpgme_data_seek (gpgme_data_t dh, @API__OFF_T@ offset, int whence); /* Create a new data buffer and return it in R_DH. */ gpgme_error_t gpgme_data_new (gpgme_data_t *r_dh); @@ -1168,7 +1167,7 @@ gpgme_error_t gpgme_data_new_from_file (gpgme_data_t *r_dh, non-zero). */ gpgme_error_t gpgme_data_new_from_filepart (gpgme_data_t *r_dh, const char *fname, FILE *fp, - off_t offset, size_t length); + @API__OFF_T@ offset, size_t length); /* Reset the read pointer in DH. Deprecated, please use gpgme_data_seek instead. */ ----------------------------------------------------------------------- Summary of changes: NEWS | 5 ++++ configure.ac | 36 ++++++++++++++++------------ doc/gpgme.texi | 62 +++++++++++++++++++++++++++++++++++++++--------- src/assuan-support.c | 4 +- src/ath-pthread.c | 10 ++++--- src/ath.c | 11 ++++---- src/ath.h | 10 ++++---- src/data-compat.c | 8 +++--- src/data-fd.c | 8 +++--- src/data-mem.c | 8 +++--- src/data-stream.c | 8 +++--- src/data-user.c | 8 +++--- src/data.c | 20 ++++++++-------- src/data.h | 17 ++++++++----- src/engine-gpgsm.c | 2 +- src/engine-uiserver.c | 2 +- src/gpgme-tool.c | 4 +- src/gpgme.c | 4 +- src/gpgme.h.in | 25 +++++++++---------- 19 files changed, 153 insertions(+), 99 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Sat May 18 14:13:35 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Sat, 18 May 2013 14:13:35 +0200 Subject: [git] GPGME - branch, master, updated. gpgme-1.4.1-7-ge993563 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via e99356306d7bda61802530ebeb07d9ba73c4dec0 (commit) from 6d0d8e7ba0bb989c251545fa8af35b97d1a703ba (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit e99356306d7bda61802530ebeb07d9ba73c4dec0 Author: Werner Koch Date: Thu Apr 25 12:00:16 2013 +0100 Improve C++ compatibility of previous patch. * src/gpgme.h.in: Move gpgme_sssize_t and gpgme_off_t typedefs into the extern "C" scope. -- Frankly, this does not help very much because g++ still does not interpret gpgme_data_seek_cb_t as compatible with the C++ ssize_t. I am sorry for that API change but C and C++ are too different to always get both of them under one umbrella. However, the ABI should now be identical to older gpgme versions. diff --git a/src/gpgme.h.in b/src/gpgme.h.in index caf64d4..4186a99 100644 --- a/src/gpgme.h.in +++ b/src/gpgme.h.in @@ -34,8 +34,6 @@ /* Include stdio.h for the FILE type definition. */ #include #include - at INSERT__TYPEDEFS_FOR_GPGME_H@ - #include #ifdef __cplusplus @@ -45,6 +43,7 @@ extern "C" { #endif #endif /* __cplusplus */ + at INSERT__TYPEDEFS_FOR_GPGME_H@ /* Check for compiler features. */ ----------------------------------------------------------------------- Summary of changes: src/gpgme.h.in | 3 +-- 1 files changed, 1 insertions(+), 2 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Mon May 20 03:21:36 2013 From: cvs at cvs.gnupg.org (by Andrey) Date: Mon, 20 May 2013 03:21:36 +0200 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.5.0-124-g296f38a Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via 296f38a2bd2e25788643a42e4881faed00884a40 (commit) from 6c942ec4d63032539f1fc56c3b970cfec2369e2b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- ----------------------------------------------------------------------- Summary of changes: cipher/ecc.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 49 insertions(+), 4 deletions(-) hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Mon May 20 06:54:22 2013 From: cvs at cvs.gnupg.org (by Andrey) Date: Mon, 20 May 2013 06:54:22 +0200 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.5.0-125-geb49379 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via eb4937914db3fb7317502e97e4f0e40c1857f59d (commit) from 296f38a2bd2e25788643a42e4881faed00884a40 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit eb4937914db3fb7317502e97e4f0e40c1857f59d Author: Andrey Date: Sun May 19 21:34:48 2013 -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. diff --git a/cipher/ecc.c b/cipher/ecc.c index d56c1a8..06b8c5d 100644 --- a/cipher/ecc.c +++ b/cipher/ecc.c @@ -576,8 +576,9 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name, * possibilities without any loss of security. */ { - gcry_mpi_t x, p_y, y, z = mpi_copy(mpi_const (MPI_C_ONE)); + gcry_mpi_t x, p_y, y; const unsigned int nbits = mpi_get_nbits (E.p); + x = mpi_new (nbits); p_y = mpi_new (nbits); y = mpi_new (nbits); @@ -588,11 +589,13 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name, mpi_sub( p_y, E.p, y ); /* p_y = p-y */ if( mpi_cmp( p_y /*p-y*/, y ) < 0 ) { /* is p-y < p ? */ - log_mpidump ("ecgen p-y", p_y); + gcry_mpi_t z = mpi_copy( mpi_const (MPI_C_ONE) ); + /*log_mpidump ("ecgen p-y", p_y); log_mpidump ("ecgen y ", y); - log_debug ("ecgen will replace y with p-y\n"); + log_debug ("ecgen will replace y with p-y\n"); */ /* log_mpidump ("ecgen d before", d); */ /* we need to end up with -Q; this assures that new Q's y is the smallest one */ + sk->d = mpi_new (nbits); mpi_sub( sk->d, E.n, d ); /* d = order-d */ /* log_mpidump ("ecgen d after ", sk->d); */ gcry_mpi_point_set (&sk->Q, x, p_y/*p-y*/, z); /* Q = -Q */ @@ -600,8 +603,10 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name, { log_debug ("ecgen converted Q to a compliant point\n"); } - } - else { + mpi_free (z); + } + else + { /* no change is needed exactly 50% of the time: just copy */ sk->d = mpi_copy (d); point_set (&sk->Q, &Q); @@ -613,7 +618,6 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name, mpi_free (x); mpi_free (p_y); mpi_free (y); - mpi_free (z); } /* We also return copies of G and Q in affine coordinates if ----------------------------------------------------------------------- Summary of changes: cipher/ecc.c | 16 ++++++++++------ 1 files changed, 10 insertions(+), 6 deletions(-) hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 21 10:46:32 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 21 May 2013 10:46:32 +0200 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.5.0-126-g2ac3a7c Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via 2ac3a7c2b7154379738d17cfde8cd9017dc142f0 (commit) from eb4937914db3fb7317502e97e4f0e40c1857f59d (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 2ac3a7c2b7154379738d17cfde8cd9017dc142f0 Author: Werner Koch Date: Thu Apr 25 12:00:16 2013 +0100 Fix indentation and save on string space. * cipher/ecc.c (generate_key): Use the same string for both fatal messages. diff --git a/cipher/ecc.c b/cipher/ecc.c index 06b8c5d..ea1de3f 100644 --- a/cipher/ecc.c +++ b/cipher/ecc.c @@ -570,54 +570,56 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name, sk->E.n = mpi_copy (E.n); point_init (&sk->Q); - /* We want the Q=(x,y) be a "compliant key" in terms of the http://tools.ietf.org/html/draft-jivsov-ecc-compact, - * which simply means that we choose either Q=(x,y) or -Q=(x,p-y) such that we end up with the min(y,p-y) as the y coordinate. - * Such a public key allows the most efficient compression: y can simply be dropped because we know that it's a minimum of the two - * possibilities without any loss of security. - */ + /* We want the Q=(x,y) be a "compliant key" in terms of the + * http://tools.ietf.org/html/draft-jivsov-ecc-compact, which simply + * means that we choose either Q=(x,y) or -Q=(x,p-y) such that we + * end up with the min(y,p-y) as the y coordinate. Such a public + * key allows the most efficient compression: y can simply be + * dropped because we know that it's a minimum of the two + * possibilities without any loss of security. */ { - gcry_mpi_t x, p_y, y; - const unsigned int nbits = mpi_get_nbits (E.p); + gcry_mpi_t x, p_y, y; + const unsigned int nbits = mpi_get_nbits (E.p); - x = mpi_new (nbits); - p_y = mpi_new (nbits); - y = mpi_new (nbits); + x = mpi_new (nbits); + p_y = mpi_new (nbits); + y = mpi_new (nbits); - if (_gcry_mpi_ec_get_affine (x, y, &Q, ctx)) - log_fatal ("ecgen: Failed to get affine coordinates for Q\n"); + if (_gcry_mpi_ec_get_affine (x, y, &Q, ctx)) + log_fatal ("ecgen: Failed to get affine coordinates for Q\n"); - mpi_sub( p_y, E.p, y ); /* p_y = p-y */ + mpi_sub( p_y, E.p, y ); /* p_y = p-y */ - if( mpi_cmp( p_y /*p-y*/, y ) < 0 ) { /* is p-y < p ? */ - gcry_mpi_t z = mpi_copy( mpi_const (MPI_C_ONE) ); - /*log_mpidump ("ecgen p-y", p_y); - log_mpidump ("ecgen y ", y); - log_debug ("ecgen will replace y with p-y\n"); */ + if (mpi_cmp( p_y /*p-y*/, y ) < 0) /* is p-y < p ? */ + { + gcry_mpi_t z = mpi_copy (mpi_const (MPI_C_ONE)); + + /* log_mpidump ("ecgen p-y", p_y); */ + /* log_mpidump ("ecgen y ", y); */ + /* log_debug ("ecgen will replace y with p-y\n"); */ /* log_mpidump ("ecgen d before", d); */ - /* we need to end up with -Q; this assures that new Q's y is the smallest one */ + + /* We need to end up with -Q; this assures that new Q's y is + the smallest one */ sk->d = mpi_new (nbits); - mpi_sub( sk->d, E.n, d ); /* d = order-d */ + mpi_sub (sk->d, E.n, d); /* d = order-d */ /* log_mpidump ("ecgen d after ", sk->d); */ gcry_mpi_point_set (&sk->Q, x, p_y/*p-y*/, z); /* Q = -Q */ if (DBG_CIPHER) - { - log_debug ("ecgen converted Q to a compliant point\n"); - } + log_debug ("ecgen converted Q to a compliant point\n"); mpi_free (z); } - else + else { - /* no change is needed exactly 50% of the time: just copy */ + /* No change is needed exactly 50% of the time: just copy. */ sk->d = mpi_copy (d); point_set (&sk->Q, &Q); if (DBG_CIPHER) - { - log_debug ("ecgen didn't need to convert Q to a compliant point\n"); - } + log_debug ("ecgen didn't need to convert Q to a compliant point\n"); } - mpi_free (x); - mpi_free (p_y); - mpi_free (y); + mpi_free (x); + mpi_free (p_y); + mpi_free (y); } /* We also return copies of G and Q in affine coordinates if @@ -625,12 +627,12 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name, if (g_x && g_y) { if (_gcry_mpi_ec_get_affine (g_x, g_y, &sk->E.G, ctx)) - log_fatal ("ecgen: Failed to get affine coordinates for G\n"); + log_fatal ("ecgen: Failed to get affine coordinates for %s\n", "G"); } if (q_x && q_y) { if (_gcry_mpi_ec_get_affine (q_x, q_y, &sk->Q, ctx)) - log_fatal ("ecgen: Failed to get affine coordinates for Q\n"); + log_fatal ("ecgen: Failed to get affine coordinates for %s\n", "Q"); } _gcry_mpi_ec_free (ctx); diff --git a/scripts/git-log-fix b/scripts/git-log-fix index af702fe..3e3fd95 100644 --- a/scripts/git-log-fix +++ b/scripts/git-log-fix @@ -1,3 +1,14 @@ # This file is expected to be used via gitlog-to-changelog's --amend=FILE # option. It specifies what changes to make to each given SHA1's commit # log and metadata, using Perl-eval'able expressions. + +eb4937914db3fb7317502e97e4f0e40c1857f59d +# Fix bad formatted entry dated 2013-05-20 +s/(?s)mpi_sub.*$/cipher: Fix segv in last ECC change. +* cipher\/ecc.c (generate_key): Make sure R is initialized./ + +296f38a2bd2e25788643a42e4881faed00884a40 +# Fix bad formatted entry dated 2013-05-09 +s/(?s)Generate ECC.*$/cipher: Generate compliant ECC keys. +* cipher\/ecc.c (generate_key): Make sure a key is compliant for +using the compact representation./ ----------------------------------------------------------------------- Summary of changes: cipher/ecc.c | 68 ++++++++++++++++++++++++++------------------------ scripts/git-log-fix | 11 ++++++++ 2 files changed, 46 insertions(+), 33 deletions(-) hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 22 10:41:26 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 22 May 2013 10:41:26 +0200 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-212-g88e2434 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 88e24341e57c96e31a25e92e09d67989e64cc1c1 (commit) via 2c3fc4719b92d9e3ac32efd134a930e1cc126032 (commit) from 151b78cc26d728e9eb42620e0caf8c6f4bd7f839 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 88e24341e57c96e31a25e92e09d67989e64cc1c1 Author: Werner Koch Date: Thu Apr 25 12:00:16 2013 +0100 w32: Add icons and version information. * common/gnupg.ico: New. Take from artwork/gnupg-favicon-1.ico. * agent/gpg-agent-w32info.rc: New. * g10/gpg-w32info.rc: New. * scd/scdaemon-w32info.rc: New. * sm/gpgsm-w32info.rc: New. * tools/gpg-connect-agent-w32info.rc: New. * common/w32info-rc.h.in: New. * configure.ac (BUILD_REVISION, BUILD_FILEVERSION, BUILD_TIMESTAMP) (BUILD_HOSTNAME): New. (AC_CONFIG_FILES): Add w32info-rc.h. * am/cmacros.am (.rc.o): New rule. * agent/Makefile.am, common/Makefile.am, g10/Makefile.am * scd/Makefile.am, sm/Makefile.am, tools/Makefile.am: Add stuff to build resource files. -- Signed-off-by: Werner Koch (cherry picked from commit 049b3d9ca0285d15c00c215ac9b533c994196ca4) Solved conflicts in: agent/Makefile.am common/Makefile.am g10/Makefile.am scd/Makefile.am sm/Makefile.am tools/Makefile.am diff --git a/agent/Makefile.am b/agent/Makefile.am index c9fa9c7..92f8fc0 100644 --- a/agent/Makefile.am +++ b/agent/Makefile.am @@ -25,13 +25,17 @@ libexec_PROGRAMS += gpg-preset-passphrase endif noinst_PROGRAMS = $(TESTS) -EXTRA_DIST = ChangeLog-2011 +EXTRA_DIST = ChangeLog-2011 gpg-agent-w32info.rc AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/common -I$(top_srcdir)/intl include $(top_srcdir)/am/cmacros.am +if HAVE_W32_SYSTEM +resource_objs += gpg-agent-w32info.o +endif + AM_CFLAGS = $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS) gpg_agent_SOURCES = \ @@ -59,25 +63,17 @@ else pwquery_libs = ../common/libsimple-pwquery.a endif -#if HAVE_W32_SYSTEM -#.rc.o: -# $(WINDRES) `echo $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) | \ -# sed -e 's/-I/--include-dir /g;s/-D/--define /g'` -i $< -o $@ -# -#gpg_agent_res_ldflags = -Wl,gpg-agent-resource.o -Wl,--subsystem,windows -#gpg_agent_res_deps = gpg-agent-resource.o -#else -gpg_agent_res_ldflags = -gpg_agent_res_deps = -#endif - gpg_agent_CFLAGS = $(AM_CFLAGS) $(LIBASSUAN_CFLAGS) $(NPTH_CFLAGS) gpg_agent_LDADD = $(commonpth_libs) \ $(LIBGCRYPT_LIBS) $(LIBASSUAN_LIBS) $(NPTH_LIBS) \ - $(GPG_ERROR_LIBS) $(LIBINTL) $(NETLIBS) $(LIBICONV) + $(GPG_ERROR_LIBS) $(LIBINTL) $(NETLIBS) $(LIBICONV) \ + $(resource_objs) gpg_agent_LDFLAGS = $(extra_bin_ldflags) $(gpg_agent_res_ldflags) gpg_agent_DEPENDENCIES = $(gpg_agent_res_deps) + $(LIBGCRYPT_LIBS) $(LIBASSUAN_LIBS) $(PTH_LIBS) \ + $(GPG_ERROR_LIBS) $(LIBINTL) $(NETLIBS) $(LIBICONV) \ + $(resource_objs) gpg_protect_tool_SOURCES = \ protect-tool.c \ diff --git a/agent/gpg-agent-w32info.rc b/agent/gpg-agent-w32info.rc new file mode 100644 index 0000000..d586cad --- /dev/null +++ b/agent/gpg-agent-w32info.rc @@ -0,0 +1,50 @@ +/* gpg-agent-w32info.rc -*- c -*- + * Copyright (C) 2013 g10 Code GmbH + * + * This file is free software; as a special exception the author gives + * unlimited permission to copy and/or distribute it, with or without + * modifications, as long as this notice is preserved. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "afxres.h" +#include "../common/w32info-rc.h" + +1 ICON "../common/gnupg.ico" + +1 VERSIONINFO + FILEVERSION W32INFO_VI_FILEVERSION + PRODUCTVERSION W32INFO_VI_PRODUCTVERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x01L /* VS_FF_DEBUG (0x1)*/ +#else + FILEFLAGS 0x00L +#endif + FILEOS 0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4) */ + FILETYPE 0x1L /* VFT_APP (0x1) */ + FILESUBTYPE 0x0L /* VFT2_UNKNOWN */ + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" /* US English (0409), Unicode (04b0) */ + BEGIN + VALUE "FileDescription", L"GnuPG\x2019s private key daemon\0" + VALUE "InternalName", "gpg-agent\0" + VALUE "OriginalFilename", "gpg-agent.exe\0" + VALUE "ProductName", W32INFO_PRODUCTNAME + VALUE "ProductVersion", W32INFO_PRODUCTVERSION + VALUE "CompanyName", W32INFO_COMPANYNAME + VALUE "FileVersion", W32INFO_FILEVERSION + VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT + VALUE "Comments", W32INFO_COMMENTS + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 0x4b0 + END + END diff --git a/am/cmacros.am b/am/cmacros.am index 51f47c3..6ee4283 100644 --- a/am/cmacros.am +++ b/am/cmacros.am @@ -65,6 +65,12 @@ extra_sys_libs = extra_bin_ldflags = endif +if HAVE_W32_SYSTEM +.rc.o: + $(WINDRES) $(DEFAULT_INCLUDES) $(INCLUDES) "$<" "$@" + +endif +resource_objs = # Convenience macros libcommon = ../common/libcommon.a diff --git a/common/Makefile.am b/common/Makefile.am index ff8fee3..554918b 100644 --- a/common/Makefile.am +++ b/common/Makefile.am @@ -19,7 +19,8 @@ ## Process this file with automake to produce Makefile.in EXTRA_DIST = mkstrtable.awk exaudit.awk exstatus.awk ChangeLog-2011 \ - audit-events.h status-codes.h README.jnlib ChangeLog.jnlib + audit-events.h status-codes.h README.jnlib ChangeLog.jnlib \ + w32info-rc.h.in gnupg.ico noinst_LIBRARIES = libcommon.a libcommonpth.a libgpgrl.a if !HAVE_W32CE_SYSTEM diff --git a/common/gnupg.ico b/common/gnupg.ico new file mode 100644 index 0000000..4c4bae0 Binary files /dev/null and b/common/gnupg.ico differ diff --git a/common/w32info-rc.h.in b/common/w32info-rc.h.in new file mode 100644 index 0000000..1a427ee --- /dev/null +++ b/common/w32info-rc.h.in @@ -0,0 +1,32 @@ +/* w32info-rc.h.in - Common defs for VERSIONINFO resources. + * Copyright (C) 2013 g10 Code GmbH + * + * This file is free software; as a special exception the author gives + * unlimited permission to copy and/or distribute it, with or without + * modifications, as long as this notice is preserved. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +/* This file is processed by configure to create w32info-rc.h . */ + +#define W32INFO_COMMENTS "This program is free software; \ +you can redistribute it and/or modify it under the terms of the \ +GNU General Public License as published by the Free Software Foundation; \ +either version 3 of the License, or (at your option) any later version.\0" + +#define W32INFO_COMPANYNAME "g10 Code GmbH\0" + +#define W32INFO_VI_FILEVERSION @BUILD_FILEVERSION@ +#define W32INFO_VI_PRODUCTVERSION @BUILD_FILEVERSION@ + +#define W32INFO_FILEVERSION "@VERSION@ (@BUILD_REVISION@) \ +built on @BUILD_HOSTNAME@ at @BUILD_TIMESTAMP@\0" + +#define W32INFO_PRODUCTNAME "GNU Privacy Guard (GnuPG)\0" +#define W32INFO_PRODUCTVERSION "@VERSION@\0" + +#define W32INFO_LEGALCOPYRIGHT "Copyright \xa9 \ +2013 Free Software Foundation, Inc.\0" diff --git a/configure.ac b/configure.ac index 353546a..5335e56 100644 --- a/configure.ac +++ b/configure.ac @@ -1571,6 +1571,28 @@ fi # +# Provide information about the build. +# +BUILD_REVISION="mym4_revision" +AC_SUBST(BUILD_REVISION) +AC_DEFINE_UNQUOTED(BUILD_REVISION, "$BUILD_REVISION", + [GIT commit id revision used to build this package]) + +changequote(,)dnl +BUILD_FILEVERSION=`echo "$VERSION" | sed 's/\([0-9.]*\).*/\1./;s/\./,/g'` +changequote([,])dnl +BUILD_FILEVERSION="${BUILD_FILEVERSION}mym4_revision_dec" +AC_SUBST(BUILD_FILEVERSION) + +BUILD_TIMESTAMP=`date -u +%Y-%m-%dT%H:%M+0000 2>/dev/null || date` +AC_SUBST(BUILD_TIMESTAMP) +AC_DEFINE_UNQUOTED(BUILD_TIMESTAMP, "$BUILD_TIMESTAMP", + [The time this package was configured for a build]) +BUILD_HOSTNAME="$ac_hostname" +AC_SUBST(BUILD_HOSTNAME) + + +# # Print errors here so that they are visible all # together and the user can acquire them all together. # @@ -1661,6 +1683,7 @@ po/Makefile.in gl/Makefile include/Makefile common/Makefile +common/w32info-rc.h kbx/Makefile g10/Makefile sm/Makefile diff --git a/g10/Makefile.am b/g10/Makefile.am index 899677c..abf41c3 100644 --- a/g10/Makefile.am +++ b/g10/Makefile.am @@ -18,7 +18,7 @@ ## Process this file with automake to produce Makefile.in -EXTRA_DIST = options.skel ChangeLog-2011 +EXTRA_DIST = options.skel ChangeLog-2011 gpg-w32info.rc AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/common \ -I$(top_srcdir)/include -I$(top_srcdir)/intl @@ -42,6 +42,9 @@ else bzip2_source = endif +if HAVE_W32_SYSTEM +resource_objs += gpg-w32info.o +endif common_source = \ gpg.h \ @@ -128,11 +131,11 @@ LDADD = $(needed_libs) ../common/libgpgrl.a \ $(LIBINTL) $(CAPLIBS) $(NETLIBS) gpg2_LDADD = $(LDADD) $(LIBGCRYPT_LIBS) \ $(KSBA_LIBS) $(LIBASSUAN_LIBS) $(GPG_ERROR_LIBS) \ - $(LIBICONV) $(extra_sys_libs) + $(LIBICONV) $(resource_objs) $(extra_sys_libs) gpg2_LDFLAGS = $(extra_bin_ldflags) gpgv2_LDADD = $(LDADD) $(LIBGCRYPT_LIBS) \ $(KSBA_LIBS) $(LIBASSUAN_LIBS) $(GPG_ERROR_LIBS) \ - $(LIBICONV) $(extra_sys_libs) + $(LIBICONV) $(resource_objs) $(extra_sys_libs) gpgv2_LDFLAGS = $(extra_bin_ldflags) t_common_ldadd = diff --git a/g10/gpg-w32info.rc b/g10/gpg-w32info.rc new file mode 100644 index 0000000..8caf221 --- /dev/null +++ b/g10/gpg-w32info.rc @@ -0,0 +1,50 @@ +/* gpg-w32info.rc -*- c -*- + * Copyright (C) 2013 g10 Code GmbH + * + * This file is free software; as a special exception the author gives + * unlimited permission to copy and/or distribute it, with or without + * modifications, as long as this notice is preserved. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "afxres.h" +#include "../common/w32info-rc.h" + +1 ICON "../common/gnupg.ico" + +1 VERSIONINFO + FILEVERSION W32INFO_VI_FILEVERSION + PRODUCTVERSION W32INFO_VI_PRODUCTVERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x01L /* VS_FF_DEBUG (0x1)*/ +#else + FILEFLAGS 0x00L +#endif + FILEOS 0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4) */ + FILETYPE 0x1L /* VFT_APP (0x1) */ + FILESUBTYPE 0x0L /* VFT2_UNKNOWN */ + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" /* US English (0409), Unicode (04b0) */ + BEGIN + VALUE "FileDescription", L"GnuPG\x2019s OpenPGP tool\0" + VALUE "InternalName", "gpg\0" + VALUE "OriginalFilename", "gpg.exe\0" + VALUE "ProductName", W32INFO_PRODUCTNAME + VALUE "ProductVersion", W32INFO_PRODUCTVERSION + VALUE "CompanyName", W32INFO_COMPANYNAME + VALUE "FileVersion", W32INFO_FILEVERSION + VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT + VALUE "Comments", W32INFO_COMMENTS + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 0x4b0 + END + END diff --git a/scd/Makefile.am b/scd/Makefile.am index 1af13d0..577b4a0 100644 --- a/scd/Makefile.am +++ b/scd/Makefile.am @@ -17,7 +17,7 @@ ## Process this file with automake to produce Makefile.in -EXTRA_DIST = ChangeLog-2011 +EXTRA_DIST = ChangeLog-2011 scdaemon-w32info.rc if HAVE_W32_SYSTEM libexec_PROGRAMS = scdaemon @@ -29,6 +29,10 @@ AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/intl -I$(top_srcdir)/common include $(top_srcdir)/am/cmacros.am +if HAVE_W32_SYSTEM +resource_objs += scdaemon-w32info.o +endif + AM_CFLAGS = $(LIBGCRYPT_CFLAGS) \ $(KSBA_CFLAGS) $(LIBASSUAN_CFLAGS) $(NPTH_CFLAGS) @@ -48,7 +52,7 @@ scdaemon_SOURCES = \ scdaemon_LDADD = $(libcommonpth) ../gl/libgnu.a \ $(LIBGCRYPT_LIBS) $(KSBA_LIBS) $(LIBASSUAN_LIBS) $(NPTH_LIBS) \ $(LIBUSB_LIBS) $(GPG_ERROR_LIBS) \ - $(LIBINTL) $(DL_LIBS) $(NETLIBS) $(LIBICONV) + $(LIBINTL) $(DL_LIBS) $(NETLIBS) $(LIBICONV) $(resource_objs) # Removed for now: We need to decide whether it makes sense to # continue it at all, given that gpg has now all required diff --git a/scd/scdaemon-w32info.rc b/scd/scdaemon-w32info.rc new file mode 100644 index 0000000..aa0eba4 --- /dev/null +++ b/scd/scdaemon-w32info.rc @@ -0,0 +1,50 @@ +/* scdaemon-w32info.rc -*- c -*- + * Copyright (C) 2013 g10 Code GmbH + * + * This file is free software; as a special exception the author gives + * unlimited permission to copy and/or distribute it, with or without + * modifications, as long as this notice is preserved. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "afxres.h" +#include "../common/w32info-rc.h" + +1 ICON "../common/gnupg.ico" + +1 VERSIONINFO + FILEVERSION W32INFO_VI_FILEVERSION + PRODUCTVERSION W32INFO_VI_PRODUCTVERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x01L /* VS_FF_DEBUG (0x1)*/ +#else + FILEFLAGS 0x00L +#endif + FILEOS 0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4) */ + FILETYPE 0x1L /* VFT_APP (0x1) */ + FILESUBTYPE 0x0L /* VFT2_UNKNOWN */ + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" /* US English (0409), Unicode (04b0) */ + BEGIN + VALUE "FileDescription", L"GnuPG\x2019s smartcard daemon\0" + VALUE "InternalName", "scdaemon\0" + VALUE "OriginalFilename", "scdaemon.exe\0" + VALUE "ProductName", W32INFO_PRODUCTNAME + VALUE "ProductVersion", W32INFO_PRODUCTVERSION + VALUE "CompanyName", W32INFO_COMPANYNAME + VALUE "FileVersion", W32INFO_FILEVERSION + VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT + VALUE "Comments", W32INFO_COMMENTS + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 0x4b0 + END + END diff --git a/sm/Makefile.am b/sm/Makefile.am index e8dfe05..7fff752 100644 --- a/sm/Makefile.am +++ b/sm/Makefile.am @@ -17,7 +17,7 @@ ## Process this file with automake to produce Makefile.in -EXTRA_DIST = ChangeLog-2011 +EXTRA_DIST = ChangeLog-2011 gpgsm-w32info.rc bin_PROGRAMS = gpgsm @@ -26,6 +26,9 @@ AM_CFLAGS = $(LIBGCRYPT_CFLAGS) $(KSBA_CFLAGS) $(LIBASSUAN_CFLAGS) AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/common -I$(top_srcdir)/intl include $(top_srcdir)/am/cmacros.am +if HAVE_W32_SYSTEM +resource_objs += gpgsm-w32info.o +endif gpgsm_SOURCES = \ gpgsm.c gpgsm.h \ @@ -59,7 +62,7 @@ common_libs = ../kbx/libkeybox.a $(libcommon) ../gl/libgnu.a gpgsm_LDADD = $(common_libs) ../common/libgpgrl.a \ $(LIBGCRYPT_LIBS) $(KSBA_LIBS) $(LIBASSUAN_LIBS) \ $(GPG_ERROR_LIBS) $(LIBREADLINE) $(LIBINTL) $(ZLIBS) \ - $(LIBICONV) $(extra_sys_libs) + $(LIBICONV) $(resource_objs) $(extra_sys_libs) gpgsm_LDFLAGS = $(extra_bin_ldflags) # Make sure that all libs are build before we use them. This is diff --git a/sm/gpgsm-w32info.rc b/sm/gpgsm-w32info.rc new file mode 100644 index 0000000..d813b0d --- /dev/null +++ b/sm/gpgsm-w32info.rc @@ -0,0 +1,50 @@ +/* gpgsm-w32info.rc -*- c -*- + * Copyright (C) 2013 g10 Code GmbH + * + * This file is free software; as a special exception the author gives + * unlimited permission to copy and/or distribute it, with or without + * modifications, as long as this notice is preserved. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "afxres.h" +#include "../common/w32info-rc.h" + +1 ICON "../common/gnupg.ico" + +1 VERSIONINFO + FILEVERSION W32INFO_VI_FILEVERSION + PRODUCTVERSION W32INFO_VI_PRODUCTVERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x01L /* VS_FF_DEBUG (0x1)*/ +#else + FILEFLAGS 0x00L +#endif + FILEOS 0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4) */ + FILETYPE 0x1L /* VFT_APP (0x1) */ + FILESUBTYPE 0x0L /* VFT2_UNKNOWN */ + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" /* US English (0409), Unicode (04b0) */ + BEGIN + VALUE "FileDescription", L"GnuPG\x2019s X.509/CMS tool\0" + VALUE "InternalName", "gpgsm\0" + VALUE "OriginalFilename", "gpgsm.exe\0" + VALUE "ProductName", W32INFO_PRODUCTNAME + VALUE "ProductVersion", W32INFO_PRODUCTVERSION + VALUE "CompanyName", W32INFO_COMPANYNAME + VALUE "FileVersion", W32INFO_FILEVERSION + VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT + VALUE "Comments", W32INFO_COMMENTS + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 0x4b0 + END + END diff --git a/tools/Makefile.am b/tools/Makefile.am index 9d84274..bc48eea 100644 --- a/tools/Makefile.am +++ b/tools/Makefile.am @@ -20,12 +20,16 @@ EXTRA_DIST = \ Manifest watchgnupg.c \ addgnupghome applygnupgdefaults gpgsm-gencert.sh \ lspgpot mail-signed-keys convert-from-106 sockprox.c \ - ccidmon.c ChangeLog-2011 + ccidmon.c ChangeLog-2011 gpg-connect-agent-w32info.rc AM_CPPFLAGS = -I$(top_srcdir)/gl -I$(top_srcdir)/intl -I$(top_srcdir)/common include $(top_srcdir)/am/cmacros.am +if HAVE_W32_SYSTEM +resource_objs += gpg-connect-agent-w32info.o +endif + AM_CFLAGS = $(LIBGCRYPT_CFLAGS) $(GPG_ERROR_CFLAGS) $(LIBASSUAN_CFLAGS) sbin_SCRIPTS = addgnupghome applygnupgdefaults @@ -113,7 +117,8 @@ gpg_connect_agent_SOURCES = gpg-connect-agent.c no-libgcrypt.c # FIXME: remove PTH_LIBS (why do we need them at all?) gpg_connect_agent_LDADD = ../common/libgpgrl.a $(common_libs) \ $(LIBASSUAN_LIBS) $(NPTH_LIBS) $(GPG_ERROR_LIBS) \ - $(LIBREADLINE) $(LIBINTL) $(NETLIBS) $(LIBICONV) + $(LIBREADLINE) $(LIBINTL) $(NETLIBS) $(LIBICONV) \ + $(resource_objs) if !HAVE_W32CE_SYSTEM gpgkey2ssh_SOURCES = gpgkey2ssh.c diff --git a/tools/gpg-connect-agent-w32info.rc b/tools/gpg-connect-agent-w32info.rc new file mode 100644 index 0000000..4e7b19d --- /dev/null +++ b/tools/gpg-connect-agent-w32info.rc @@ -0,0 +1,51 @@ +/* scdaemon-w32info.rc -*- c -*- + * Copyright (C) 2013 g10 Code GmbH + * + * This file is free software; as a special exception the author gives + * unlimited permission to copy and/or distribute it, with or without + * modifications, as long as this notice is preserved. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY, to the extent permitted by law; without even the + * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + */ + +#include "afxres.h" +#include "../common/w32info-rc.h" + +1 ICON "../common/gnupg.ico" + +1 VERSIONINFO + FILEVERSION W32INFO_VI_FILEVERSION + PRODUCTVERSION W32INFO_VI_PRODUCTVERSION + FILEFLAGSMASK 0x3fL +#ifdef _DEBUG + FILEFLAGS 0x01L /* VS_FF_DEBUG (0x1)*/ +#else + FILEFLAGS 0x00L +#endif + FILEOS 0x40004L /* VOS_NT (0x40000) | VOS__WINDOWS32 (0x4) */ + FILETYPE 0x1L /* VFT_APP (0x1) */ + FILESUBTYPE 0x0L /* VFT2_UNKNOWN */ + BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "040904b0" /* US English (0409), Unicode (04b0) */ + BEGIN + VALUE "FileDescription", L"GnuPG\x2019s command line access \ +to the agent\0" + VALUE "InternalName", "gpg-connect-agent\0" + VALUE "OriginalFilename", "gpg-connect-agent.exe\0" + VALUE "ProductName", W32INFO_PRODUCTNAME + VALUE "ProductVersion", W32INFO_PRODUCTVERSION + VALUE "CompanyName", W32INFO_COMPANYNAME + VALUE "FileVersion", W32INFO_FILEVERSION + VALUE "LegalCopyright", W32INFO_LEGALCOPYRIGHT + VALUE "Comments", W32INFO_COMMENTS + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x409, 0x4b0 + END + END commit 2c3fc4719b92d9e3ac32efd134a930e1cc126032 Author: Ian Abbott Date: Thu Apr 25 12:00:16 2013 +0100 doc: fix some Texinfo warnings. * doc/gpg.texi: Fix syntax and add missing menu entries. * doc/gpgsm.texi: Fix subsectioning. -- These five patches fix some warnings from Texinfo 5 by adding some missing nodes and changing some sections to subsections, and moving an '@end ifset' to the start of a line. I also noticed the 'Deprecated options' subsection didn't appear in the GPG options menu, so I added it. (Texinfo never warned about it because it was after the last node in the menu.) 1) doc/gpg.texi: move '@end ifset' to start of line 2) doc/gpg.texi: Add missing node for 'Compliance options' section. 3) doc/gpg.texi: add node for 'Deprecated options' subsection. 4) doc/gpg.texi: make 'Unattended key generation' a subsection 5) doc/gpgsm.texi: fix subsectioning for Unattended Usage (all 5 merged into one patch by wk) (cherry picked from commit 4d67f59a336bfa0ff19fc23209940724196fd886) Signed-off-by: Werner Koch diff --git a/doc/gpg.texi b/doc/gpg.texi index cec4581..a88ddca 100644 --- a/doc/gpg.texi +++ b/doc/gpg.texi @@ -926,7 +926,9 @@ behaviour and to change the default configuration. * GPG Key related Options:: Key related options. * GPG Input and Output:: Input and Output. * OpenPGP Options:: OpenPGP protocol specific options. +* Compliance Options:: Compliance options. * GPG Esoteric Options:: Doing things one usually don't want to do. +* Deprecated Options:: Deprecated options. @end menu Long options can be put in an options file (default @@ -2183,6 +2185,7 @@ meaningful if @option{--s2k-mode} is 3. @c *************************** @c ******* Compliance ******** @c *************************** + at node Compliance Options @subsection Compliance options These options control what GnuPG is compliant to. Only one of these @@ -2845,6 +2848,7 @@ on the configuration file. @c ******************************* @c ******* Deprecated ************ @c ******************************* + at node Deprecated Options @subsection Deprecated options @table @gnupgtabopt @@ -2990,9 +2994,9 @@ Operation is further controlled by a few environment variables: @item GPG_AGENT_INFO Used to locate the gpg-agent. - @ifset gpgone + at ifset gpgone This is only honored when @option{--use-agent} is set. - @end ifset + at end ifset The value consists of 3 colon delimited fields: The first is the path to the Unix Domain Socket, the second the PID of the gpg-agent and the protocol version which should be set to 1. When starting the gpg-agent @@ -3167,8 +3171,8 @@ are almost always required for this. @end menu - at node Unattended GPG key generation,,,Unattended Usage of GPG - at section Unattended key generation + at node Unattended GPG key generation + at subsection Unattended key generation The command @option{--gen-key} may be used along with the option @option{--batch} for unattended key generation. The parameters are diff --git a/doc/gpgsm.texi b/doc/gpgsm.texi index 6a84391..f7cedaf 100644 --- a/doc/gpgsm.texi +++ b/doc/gpgsm.texi @@ -916,8 +916,8 @@ but may also be used in the standard operation mode by using the * CSR and certificate creation:: CSR and certificate creation. @end menu - at node Automated signature checking,,,Unattended Usage - at section Automated signature checking + at node Automated signature checking + at subsection Automated signature checking It is very important to understand the semantics used with signature verification. Checking a signature is not as simple as it may sound and @@ -960,8 +960,8 @@ this is a missing certificate. @end table - at node CSR and certificate creation,,,Unattended Usage - at section CSR and certificate creation + at node CSR and certificate creation + at subsection CSR and certificate creation @ifclear gpgtwoone @strong{Please notice}: The immediate creation of certificates is only ----------------------------------------------------------------------- Summary of changes: agent/Makefile.am | 24 ++++------ agent/gpg-agent-w32info.rc | 50 ++++++++++++++++++++++ am/cmacros.am | 6 +++ common/Makefile.am | 3 +- artwork/gnupg-favicon-1.ico => common/gnupg.ico | Bin 10134 -> 10134 bytes common/w32info-rc.h.in | 32 ++++++++++++++ configure.ac | 23 ++++++++++ doc/gpg.texi | 12 ++++-- doc/gpgsm.texi | 8 ++-- g10/Makefile.am | 9 +++- g10/gpg-w32info.rc | 50 ++++++++++++++++++++++ scd/Makefile.am | 8 +++- scd/scdaemon-w32info.rc | 50 ++++++++++++++++++++++ sm/Makefile.am | 7 ++- sm/gpgsm-w32info.rc | 50 ++++++++++++++++++++++ tools/Makefile.am | 9 +++- tools/gpg-connect-agent-w32info.rc | 51 +++++++++++++++++++++++ 17 files changed, 360 insertions(+), 32 deletions(-) create mode 100644 agent/gpg-agent-w32info.rc copy artwork/gnupg-favicon-1.ico => common/gnupg.ico (100%) create mode 100644 common/w32info-rc.h.in create mode 100644 g10/gpg-w32info.rc create mode 100644 scd/scdaemon-w32info.rc create mode 100644 sm/gpgsm-w32info.rc create mode 100644 tools/gpg-connect-agent-w32info.rc hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 22 10:41:44 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 22 May 2013 10:41:44 +0200 Subject: [git] GnuPG - branch, master, updated. gnupg-2.1.0beta3-216-g7777e68 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU Privacy Guard". The branch, master has been updated via 7777e68d0482c942f527e91c04adbcfb40bc8bef (commit) via cb6a64bb78296c8e9f72df0c482ff847e89a1541 (commit) via 0f0e0559f9b160824f10dc17b389268cdb53aea4 (commit) via f2d8a14e1b12534eba69d595a62c78f92331e11b (commit) from 88e24341e57c96e31a25e92e09d67989e64cc1c1 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 7777e68d0482c942f527e91c04adbcfb40bc8bef Author: Werner Koch Date: Wed May 22 09:50:12 2013 +0100 Implement unattended OpenPGP secret key import. * agent/command.c (cmd_import_key): Add option --unattended. * agent/cvt-openpgp.c (convert_transfer_key): New. (do_unprotect): Factor some code out to ... (prepare_unprotect): new function. (convert_from_openpgp): Factor all code out to ... (convert_from_openpgp_main): this. Add arg 'passphrase'. Implement openpgp-native protection modes. (convert_from_openpgp_native): New. * agent/t-protect.c (convert_from_openpgp_native): New dummy fucntion * agent/protect-tool.c (convert_from_openpgp_native): Ditto. * agent/protect.c (agent_unprotect): Add arg CTRL. Adjust all callers. Support openpgp-native protection. * g10/call-agent.c (agent_import_key): Add arg 'unattended'. * g10/import.c (transfer_secret_keys): Use unattended in batch mode. -- With the gpg-agent taking care of the secret keys, the user needs to migrate existing keys from secring.gpg to the agent. This and also the standard import of secret keys required the user to unprotect the secret keys first, so that gpg-agent was able to re-protected them using its own scheme. With many secret keys this is quite some usability hurdle. In particular if a passphrase is not instantly available. To make this migration smoother, this patch implements an unattended key import/migration which delays the conversion to the gpg-agent format until the key is actually used. For example: gpg2 --batch --import mysecretkey.gpg works without any user interaction due to the use of --batch. Now if a key is used (e.g. "gpg2 -su USERID_FROM_MYSECRETKEY foo"), gpg-agent has to ask for the passphrase anyway, converts the key from the openpgp format to the internal format, signs, re-encrypts the key and tries to store it in the gpg-agent format to the disk. The next time, the internal format of the key is used. This patch has only been tested with the old demo keys, more tests with other protection formats and no protection are needed. Signed-off-by: Werner Koch diff --git a/README b/README index 03da25e..c64a14e 100644 --- a/README +++ b/README @@ -5,7 +5,8 @@ THIS IS A DEVELOPMENT VERSION AND NOT INTENDED FOR REGULAR USE. Copyright 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, - 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. + 2006, 2007, 2008, 2009, 2010, 2011, 2012, + 2013 Free Software Foundation, Inc. INTRODUCTION @@ -32,21 +33,22 @@ BUILD INSTRUCTIONS GnuPG 2.1 depends on the following packages: + npth (ftp://ftp.gnupg.org/gcrypt/npth/) libgpg-error (ftp://ftp.gnupg.org/gcrypt/libgpg-error/) libgcrypt (ftp://ftp.gnupg.org/gcrypt/libgcrypt/) libksba (ftp://ftp.gnupg.org/gcrypt/libksba/) libassuan (ftp://ftp.gnupg.org/gcrypt/libassuan/) -You also need the Pinentry package for most function of GnuPG; however -it is not a build requirement. Pinentry is available at -ftp://ftp.gnupg.org/gcrypt/pinentry/ . - You should get the latest versions of course, the GnuPG configure script complains if a version is not sufficient. +You also need the Pinentry package for most functions of GnuPG; +however it is not a build requirement. Pinentry is available at +ftp://ftp.gnupg.org/gcrypt/pinentry/ . + After building and installing the above packages in the order as given -above, you may now continue with GnuPG installation (you may also just -try to build GnuPG to see whether your already installed versions are +above, you may continue with GnuPG installation (you may also just try +to build GnuPG to see whether your already installed versions are sufficient). As with all packages, you just have to do @@ -62,7 +64,8 @@ S/MIME and smartcards. Note that there is no binary gpg but a gpg2 so that this package won't conflict with a GnuPG 1.4 installation. gpg2 behaves just like gpg. -In case of problem please ask on gnupg-users at gnupg.org for advise. +In case of problem please ask on gnupg-users at gnupg.org mailing list +for advise. Note that the PKITS tests are always skipped unless you copy the PKITS test data file into the tests/pkits directory. There is no need to @@ -79,21 +82,24 @@ to view the default directories used by GnuPG. MIGRATION FROM 1.4 or 2.0 to 2.1 ================================ -The major change in 2.1 is that gpg-agent now takes care of the -OpenPGP secret keys (those managed by GPG). The former secring.gpg -will not be used anymore. Newly generated keys are generated and -stored in the agent's key store (~/.gnupg/private-keys-v1.d/). To -migrate your existing keys to the agent you should run this command +The major change in 2.1 is gpg-agent taking care of the OpenPGP secret +keys (those managed by GPG). The former file "secring.gpg" will not +be used anymore. Newly generated keys are stored in the agent's key +store directory "~/.gnupg/private-keys-v1.d/". + +To migrate your existing keys you need to run the command + + gpg2 --batch --import ~/.gnupg/secring.gpg - gpg2 --import ~/.gnupg/secring.gpg +Secret keys already imported are skipped by this command. It is +advisable to keep the secring.gpg for use with older versions of GPG. -The agent will you ask for the passphrase of each key. You may use -the Cancel button of the Pinentry to skip importing this key. If you -want to stop the import process and you use one of the latest -pinentries, you should close the pinentry window instead of hitting -the cancel button. Secret keys already imported are skipped by the -import command. It is advisable to keep the secring.gpg for use with -older versions of GPG. +The use of "--batch" with "--import" is highly recommended. If you do +not use "--batch" the agent would ask for the passphrase of each key. +In this case you may use the Cancel button of the Pinentry to skip +importing this key. If you want to stop the enite import process and +you use a decent version of Pinentry, you should close the Pinentry +window instead of hitting the Cancel button. Note that gpg-agent now uses a fixed socket by default. All tools will start the gpg-agent as needed. In general there is no more need @@ -182,8 +188,13 @@ authors directly as we are busy working on improvements and bug fixes. The English and German mailing lists are watched by the authors and we try to answer questions when time allows us to do so. -Commercial grade support for GnuPG is available; please see -http://www.gnupg.org/service.html . +Commercial grade support for GnuPG is available; for a listing of +offers see http://www.gnupg.org/service.html . The driving force +behind the development of GnuPG is the company of its principal +author, Werner Koch. Maintenance and improvement of GnuPG and related +software takes up most of their resources. To allow him to continue +his work he asks to either purchase a support contract, engage them +for custom enhancements, or to donate money. See http://g10code.com . This file is Free Software; as a special exception the authors gives diff --git a/agent/agent.h b/agent/agent.h index 2fd0b8b..7445061 100644 --- a/agent/agent.h +++ b/agent/agent.h @@ -374,7 +374,8 @@ unsigned char get_standard_s2k_count_rfc4880 (void); int agent_protect (const unsigned char *plainkey, const char *passphrase, unsigned char **result, size_t *resultlen, unsigned long s2k_count); -int agent_unprotect (const unsigned char *protectedkey, const char *passphrase, +int agent_unprotect (ctrl_t ctrl, + const unsigned char *protectedkey, const char *passphrase, gnupg_isotime_t protected_at, unsigned char **result, size_t *resultlen); int agent_private_key_type (const unsigned char *privatekey); diff --git a/agent/command.c b/agent/command.c index e57c69d..0364868 100644 --- a/agent/command.c +++ b/agent/command.c @@ -1,6 +1,7 @@ /* command.c - gpg-agent command handler * Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2008, 2009, 2010, * 2011 Free Software Foundation, Inc. + * Copyright (C) 2013 Werner Koch * * This file is part of GnuPG. * @@ -1807,18 +1808,21 @@ cmd_keywrap_key (assuan_context_t ctx, char *line) static const char hlp_import_key[] = - "IMPORT_KEY []\n" + "IMPORT_KEY [--unattended] []\n" "\n" "Import a secret key into the key store. The key is expected to be\n" "encrypted using the current session's key wrapping key (cf. command\n" "KEYWRAP_KEY) using the AESWRAP-128 algorithm. This function takes\n" "no arguments but uses the inquiry \"KEYDATA\" to ask for the actual\n" - "key data. The unwrapped key must be a canonical S-expression."; + "key data. The unwrapped key must be a canonical S-expression. The\n" + "option --unattended tries to import the key as-is without any\n" + "re-encryption"; static gpg_error_t cmd_import_key (assuan_context_t ctx, char *line) { ctrl_t ctrl = assuan_get_pointer (ctx); gpg_error_t err; + int opt_unattended; unsigned char *wrappedkey = NULL; size_t wrappedkeylen; gcry_cipher_hd_t cipherhd = NULL; @@ -1838,6 +1842,9 @@ cmd_import_key (assuan_context_t ctx, char *line) goto leave; } + opt_unattended = has_option (line, "--unattended"); + line = skip_options (line); + p = line; for (p=line; *p && *p != ' ' && *p != '\t'; p++) ; @@ -1921,7 +1928,7 @@ cmd_import_key (assuan_context_t ctx, char *line) key = NULL; err = convert_from_openpgp (ctrl, openpgp_sexp, grip, ctrl->server_local->keydesc, cache_nonce, - &key, &passphrase); + &key, opt_unattended? NULL : &passphrase); if (err) goto leave; realkeylen = gcry_sexp_canon_len (key, 0, NULL, &err); @@ -1929,6 +1936,7 @@ cmd_import_key (assuan_context_t ctx, char *line) goto leave; /* Invalid canonical encoded S-expression. */ if (passphrase) { + assert (!opt_unattended); if (!cache_nonce) { char buf[12]; @@ -1941,6 +1949,12 @@ cmd_import_key (assuan_context_t ctx, char *line) assuan_write_status (ctx, "CACHE_NONCE", cache_nonce); } } + else if (opt_unattended) + { + err = set_error (GPG_ERR_ASS_PARAMETER, + "\"--unattended\" may only be used with OpenPGP keys"); + goto leave; + } else { if (!agent_key_available (grip)) @@ -1957,7 +1971,7 @@ cmd_import_key (assuan_context_t ctx, char *line) if (passphrase) { err = agent_protect (key, passphrase, &finalkey, &finalkeylen, - ctrl->s2k_count); + ctrl->s2k_count); if (!err) err = agent_write_private_key (grip, finalkey, finalkeylen, 0); } diff --git a/agent/cvt-openpgp.c b/agent/cvt-openpgp.c index ec0fd0a..205b953 100644 --- a/agent/cvt-openpgp.c +++ b/agent/cvt-openpgp.c @@ -1,6 +1,7 @@ /* cvt-openpgp.c - Convert an OpenPGP key to our internal format. * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2006, 2009, * 2010 Free Software Foundation, Inc. + * Copyright (C) 2013 Werner Koch * * This file is part of GnuPG. * @@ -160,6 +161,72 @@ convert_secret_key (gcry_sexp_t *r_key, int pubkey_algo, gcry_mpi_t *skey) } +/* Convert a secret key given as algorithm id, an array of key + parameters, and an S-expression of the original OpenPGP transfer + key into our s-expression based format. This is a variant of + convert_secret_key which is used for the openpgp-native protection + mode. Note that PUBKEY_ALGO has an gcrypt algorithm number. */ +static gpg_error_t +convert_transfer_key (gcry_sexp_t *r_key, int pubkey_algo, gcry_mpi_t *skey, + gcry_sexp_t transfer_key) +{ + gpg_error_t err; + gcry_sexp_t s_skey = NULL; + + *r_key = NULL; + + switch (pubkey_algo) + { + case GCRY_PK_DSA: + err = gcry_sexp_build + (&s_skey, NULL, + "(protected-private-key(dsa(p%m)(q%m)(g%m)(y%m)" + "(protected openpgp-native%S)))", + skey[0], skey[1], skey[2], skey[3], transfer_key); + break; + + case GCRY_PK_ELG: + case GCRY_PK_ELG_E: + err = gcry_sexp_build + (&s_skey, NULL, + "(protected-private-key(elg(p%m)(g%m)(y%m)" + "(protected openpgp-native%S)))", + skey[0], skey[1], skey[2], transfer_key); + break; + + + case GCRY_PK_RSA: + case GCRY_PK_RSA_E: + case GCRY_PK_RSA_S: + err = gcry_sexp_build + (&s_skey, NULL, + "(protected-private-key(rsa(n%m)(e%m)", + "(protected openpgp-native%S)))", + skey[0], skey[1], transfer_key ); + break; + + case GCRY_PK_ECDSA: + case GCRY_PK_ECDH: + /* Although our code would work with "ecc" we explicitly use + "ecdh" or "ecdsa" to implicitly set the key capabilities. */ + err = gcry_sexp_build + (&s_skey, NULL, + "(protected-private-key(%s(p%m)(a%m)(b%m)(g%m)(n%m)(q%m)" + "(protected openpgp-native%S)))", + pubkey_algo == GCRY_PK_ECDSA?"ecdsa":"ecdh", + skey[0], skey[1], skey[2], skey[3], skey[4], skey[5], transfer_key); + break; + + default: + err = gpg_error (GPG_ERR_PUBKEY_ALGO); + break; + } + + if (!err) + *r_key = s_skey; + return err; +} + /* Hash the passphrase and set the key. */ static gpg_error_t @@ -202,30 +269,19 @@ checksum (const unsigned char *p, unsigned int n) } -/* Note that this function modified SKEY. SKEYSIZE is the allocated - size of the array including the NULL item; this is used for a - bounds check. On success a converted key is stored at R_KEY. */ +/* Helper for do_unprotect. PUBKEY_ALOGO is the gcrypt algo number. + On success R_NPKEY and R_NSKEY receive the number or parameters for + the algorithm PUBKEY_ALGO and R_SKEYLEN the used length of + SKEY. */ static int -do_unprotect (const char *passphrase, - int pkt_version, int pubkey_algo, int is_protected, - gcry_mpi_t *skey, size_t skeysize, - int protect_algo, void *protect_iv, size_t protect_ivlen, - int s2k_mode, int s2k_algo, byte *s2k_salt, u32 s2k_count, - u16 desired_csum, gcry_sexp_t *r_key) +prepare_unprotect (int pubkey_algo, gcry_mpi_t *skey, size_t skeysize, + int s2k_mode, + unsigned int *r_npkey, unsigned int *r_nskey, + unsigned int *r_skeylen) { gpg_error_t err; size_t npkey, nskey, skeylen; - gcry_cipher_hd_t cipher_hd = NULL; - u16 actual_csum; - size_t nbytes; int i; - gcry_mpi_t tmpmpi; - - *r_key = NULL; - - /* Unfortunately, the OpenPGP PK algorithm numbers need to be - re-mapped for Libgcrypt. */ - pubkey_algo = map_pk_openpgp_to_gcry (pubkey_algo); /* Count the actual number of MPIs is in the array and set the remainder to NULL for easier processing later on. */ @@ -264,6 +320,54 @@ do_unprotect (const char *passphrase, if (nskey+1 >= skeysize) return gpg_error (GPG_ERR_BUFFER_TOO_SHORT); + /* Check that the public key parameters are all available and not + encrypted. */ + for (i=0; i < npkey; i++) + { + if (!skey[i] || gcry_mpi_get_flag (skey[i], GCRYMPI_FLAG_OPAQUE)) + return gpg_error (GPG_ERR_BAD_SECKEY); + } + + if (r_npkey) + *r_npkey = npkey; + if (r_nskey) + *r_nskey = nskey; + if (r_skeylen) + *r_skeylen = skeylen; + return 0; +} + + +/* Note that this function modifies SKEY. SKEYSIZE is the allocated + size of the array including the NULL item; this is used for a + bounds check. On success a converted key is stored at R_KEY. */ +static int +do_unprotect (const char *passphrase, + int pkt_version, int pubkey_algo, int is_protected, + gcry_mpi_t *skey, size_t skeysize, + int protect_algo, void *protect_iv, size_t protect_ivlen, + int s2k_mode, int s2k_algo, byte *s2k_salt, u32 s2k_count, + u16 desired_csum, gcry_sexp_t *r_key) +{ + gpg_error_t err; + unsigned int npkey, nskey, skeylen; + gcry_cipher_hd_t cipher_hd = NULL; + u16 actual_csum; + size_t nbytes; + int i; + gcry_mpi_t tmpmpi; + + *r_key = NULL; + + /* Unfortunately, the OpenPGP PK algorithm numbers need to be + re-mapped for Libgcrypt. */ + pubkey_algo = map_pk_openpgp_to_gcry (pubkey_algo); + + err = prepare_unprotect (pubkey_algo, skey, skeysize, s2k_mode, + &npkey, &nskey, &skeylen); + if (err) + return err; + /* Check whether SKEY is at all protected. If it is not protected merely verify the checksum. */ if (!is_protected) @@ -512,7 +616,7 @@ do_unprotect (const char *passphrase, } -/* Callback function to try the unprotection from the passpharse query +/* Callback function to try the unprotection from the passphrase query code. */ static int try_do_unprotect_cb (struct pin_entry_info_s *pi) @@ -536,24 +640,19 @@ try_do_unprotect_cb (struct pin_entry_info_s *pi) } -/* Convert an OpenPGP transfer key into our internal format. Before - asking for a passphrase we check whether the key already exists in - our key storage. S_PGP is the OpenPGP key in transfer format. If - CACHE_NONCE is given the passphrase will be looked up in the cache. - On success R_KEY will receive a canonical encoded S-expression with - the unprotected key in our internal format; the caller needs to - release that memory. The passphrase used to decrypt the OpenPGP - key will be returned at R_PASSPHRASE; the caller must release this - passphrase. The keygrip will be stored at the 20 byte buffer - pointed to by GRIP. On error NULL is stored at all return - arguments. */ -gpg_error_t -convert_from_openpgp (ctrl_t ctrl, gcry_sexp_t s_pgp, - unsigned char *grip, const char *prompt, - const char *cache_nonce, - unsigned char **r_key, char **r_passphrase) +/* See convert_from_openpgp for the core of the description. This + function adds an optional PASSPHRASE argument and uses this to + silently decrypt the key; CACHE_NONCE and R_PASSPHRASE must both be + NULL in this mode. */ +static gpg_error_t +convert_from_openpgp_main (ctrl_t ctrl, gcry_sexp_t s_pgp, + unsigned char *grip, const char *prompt, + const char *cache_nonce, const char *passphrase, + unsigned char **r_key, char **r_passphrase) { gpg_error_t err; + int unattended; + int from_native; gcry_sexp_t top_list; gcry_sexp_t list = NULL; const char *value; @@ -573,12 +672,13 @@ convert_from_openpgp (ctrl_t ctrl, gcry_sexp_t s_pgp, gcry_mpi_t skey[10]; /* We support up to 9 parameters. */ u16 desired_csum; int skeyidx = 0; - gcry_sexp_t s_skey; - struct pin_entry_info_s *pi; - struct try_do_unprotect_arg_s pi_arg; + gcry_sexp_t s_skey = NULL; *r_key = NULL; - *r_passphrase = NULL; + if (r_passphrase) + *r_passphrase = NULL; + unattended = !r_passphrase; + from_native = (!cache_nonce && passphrase && !r_passphrase); top_list = gcry_sexp_find_token (s_pgp, "openpgp-private-key", 0); if (!top_list) @@ -607,6 +707,7 @@ convert_from_openpgp (ctrl_t ctrl, gcry_sexp_t s_pgp, is_protected = 0; else goto bad_seckey; + if (is_protected) { string = gcry_sexp_nth_string (list, 2); @@ -755,64 +856,89 @@ convert_from_openpgp (ctrl_t ctrl, gcry_sexp_t s_pgp, if (err) goto leave; - if (!agent_key_available (grip)) + if (!from_native && !agent_key_available (grip)) { err = gpg_error (GPG_ERR_EEXIST); goto leave; } - pi = xtrycalloc_secure (1, sizeof (*pi) + 100); - if (!pi) - return gpg_error_from_syserror (); - pi->max_length = 100; - pi->min_digits = 0; /* We want a real passphrase. */ - pi->max_digits = 16; - pi->max_tries = 3; - pi->check_cb = try_do_unprotect_cb; - pi->check_cb_arg = &pi_arg; - pi_arg.is_v4 = is_v4; - pi_arg.is_protected = is_protected; - pi_arg.pubkey_algo = pubkey_algo; - pi_arg.protect_algo = protect_algo; - pi_arg.iv = iv; - pi_arg.ivlen = ivlen; - pi_arg.s2k_mode = s2k_mode; - pi_arg.s2k_algo = s2k_algo; - pi_arg.s2k_salt = s2k_salt; - pi_arg.s2k_count = s2k_count; - pi_arg.desired_csum = desired_csum; - pi_arg.skey = skey; - pi_arg.skeysize = DIM (skey); - pi_arg.skeyidx = skeyidx; - pi_arg.r_key = &s_skey; - - err = gpg_error (GPG_ERR_BAD_PASSPHRASE); - if (cache_nonce) + if (unattended && !from_native) { - char *cache_value; + int pubkey_g_algo = map_pk_openpgp_to_gcry (pubkey_algo); - cache_value = agent_get_cache (cache_nonce, CACHE_MODE_NONCE); - if (cache_value) - { - if (strlen (cache_value) < pi->max_length) - strcpy (pi->pin, cache_value); - xfree (cache_value); - } - if (*pi->pin) - err = try_do_unprotect_cb (pi); + err = prepare_unprotect (pubkey_g_algo, skey, DIM(skey), s2k_mode, + NULL, NULL, NULL); + if (err) + goto leave; + + err = convert_transfer_key (&s_skey, pubkey_g_algo, skey, s_pgp); + if (err) + goto leave; } - if (gpg_err_code (err) == GPG_ERR_BAD_PASSPHRASE) - err = agent_askpin (ctrl, prompt, NULL, NULL, pi); - skeyidx = pi_arg.skeyidx; - if (!err) + else { - *r_passphrase = xtrystrdup (pi->pin); - if (!*r_passphrase) - err = gpg_error_from_syserror (); + struct pin_entry_info_s *pi; + struct try_do_unprotect_arg_s pi_arg; + + pi = xtrycalloc_secure (1, sizeof (*pi) + 100); + if (!pi) + return gpg_error_from_syserror (); + pi->max_length = 100; + pi->min_digits = 0; /* We want a real passphrase. */ + pi->max_digits = 16; + pi->max_tries = 3; + pi->check_cb = try_do_unprotect_cb; + pi->check_cb_arg = &pi_arg; + pi_arg.is_v4 = is_v4; + pi_arg.is_protected = is_protected; + pi_arg.pubkey_algo = pubkey_algo; + pi_arg.protect_algo = protect_algo; + pi_arg.iv = iv; + pi_arg.ivlen = ivlen; + pi_arg.s2k_mode = s2k_mode; + pi_arg.s2k_algo = s2k_algo; + pi_arg.s2k_salt = s2k_salt; + pi_arg.s2k_count = s2k_count; + pi_arg.desired_csum = desired_csum; + pi_arg.skey = skey; + pi_arg.skeysize = DIM (skey); + pi_arg.skeyidx = skeyidx; + pi_arg.r_key = &s_skey; + + err = gpg_error (GPG_ERR_BAD_PASSPHRASE); + if (cache_nonce) + { + char *cache_value; + + cache_value = agent_get_cache (cache_nonce, CACHE_MODE_NONCE); + if (cache_value) + { + if (strlen (cache_value) < pi->max_length) + strcpy (pi->pin, cache_value); + xfree (cache_value); + } + if (*pi->pin) + err = try_do_unprotect_cb (pi); + } + else if (from_native) + { + if (strlen (passphrase) < pi->max_length) + strcpy (pi->pin, passphrase); + err = try_do_unprotect_cb (pi); + } + if (gpg_err_code (err) == GPG_ERR_BAD_PASSPHRASE && !from_native) + err = agent_askpin (ctrl, prompt, NULL, NULL, pi); + skeyidx = pi_arg.skeyidx; + if (!err && r_passphrase) + { + *r_passphrase = xtrystrdup (pi->pin); + if (!*r_passphrase) + err = gpg_error_from_syserror (); + } + xfree (pi); + if (err) + goto leave; } - xfree (pi); - if (err) - goto leave; /* Save some memory and get rid of the SKEY array now. */ for (idx=0; idx < skeyidx; idx++) @@ -820,16 +946,16 @@ convert_from_openpgp (ctrl_t ctrl, gcry_sexp_t s_pgp, skeyidx = 0; /* Note that the padding is not required - we use it only because - that function allows us to created the result in secure memory. */ + that function allows us to create the result in secure memory. */ err = make_canon_sexp_pad (s_skey, 1, r_key, NULL); - gcry_sexp_release (s_skey); leave: + gcry_sexp_release (s_skey); gcry_sexp_release (list); gcry_sexp_release (top_list); for (idx=0; idx < skeyidx; idx++) gcry_mpi_release (skey[idx]); - if (err) + if (err && r_passphrase) { xfree (*r_passphrase); *r_passphrase = NULL; @@ -847,6 +973,63 @@ convert_from_openpgp (ctrl_t ctrl, gcry_sexp_t s_pgp, } +/* Convert an OpenPGP transfer key into our internal format. Before + asking for a passphrase we check whether the key already exists in + our key storage. S_PGP is the OpenPGP key in transfer format. If + CACHE_NONCE is given the passphrase will be looked up in the cache. + On success R_KEY will receive a canonical encoded S-expression with + the unprotected key in our internal format; the caller needs to + release that memory. The passphrase used to decrypt the OpenPGP + key will be returned at R_PASSPHRASE; the caller must release this + passphrase. If R_PASSPHRASE is NULL the unattended conversion mode + will be used which uses the openpgp-native protection format for + the key. The keygrip will be stored at the 20 byte buffer pointed + to by GRIP. On error NULL is stored at all return arguments. */ +gpg_error_t +convert_from_openpgp (ctrl_t ctrl, gcry_sexp_t s_pgp, + unsigned char *grip, const char *prompt, + const char *cache_nonce, + unsigned char **r_key, char **r_passphrase) +{ + return convert_from_openpgp_main (ctrl, s_pgp, grip, prompt, + cache_nonce, NULL, + r_key, r_passphrase); +} + +/* This function is called by agent_unprotect to re-protect an + openpgp-native protected private-key into the standard private-key + protection format. */ +gpg_error_t +convert_from_openpgp_native (ctrl_t ctrl, + gcry_sexp_t s_pgp, const char *passphrase, + unsigned char **r_key) +{ + gpg_error_t err; + unsigned char grip[20]; + + if (!passphrase) + return gpg_error (GPG_ERR_INTERNAL); + + err = convert_from_openpgp_main (ctrl, s_pgp, grip, NULL, + NULL, passphrase, + r_key, NULL); + + /* On success try to re-write the key. */ + if (!err) + { + unsigned char *protectedkey = NULL; + size_t protectedkeylen; + + if (!agent_protect (*r_key, passphrase, &protectedkey, &protectedkeylen, + ctrl->s2k_count)) + agent_write_private_key (grip, protectedkey, protectedkeylen, 1); + xfree (protectedkey); + } + + return err; +} + + static gpg_error_t key_from_sexp (gcry_sexp_t sexp, const char *elems, gcry_mpi_t *array) diff --git a/agent/cvt-openpgp.h b/agent/cvt-openpgp.h index 3c48d03..d27a776 100644 --- a/agent/cvt-openpgp.h +++ b/agent/cvt-openpgp.h @@ -23,6 +23,10 @@ gpg_error_t convert_from_openpgp (ctrl_t ctrl, gcry_sexp_t s_pgp, unsigned char *grip, const char *prompt, const char *cache_nonce, unsigned char **r_key, char **r_passphrase); +gpg_error_t convert_from_openpgp_native (ctrl_t ctrl, + gcry_sexp_t s_pgp, + const char *passphrase, + unsigned char **r_key); gpg_error_t convert_to_openpgp (ctrl_t ctrl, gcry_sexp_t s_key, const char *passphrase, diff --git a/agent/findkey.c b/agent/findkey.c index ebdcc03..d11f088 100644 --- a/agent/findkey.c +++ b/agent/findkey.c @@ -66,6 +66,9 @@ agent_write_private_key (const unsigned char *grip, fname = make_filename (opt.homedir, GNUPG_PRIVATE_KEYS_DIR, hexgrip, NULL); + /* FIXME: Write to a temp file first so that write failures during + key updates won't lead to a key loss. */ + if (!force && !access (fname, F_OK)) { log_error ("secret key file '%s' already exists\n", fname); @@ -119,7 +122,7 @@ try_unprotect_cb (struct pin_entry_info_s *pi) assert (!arg->unprotected_key); arg->change_required = 0; - err = agent_unprotect (arg->protected_key, pi->pin, protected_at, + err = agent_unprotect (arg->ctrl, arg->protected_key, pi->pin, protected_at, &arg->unprotected_key, &dummy); if (err) return err; @@ -325,7 +328,7 @@ unprotect (ctrl_t ctrl, const char *cache_nonce, const char *desc_text, pw = agent_get_cache (cache_nonce, CACHE_MODE_NONCE); if (pw) { - rc = agent_unprotect (*keybuf, pw, NULL, &result, &resultlen); + rc = agent_unprotect (ctrl, *keybuf, pw, NULL, &result, &resultlen); if (!rc) { if (r_passphrase) @@ -350,7 +353,7 @@ unprotect (ctrl_t ctrl, const char *cache_nonce, const char *desc_text, pw = agent_get_cache (hexgrip, cache_mode); if (pw) { - rc = agent_unprotect (*keybuf, pw, NULL, &result, &resultlen); + rc = agent_unprotect (ctrl, *keybuf, pw, NULL, &result, &resultlen); if (!rc) { if (r_passphrase) diff --git a/agent/keyformat.txt b/agent/keyformat.txt index 7ba6af2..3f95dae 100644 --- a/agent/keyformat.txt +++ b/agent/keyformat.txt @@ -84,56 +84,94 @@ encrypted_octet_string. The result of the decryption process is a list of the secret key parameters. The protected-at expression is optional; the isotimestamp is 15 bytes long (e.g. "19610711T172000"). -The only available protection mode for now is +The currently defined protection modes are: - openpgp-s2k3-sha1-aes-cbc +1. openpgp-s2k3-sha1-aes-cbc -which describes an algorithm using using AES in CBC mode for -encryption, SHA-1 for integrity protection and the String to Key -algorithm 3 from OpenPGP (rfc2440). + This describes an algorithm using using AES in CBC mode for + encryption, SHA-1 for integrity protection and the String to Key + algorithm 3 from OpenPGP (rfc2440). -Example: - -(protected openpgp-s2k3-sha1-aes-cbc - ((sha1 16byte_salt no_of_iterations) 16byte_iv) - encrypted_octet_string -) + Example: -The encrypted_octet string should yield this S-Exp (in canonical -representation) after decryption: + (protected openpgp-s2k3-sha1-aes-cbc + ((sha1 16byte_salt no_of_iterations) 16byte_iv) + encrypted_octet_string + ) -( - ( - (d #046129F..[some bytes not shown]..81#) - (p #00e861b..[some bytes not shown]..f1#) - (q #00f7a7c..[some bytes not shown]..61#) - (u #304559a..[some bytes not shown]..9b#) - ) - (hash sha1 #...[hashvalue]...#) -) + The encrypted_octet string should yield this S-Exp (in canonical + representation) after decryption: -For padding reasons, random bytes are appended to this list - they can -easily be stripped by looking for the end of the list. - -The hash is calculated on the concatenation of the public key and -secret key parameter lists: i.e it is required to hash the -concatenation of these 6 canonical encoded lists for RSA, including -the parenthesis, the algorithm keyword and (if used) the protected-at -list. - -(rsa - (n #00e0ce9..[some bytes not shown]..51#) - (e #010001#) - (d #046129F..[some bytes not shown]..81#) - (p #00e861b..[some bytes not shown]..f1#) - (q #00f7a7c..[some bytes not shown]..61#) - (u #304559a..[some bytes not shown]..9b#) - (protected-at "18950523T000000") -) + ( + ( + (d #046129F..[some bytes not shown]..81#) + (p #00e861b..[some bytes not shown]..f1#) + (q #00f7a7c..[some bytes not shown]..61#) + (u #304559a..[some bytes not shown]..9b#) + ) + (hash sha1 #...[hashvalue]...#) + ) + + For padding reasons, random bytes are appended to this list - they can + easily be stripped by looking for the end of the list. + + The hash is calculated on the concatenation of the public key and + secret key parameter lists: i.e it is required to hash the + concatenation of these 6 canonical encoded lists for RSA, including + the parenthesis, the algorithm keyword and (if used) the protected-at + list. + + (rsa + (n #00e0ce9..[some bytes not shown]..51#) + (e #010001#) + (d #046129F..[some bytes not shown]..81#) + (p #00e861b..[some bytes not shown]..f1#) + (q #00f7a7c..[some bytes not shown]..61#) + (u #304559a..[some bytes not shown]..9b#) + (protected-at "18950523T000000") + ) + + After decryption the hash must be recalculated and compared against + the stored one - If they don't match the integrity of the key is not + given. + +2. openpgp-native + + This is a wrapper around the OpenPGP Private Key Transport format + which resembles the standard OpenPGP format and allows the use of an + existing key without re-encrypting to the default protection format. + + Example: + + (protected openpgp-native + (openpgp-private-key + (version V) + (algo PUBKEYALGO) + (skey _ P1 _ P2 _ P3 ... e PN) + (csum n) + (protection PROTTYPE PROTALGO IV S2KMODE S2KHASH S2KSALT S2KCOUNT))) + + Note that the public key paramaters in SKEY are duplicated and + should be identical to their copies in the standard parameter + elements. Here is an example of an entire protected private key + using this format: + + (protected-private-key + (rsa + (n #00e0ce9..[some bytes not shown]..51#) + (e #010001#) + (protected openpgp-native + (openpgp-private-key + (version 4) + (algo rsa) + (skey _ #00e0ce9..[some bytes not shown]..51# + _ #010001# + e #.........................#) + (protection sha1 aes #aabbccddeeff00112233445566778899# + 3 sha1 #2596f93e85f41e53# 3:190)))) + (uri http://foo.bar x-foo:whatever_you_want) + (comment whatever)) -After decryption the hash must be recalculated and compared against -the stored one - If they don't match the integrity of the key is not -given. Shadowed Private Key Format @@ -184,7 +222,7 @@ This format is used to transfer keys between gpg and gpg-agent. the secrect key parameters are encrypted if the "protection" list is given. To make this more explicit each parameter is preceded by a flag "_" for cleartext or "e" for encrypted text. -* CSUM is the depreciated 16 bit checksum as defined by OpenPGP. This +* CSUM is the deprecated 16 bit checksum as defined by OpenPGP. This is an optional element. * If PROTTYPE is "sha1" the new style SHA1 checksum is used if it is "sum" the old 16 bit checksum (above) is used and if it is "none" no diff --git a/agent/protect-tool.c b/agent/protect-tool.c index d59f5f0..faa0e24 100644 --- a/agent/protect-tool.c +++ b/agent/protect-tool.c @@ -372,7 +372,7 @@ read_and_unprotect (const char *fname) if (!key) return; - rc = agent_unprotect (key, (pw=get_passphrase (1)), + rc = agent_unprotect (NULL, key, (pw=get_passphrase (1)), protected_at, &result, &resultlen); release_passphrase (pw); xfree (key); @@ -728,3 +728,15 @@ release_passphrase (char *pw) xfree (pw); } } + + +/* Stub function. */ +gpg_error_t +convert_from_openpgp_native (gcry_sexp_t s_pgp, const char *passphrase, + unsigned char **r_key) +{ + (void)s_pgp; + (void)passphrase; + (void)r_key; + return gpg_error (GPG_ERR_BUG); +} diff --git a/agent/protect.c b/agent/protect.c index 3e2cbb9..cb2c098 100644 --- a/agent/protect.c +++ b/agent/protect.c @@ -1,6 +1,7 @@ /* protect.c - Un/Protect a secret key * Copyright (C) 1998, 1999, 2000, 2001, 2002, * 2003, 2007, 2009, 2011 Free Software Foundation, Inc. + * Copyright (C) 2013 Werner Koch * * This file is part of GnuPG. * @@ -604,6 +605,7 @@ agent_protect (const unsigned char *plainkey, const char *passphrase, return 0; } + /* Do the actual decryption and check the return list for consistency. */ static int @@ -832,9 +834,10 @@ merge_lists (const unsigned char *protectedkey, /* Unprotect the key encoded in canonical format. We assume a valid S-Exp here. If a protected-at item is available, its value will - be stored at protocted_at unless this is NULL. */ + be stored at protected_at unless this is NULL. */ int -agent_unprotect (const unsigned char *protectedkey, const char *passphrase, +agent_unprotect (ctrl_t ctrl, + const unsigned char *protectedkey, const char *passphrase, gnupg_isotime_t protected_at, unsigned char **result, size_t *resultlen) { @@ -938,7 +941,30 @@ agent_unprotect (const unsigned char *protectedkey, const char *passphrase, if (!n) return gpg_error (GPG_ERR_INV_SEXP); if (!smatch (&s, n, "openpgp-s2k3-sha1-" PROT_CIPHER_STRING "-cbc")) - return gpg_error (GPG_ERR_UNSUPPORTED_PROTECTION); + { + if (smatch (&s, n, "openpgp-native")) + { + gcry_sexp_t s_prot_begin; + + rc = gcry_sexp_sscan (&s_prot_begin, NULL, + prot_begin, + gcry_sexp_canon_len (prot_begin, 0,NULL,NULL)); + if (rc) + return rc; + + rc = convert_from_openpgp_native (ctrl, + s_prot_begin, passphrase, &final); + gcry_sexp_release (s_prot_begin); + if (!rc) + { + *result = final; + *resultlen = gcry_sexp_canon_len (final, 0, NULL, NULL); + } + return rc; + } + else + return gpg_error (GPG_ERR_UNSUPPORTED_PROTECTION); + } if (*s != '(' || s[1] != '(') return gpg_error (GPG_ERR_INV_SEXP); s += 2; diff --git a/agent/t-protect.c b/agent/t-protect.c index 02b614a..9096cb2 100644 --- a/agent/t-protect.c +++ b/agent/t-protect.c @@ -337,3 +337,14 @@ main (int argc, char **argv) return 0; } + +/* Stub function. */ +gpg_error_t +convert_from_openpgp_native (gcry_sexp_t s_pgp, const char *passphrase, + unsigned char **r_key) +{ + (void)s_pgp; + (void)passphrase; + (void)r_key; + return gpg_error (GPG_ERR_BUG); +} diff --git a/g10/call-agent.c b/g10/call-agent.c index cb965e9..17290ec 100644 --- a/g10/call-agent.c +++ b/g10/call-agent.c @@ -1998,7 +1998,7 @@ inq_import_key_parms (void *opaque, const char *line) /* Call the agent to import a key into the agent. */ gpg_error_t agent_import_key (ctrl_t ctrl, const char *desc, char **cache_nonce_addr, - const void *key, size_t keylen) + const void *key, size_t keylen, int unattended) { gpg_error_t err; struct import_key_parm_s parm; @@ -2028,7 +2028,8 @@ agent_import_key (ctrl_t ctrl, const char *desc, char **cache_nonce_addr, parm.key = key; parm.keylen = keylen; - snprintf (line, sizeof line, "IMPORT_KEY%s%s", + snprintf (line, sizeof line, "IMPORT_KEY%s%s%s", + unattended? " --unattended":"", cache_nonce_addr && *cache_nonce_addr? " ":"", cache_nonce_addr && *cache_nonce_addr? *cache_nonce_addr:""); cn_parm.cache_nonce_addr = cache_nonce_addr; diff --git a/g10/call-agent.h b/g10/call-agent.h index ab1d41a..cce8304 100644 --- a/g10/call-agent.h +++ b/g10/call-agent.h @@ -177,7 +177,7 @@ gpg_error_t agent_keywrap_key (ctrl_t ctrl, int forexport, /* Send a key to the agent. */ gpg_error_t agent_import_key (ctrl_t ctrl, const char *desc, char **cache_nonce_addr, - const void *key, size_t keylen); + const void *key, size_t keylen, int unattended); /* Receive a key from the agent. */ gpg_error_t agent_export_key (ctrl_t ctrl, const char *keygrip, diff --git a/g10/import.c b/g10/import.c index a57b32e..3846c21 100644 --- a/g10/import.c +++ b/g10/import.c @@ -1432,7 +1432,7 @@ transfer_secret_keys (ctrl_t ctrl, struct stats_s *stats, kbnode_t sec_keyblock) { char *desc = gpg_format_keydesc (pk, 1, 1); err = agent_import_key (ctrl, desc, &cache_nonce, - wrappedkey, wrappedkeylen); + wrappedkey, wrappedkeylen, opt.batch); xfree (desc); } if (!err) commit cb6a64bb78296c8e9f72df0c482ff847e89a1541 Author: Werner Koch Date: Tue May 21 14:00:00 2013 +0100 New debug functions log_printcanon and log_printsexp. * common/sexputil.c (sexp_to_string, canon_sexp_to_string): New. (log_printcanon, log_printsexp): New. Signed-off-by: Werner Koch diff --git a/common/logging.c b/common/logging.c index cdfd659..73b0dbe 100644 --- a/common/logging.c +++ b/common/logging.c @@ -857,6 +857,19 @@ log_printhex (const char *text, const void *buffer, size_t length) } +/* +void +log_printcanon () {} +is found in sexputils.c +*/ + +/* +void +log_printsexp () {} +is found in sexputils.c +*/ + + void log_clock (const char *string) { diff --git a/common/sexputil.c b/common/sexputil.c index 1c70337..e18756a 100644 --- a/common/sexputil.c +++ b/common/sexputil.c @@ -1,5 +1,6 @@ /* sexputil.c - Utility functions for S-expressions. * Copyright (C) 2005, 2007, 2009 Free Software Foundation, Inc. + * Copyright (C) 2013 Werner Koch * * This file is part of GnuPG. * @@ -46,6 +47,91 @@ #include "sexp-parse.h" +/* Return a malloced string with the S-expression CANON in advanced + format. Returns NULL on error. */ +static char * +sexp_to_string (gcry_sexp_t sexp) +{ + size_t n; + char *result; + + if (!sexp) + return NULL; + n = gcry_sexp_sprint (sexp, GCRYSEXP_FMT_ADVANCED, NULL, 0); + if (!n) + return NULL; + result = xtrymalloc (n); + if (!result) + return NULL; + n = gcry_sexp_sprint (sexp, GCRYSEXP_FMT_ADVANCED, result, n); + if (!n) + BUG (); + + return result; +} + + +/* Return a malloced string with the S-expression CANON in advanced + format. Returns NULL on error. */ +char * +canon_sexp_to_string (const unsigned char *canon, size_t canonlen) +{ + size_t n; + gcry_sexp_t sexp; + char *result; + + n = gcry_sexp_canon_len (canon, canonlen, NULL, NULL); + if (!n) + return NULL; + if (gcry_sexp_sscan (&sexp, NULL, canon, n)) + return NULL; + result = sexp_to_string (sexp); + gcry_sexp_release (sexp); + return result; +} + + +/* Print the canonical encoded S-expression in SEXP in advanced + format. SEXPLEN may be passed as 0 is SEXP is known to be valid. + With TEXT of NULL print just the raw S-expression, with TEXT just + an empty string, print a trailing linefeed, otherwise print an + entire debug line. */ +void +log_printcanon (const char *text, const unsigned char *sexp, size_t sexplen) +{ + if (text && *text) + log_debug ("%s ", text); + if (sexp) + { + char *buf = canon_sexp_to_string (sexp, sexplen); + log_printf ("%s", buf? buf : "[invalid S-expression]"); + xfree (buf); + } + if (text) + log_printf ("\n"); +} + + +/* Print the gcryp S-expression in SEXP in advanced format. With TEXT + of NULL print just the raw S-expression, with TEXT just an empty + string, print a trailing linefeed, otherwise print an entire debug + line. */ +void +log_printsexp (const char *text, gcry_sexp_t sexp) +{ + if (text && *text) + log_debug ("%s ", text); + if (sexp) + { + char *buf = sexp_to_string (sexp); + log_printf ("%s", buf? buf : "[invalid S-expression]"); + xfree (buf); + } + if (text) + log_printf ("\n"); +} + + /* Helper function to create a canonical encoded S-expression from a Libgcrypt S-expression object. The function returns 0 on success and the malloced canonical S-expression is stored at R_BUFFER and diff --git a/common/util.h b/common/util.h index 73ba84e..13b702c 100644 --- a/common/util.h +++ b/common/util.h @@ -167,6 +167,11 @@ gpg_error_t b64dec_finish (struct b64state *state); /*-- sexputil.c */ +char *canon_sexp_to_string (const unsigned char *canon, size_t canonlen); +void log_printcanon (const char *text, + const unsigned char *sexp, size_t sexplen); +void log_printsexp (const char *text, gcry_sexp_t sexp); + gpg_error_t make_canon_sexp (gcry_sexp_t sexp, unsigned char **r_buffer, size_t *r_buflen); gpg_error_t make_canon_sexp_pad (gcry_sexp_t sexp, int secure, commit 0f0e0559f9b160824f10dc17b389268cdb53aea4 Author: Werner Koch Date: Tue May 21 13:00:16 2013 +0100 agent: Fix length detection of canonical formatted openpgp keys. * agent/command.c (cmd_import_key): Pass 0 instead of KEYLEN to gcry_sexp_canon_len. -- We used to pass KEYLEN to the gcry_sexp_canon_len for no good reason: convert_from_openpgp is guaranteed to return a valid canonical S-expression and KEYLEN would thus act only as an upper limit. This is not a problem because usually the original input key is longer than the returned unprotected key. A future patch may change this assertion and thus we better fix this bug now. Signed-off-by: Werner Koch diff --git a/agent/command.c b/agent/command.c index 823b233..e57c69d 100644 --- a/agent/command.c +++ b/agent/command.c @@ -1924,7 +1924,7 @@ cmd_import_key (assuan_context_t ctx, char *line) &key, &passphrase); if (err) goto leave; - realkeylen = gcry_sexp_canon_len (key, keylen, NULL, &err); + realkeylen = gcry_sexp_canon_len (key, 0, NULL, &err); if (!realkeylen) goto leave; /* Invalid canonical encoded S-expression. */ if (passphrase) commit f2d8a14e1b12534eba69d595a62c78f92331e11b Author: Werner Koch Date: Tue May 21 12:10:00 2013 +0100 agent: New option --disable-check-own-socket. * agent/gpg-agent.c (oDisableCheckOwnSocket): New. (disable_check_own_socket): New. (parse_rereadable_options): Set new option. (check_own_socket): Implement new option. Signed-off-by: Werner Koch diff --git a/agent/gpg-agent.c b/agent/gpg-agent.c index 4690114..ff129f9 100644 --- a/agent/gpg-agent.c +++ b/agent/gpg-agent.c @@ -112,6 +112,7 @@ enum cmd_and_opt_values oKeepDISPLAY, oSSHSupport, oDisableScdaemon, + oDisableCheckOwnSocket, oWriteEnvFile }; @@ -148,6 +149,7 @@ static ARGPARSE_OPTS opts[] = { { oScdaemonProgram, "scdaemon-program", 2 , N_("|PGM|use PGM as the SCdaemon program") }, { oDisableScdaemon, "disable-scdaemon", 0, N_("do not use the SCdaemon") }, + { oDisableCheckOwnSocket, "disable-check-own-socket", 0, "@" }, { oFakedSystemTime, "faked-system-time", 2, "@" }, /* (epoch time) */ { oBatch, "batch", 0, "@" }, @@ -232,6 +234,9 @@ static int shutdown_pending; /* Counter for the currently running own socket checks. */ static int check_own_socket_running; +/* Flags to indicate that check_own_socket shall not be called. */ +static int disable_check_own_socket; + /* It is possible that we are currently running under setuid permissions */ static int maybe_setuid = 1; @@ -491,6 +496,7 @@ parse_rereadable_options (ARGPARSE_ARGS *pargs, int reread) opt.ignore_cache_for_signing = 0; opt.allow_mark_trusted = 0; opt.disable_scdaemon = 0; + disable_check_own_socket = 0; return 1; } @@ -521,6 +527,7 @@ parse_rereadable_options (ARGPARSE_ARGS *pargs, int reread) case oPinentryTouchFile: opt.pinentry_touch_file = pargs->r.ret_str; break; case oScdaemonProgram: opt.scdaemon_program = pargs->r.ret_str; break; case oDisableScdaemon: opt.disable_scdaemon = 1; break; + case oDisableCheckOwnSocket: disable_check_own_socket = 1; break; case oDefCacheTTL: opt.def_cache_ttl = pargs->r.ret_ulong; break; case oDefCacheTTLSSH: opt.def_cache_ttl_ssh = pargs->r.ret_ulong; break; @@ -2174,6 +2181,9 @@ check_own_socket (void) npth_attr_t tattr; int err; + if (disable_check_own_socket) + return; + if (!opt.use_standard_socket) return; /* This check makes only sense in standard socket mode. */ diff --git a/doc/gpg-agent.texi b/doc/gpg-agent.texi index dcd96fb..f832b8e 100644 --- a/doc/gpg-agent.texi +++ b/doc/gpg-agent.texi @@ -449,6 +449,16 @@ Do not make use of the scdaemon tool. This option has the effect of disabling the ability to do smartcard operations. Note, that enabling this option at runtime does not kill an already forked scdaemon. + at ifset gpgtwoone + at item --disable-check-own-socket + at opindex disable-check-own-socket + at command{gpg-agent} employs a periodic self-test to detect a stolen +socket. This usually means a second instance of @command{gpg-agent} +has taken over the socket and @command{gpg-agent} will then terminate +itself. This option may be used to disable this self-test for +debugging purposes. + at end ifset + @item --use-standard-socket @itemx --no-use-standard-socket @opindex use-standard-socket @@ -695,14 +705,16 @@ Here is a list of supported signals: @item SIGHUP @cpindex SIGHUP This signal flushes all cached passphrases and if the program has been -started with a configuration file, the configuration file is read again. -Only certain options are honored: @code{quiet}, @code{verbose}, - at code{debug}, @code{debug-all}, @code{debug-level}, @code{no-grab}, - at code{pinentry-program}, @code{default-cache-ttl}, @code{max-cache-ttl}, - at code{ignore-cache-for-signing}, @code{allow-mark-trusted} and - at code{disable-scdaemon}. @code{scdaemon-program} is also supported but -due to the current implementation, which calls the scdaemon only once, -it is not of much use unless you manually kill the scdaemon. +started with a configuration file, the configuration file is read +again. Only certain options are honored: @code{quiet}, + at code{verbose}, @code{debug}, @code{debug-all}, @code{debug-level}, + at code{no-grab}, @code{pinentry-program}, @code{default-cache-ttl}, + at code{max-cache-ttl}, @code{ignore-cache-for-signing}, + at code{allow-mark-trusted}, @code{disable-scdaemon}, and + at code{disable-check-own-socket}. @code{scdaemon-program} is also +supported but due to the current implementation, which calls the +scdaemon only once, it is not of much use unless you manually kill the +scdaemon. @item SIGTERM ----------------------------------------------------------------------- Summary of changes: README | 57 +++++--- agent/agent.h | 3 +- agent/command.c | 24 +++- agent/cvt-openpgp.c | 365 +++++++++++++++++++++++++++++++++++++------------- agent/cvt-openpgp.h | 4 + agent/findkey.c | 9 +- agent/gpg-agent.c | 10 ++ agent/keyformat.txt | 126 +++++++++++------ agent/protect-tool.c | 14 ++- agent/protect.c | 32 ++++- agent/t-protect.c | 11 ++ common/logging.c | 13 ++ common/sexputil.c | 86 ++++++++++++ common/util.h | 5 + doc/gpg-agent.texi | 28 +++- g10/call-agent.c | 5 +- g10/call-agent.h | 2 +- g10/import.c | 2 +- 18 files changed, 613 insertions(+), 183 deletions(-) hooks/post-receive -- The GNU Privacy Guard http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 22 16:56:13 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 22 May 2013 16:56:13 +0200 Subject: [git] GPGME - branch, master, updated. gpgme-1.4.1-11-gd4371ed Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via d4371ed30da2e8b3d9f440613af299a952bde2b1 (commit) via 567e6481d767af60390d649897b897a8b0e7e9a5 (commit) via 0c1de7abd57b677998792e6cd5df5ddfb6e451b7 (commit) via 18254f88f82da7542a986dca60917fb48d5bccd3 (commit) from e99356306d7bda61802530ebeb07d9ba73c4dec0 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit d4371ed30da2e8b3d9f440613af299a952bde2b1 Author: Werner Koch Date: Wed May 22 15:35:12 2013 +0100 Support --no-encrypt-to also with gpgme_op_encrypt_sign. * src/engine-gpg.c (gpg_encrypt_sign): Support the GPGME_ENCRYPT_NO_ENCRYPT_TO flag. diff --git a/src/engine-gpg.c b/src/engine-gpg.c index 65012fa..72d3ad1 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -1716,6 +1716,9 @@ gpg_encrypt_sign (void *engine, gpgme_key_t recp[], if (!err && (flags & GPGME_ENCRYPT_ALWAYS_TRUST)) err = add_arg (gpg, "--always-trust"); + if (!err && (flags & GPGME_ENCRYPT_NO_ENCRYPT_TO)) + err = add_arg (gpg, "--no-encrypt-to"); + if (!err) err = append_args_from_recipients (gpg, recp); } commit 567e6481d767af60390d649897b897a8b0e7e9a5 Author: Werner Koch Date: Wed May 22 15:30:12 2013 +0100 Allow symmetric encryption with gpgme_op_encrypt_sign. * src/encrypt-sign.c (encrypt_sym_status_handler): New. (encrypt_sign_start): Handle recp == NULL case. * src/engine-gpg.c (gpg_encrypt_sign): Implement symmetric encryption. * tests/gpg/t-encrypt-sign.c (main): Add a test case for this. -- Co-authored-by: Kyle L. Huff GnuPG-bug-id: 1440 diff --git a/NEWS b/NEWS index dc67bf7..3a583d3 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,8 @@ Noteworthy changes in version 1.4.2 (unreleased) ------------------------------------------------ + * Allow symmetric encryption with gpgme_op_encrypt_sign. + * Interface changes relative to the 1.4.1 release: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ gpgme_off_t NEW. diff --git a/src/encrypt-sign.c b/src/encrypt-sign.c index cb0ea61..4f484e9 100644 --- a/src/encrypt-sign.c +++ b/src/encrypt-sign.c @@ -47,19 +47,38 @@ encrypt_sign_status_handler (void *priv, gpgme_status_code_t code, char *args) static gpgme_error_t +encrypt_sym_status_handler (void *priv, gpgme_status_code_t code, char *args) +{ + gpgme_error_t err; + + err = _gpgme_progress_status_handler (priv, code, args); + if (!err) + err = _gpgme_sign_status_handler (priv, code, args); + if (!err) + err = _gpgme_passphrase_status_handler (priv, code, args); + return err; +} + + +static gpgme_error_t encrypt_sign_start (gpgme_ctx_t ctx, int synchronous, gpgme_key_t recp[], gpgme_encrypt_flags_t flags, gpgme_data_t plain, gpgme_data_t cipher) { gpgme_error_t err; + int symmetric; err = _gpgme_op_reset (ctx, synchronous); if (err) return err; + symmetric = !recp; + if (!plain) return gpg_error (GPG_ERR_NO_DATA); - if (!cipher || !recp) + if (!cipher) + return gpg_error (GPG_ERR_INV_VALUE); + if (recp && !*recp) return gpg_error (GPG_ERR_INV_VALUE); err = _gpgme_op_encrypt_init_result (ctx); @@ -79,7 +98,10 @@ encrypt_sign_start (gpgme_ctx_t ctx, int synchronous, gpgme_key_t recp[], } _gpgme_engine_set_status_handler (ctx->engine, - encrypt_sign_status_handler, ctx); + symmetric + ? encrypt_sym_status_handler + : encrypt_sign_status_handler, + ctx); return _gpgme_engine_op_encrypt_sign (ctx->engine, recp, flags, plain, cipher, ctx->use_armor, diff --git a/src/engine-gpg.c b/src/engine-gpg.c index 3f02503..65012fa 100644 --- a/src/engine-gpg.c +++ b/src/engine-gpg.c @@ -1700,23 +1700,29 @@ gpg_encrypt_sign (void *engine, gpgme_key_t recp[], { engine_gpg_t gpg = engine; gpgme_error_t err; + int symmetric = !recp; + + err = add_arg (gpg, symmetric ? "--symmetric" : "--encrypt"); - err = add_arg (gpg, "--encrypt"); if (!err) err = add_arg (gpg, "--sign"); if (!err && use_armor) err = add_arg (gpg, "--armor"); - /* If we know that all recipients are valid (full or ultimate trust) - we can suppress further checks. */ - if (!err && (flags & GPGME_ENCRYPT_ALWAYS_TRUST)) - err = add_arg (gpg, "--always-trust"); + if (!symmetric) + { + /* If we know that all recipients are valid (full or ultimate trust) + we can suppress further checks. */ + if (!err && (flags & GPGME_ENCRYPT_ALWAYS_TRUST)) + err = add_arg (gpg, "--always-trust"); - if (!err) - err = append_args_from_recipients (gpg, recp); + if (!err) + err = append_args_from_recipients (gpg, recp); + } if (!err) err = append_args_from_signers (gpg, ctx); + if (!err) err = append_args_from_sig_notations (gpg, ctx); diff --git a/tests/gpg/t-encrypt-sign.c b/tests/gpg/t-encrypt-sign.c index 9d00340..1e1262f 100644 --- a/tests/gpg/t-encrypt-sign.c +++ b/tests/gpg/t-encrypt-sign.c @@ -3,17 +3,17 @@ Copyright (C) 2001, 2002, 2003, 2004 g10 Code GmbH This file is part of GPGME. - + GPGME is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. - + GPGME is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. - + You should have received a copy of the GNU Lesser General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA @@ -83,7 +83,7 @@ check_result (gpgme_sign_result_t result, gpgme_sig_mode_t type) } -int +int main (int argc, char **argv) { gpgme_ctx_t ctx; @@ -95,7 +95,7 @@ main (int argc, char **argv) char *agent_info; init_gpgme (GPGME_PROTOCOL_OpenPGP); - + err = gpgme_new (&ctx); fail_if_err (err); gpgme_set_textmode (ctx, 1); @@ -135,6 +135,24 @@ main (int argc, char **argv) gpgme_key_unref (key[1]); gpgme_data_release (in); gpgme_data_release (out); + + /* Now a second time using symmetric encryption. */ + err = gpgme_data_new_from_mem (&in, "Hallo Leute\n", 12, 0); + fail_if_err (err); + + err = gpgme_data_new (&out); + fail_if_err (err); + + err = gpgme_op_encrypt_sign (ctx, NULL, GPGME_ENCRYPT_ALWAYS_TRUST, in, out); + fail_if_err (err); + sign_result = gpgme_op_sign_result (ctx); + check_result (sign_result, GPGME_SIG_MODE_NORMAL); + print_data (out); + + gpgme_data_release (in); + gpgme_data_release (out); + + gpgme_release (ctx); return 0; } commit 0c1de7abd57b677998792e6cd5df5ddfb6e451b7 Author: Werner Koch Date: Wed May 22 09:50:12 2013 +0100 gpgme-tool: Allow for symmetric encryption. * src/gpgme-tool.c (gt_sign_encrypt): Pass NULL for recp if no recipients are given. diff --git a/src/gpgme-tool.c b/src/gpgme-tool.c index bce52b8..0ebabab 100644 --- a/src/gpgme-tool.c +++ b/src/gpgme-tool.c @@ -1911,11 +1911,14 @@ gt_sign_encrypt (gpgme_tool_t gt, gpgme_encrypt_flags_t flags, gpgme_data_t plain, gpgme_data_t cipher, int sign) { gpg_error_t err; + gpgme_key_t *recp; + + recp = gt->recipients_nr? gt->recipients : NULL; if (sign) - err = gpgme_op_encrypt_sign (gt->ctx, gt->recipients, flags, plain, cipher); + err = gpgme_op_encrypt_sign (gt->ctx, recp, flags, plain, cipher); else - err = gpgme_op_encrypt (gt->ctx, gt->recipients, flags, plain, cipher); + err = gpgme_op_encrypt (gt->ctx, recp, flags, plain, cipher); gt_recipients_clear (gt); commit 18254f88f82da7542a986dca60917fb48d5bccd3 Author: Werner Koch Date: Wed May 22 09:50:12 2013 +0100 tests: Print auditlog in plain text format. * tests/gpgsm/t-verify.c (show_auditlog): Use plain text format. -- The HTML output is not very helpful on the console and a pain to the eyes. diff --git a/tests/gpgsm/t-verify.c b/tests/gpgsm/t-verify.c index 062c5a1..a26617e 100644 --- a/tests/gpgsm/t-verify.c +++ b/tests/gpgsm/t-verify.c @@ -118,7 +118,7 @@ show_auditlog (gpgme_ctx_t ctx) err = gpgme_data_new (&data); fail_if_err (err); - err = gpgme_op_getauditlog (ctx, data, GPGME_AUDITLOG_HTML); + err = gpgme_op_getauditlog (ctx, data, 0); if (err) { fprintf (stderr, "%s:%i: Can't get audit log: %s\n", ----------------------------------------------------------------------- Summary of changes: NEWS | 2 ++ src/encrypt-sign.c | 26 ++++++++++++++++++++++++-- src/engine-gpg.c | 23 ++++++++++++++++------- src/gpgme-tool.c | 7 +++++-- tests/gpg/t-encrypt-sign.c | 28 +++++++++++++++++++++++----- tests/gpgsm/t-verify.c | 2 +- 6 files changed, 71 insertions(+), 17 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 22 18:11:08 2013 From: cvs at cvs.gnupg.org (by Jussi Kivilinna) Date: Wed, 22 May 2013 18:11:08 +0200 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.5.0-131-gb65281a Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via b65281a1b76d7898eb7607932246b78277d8570b (commit) via 3637bdbb5f30a5e06745d448a6a8ad00e5cdd740 (commit) via eed4042fa028b3f73bad6a768f5b0a82f642e545 (commit) via f2986f03d1ae59f973bae56ce4333e5457003de5 (commit) via 194ae35da7830a76b96e9b21121a2e1248762d3f (commit) from 2ac3a7c2b7154379738d17cfde8cd9017dc142f0 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit b65281a1b76d7898eb7607932246b78277d8570b Author: Jussi Kivilinna Date: Wed May 22 14:11:10 2013 +0300 Add AES bulk CBC decryption selftest * cipher/rinjdael.c (selftest_cbc_128): New. (selftest): Call selftest_cbc_128. -- Signed-off-by: Jussi Kivilinna diff --git a/cipher/rijndael.c b/cipher/rijndael.c index 6b16ce8..4c81688 100644 --- a/cipher/rijndael.c +++ b/cipher/rijndael.c @@ -2020,6 +2020,21 @@ selftest_ctr_128 (void) } +/* Run the self-tests for AES-CBC-128, tests bulk CBC decryption. + Returns NULL on success. */ +static const char* +selftest_cbc_128 (void) +{ + const int nblocks = 8+2; + const int blocksize = BLOCKSIZE; + const int context_size = sizeof(RIJNDAEL_context); + + return _gcry_selftest_helper_cbc_128("AES", &rijndael_setkey, + &rijndael_encrypt, &_gcry_aes_cbc_dec, nblocks, blocksize, + context_size); +} + + /* Run all the self-tests and return NULL on success. This function is used for the on-the-fly self-tests. */ static const char * @@ -2035,6 +2050,9 @@ selftest (void) if ( (r = selftest_ctr_128 ()) ) return r; + if ( (r = selftest_cbc_128 ()) ) + return r; + return r; } commit 3637bdbb5f30a5e06745d448a6a8ad00e5cdd740 Author: Jussi Kivilinna Date: Wed May 22 14:11:04 2013 +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 diff --git a/cipher/rijndael.c b/cipher/rijndael.c index 8d4036b..6b16ce8 100644 --- a/cipher/rijndael.c +++ b/cipher/rijndael.c @@ -46,6 +46,7 @@ #include "g10lib.h" #include "cipher.h" #include "bufhelp.h" +#include "cipher-selftest.h" #define MAXKC (256/32) #define MAXROUNDS 14 @@ -2009,93 +2010,13 @@ selftest_basic_256 (void) static const char* selftest_ctr_128 (void) { - RIJNDAEL_context ctx ATTR_ALIGNED_16; - unsigned char plaintext[7*16] ATTR_ALIGNED_16; - unsigned char ciphertext[7*16] ATTR_ALIGNED_16; - unsigned char plaintext2[7*16] ATTR_ALIGNED_16; - unsigned char iv[16] ATTR_ALIGNED_16; - unsigned char iv2[16] ATTR_ALIGNED_16; - int i, j, diff; - - static const unsigned char key[16] ATTR_ALIGNED_16 = { - 0x06,0x9A,0x00,0x7F,0xC7,0x6A,0x45,0x9F, - 0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x21 - }; - static char error_str[128]; - - rijndael_setkey (&ctx, key, sizeof (key)); - - /* Test single block code path */ - memset(iv, 0xff, sizeof(iv)); - for (i = 0; i < 16; i++) - plaintext[i] = i; - - /* CTR manually. */ - rijndael_encrypt (&ctx, ciphertext, iv); - for (i = 0; i < 16; i++) - ciphertext[i] ^= plaintext[i]; - for (i = 16; i > 0; i--) - { - iv[i-1]++; - if (iv[i-1]) - break; - } - - memset(iv2, 0xff, sizeof(iv2)); - _gcry_aes_ctr_enc (&ctx, iv2, plaintext2, ciphertext, 1); - - if (memcmp(plaintext2, plaintext, 16)) - return "AES-128-CTR test failed (plaintext mismatch)"; - - if (memcmp(iv2, iv, 16)) - return "AES-128-CTR test failed (IV mismatch)"; - - /* Test parallelized code paths */ - for (diff = 0; diff < 7; diff++) { - memset(iv, 0xff, sizeof(iv)); - iv[15] -= diff; - - for (i = 0; i < sizeof(plaintext); i++) - plaintext[i] = i; + const int nblocks = 8+1; + const int blocksize = BLOCKSIZE; + const int context_size = sizeof(RIJNDAEL_context); - /* Create CTR ciphertext manually. */ - for (i = 0; i < sizeof(plaintext); i+=16) - { - rijndael_encrypt (&ctx, &ciphertext[i], iv); - for (j = 0; j < 16; j++) - ciphertext[i+j] ^= plaintext[i+j]; - for (j = 16; j > 0; j--) - { - iv[j-1]++; - if (iv[j-1]) - break; - } - } - - /* Decrypt using bulk CTR and compare result. */ - memset(iv2, 0xff, sizeof(iv2)); - iv2[15] -= diff; - - _gcry_aes_ctr_enc (&ctx, iv2, plaintext2, ciphertext, - sizeof(ciphertext) / BLOCKSIZE); - - if (memcmp(plaintext2, plaintext, sizeof(plaintext))) - { - snprintf(error_str, sizeof(error_str), - "AES-128-CTR test failed (plaintext mismatch, diff: %d)", - diff); - return error_str; - } - if (memcmp(iv2, iv, sizeof(iv))) - { - snprintf(error_str, sizeof(error_str), - "AES-128-CTR test failed (IV mismatch, diff: %d)", - diff); - return error_str; - } - } - - return NULL; + return _gcry_selftest_helper_ctr_128("AES", &rijndael_setkey, + &rijndael_encrypt, &_gcry_aes_ctr_enc, nblocks, blocksize, + context_size); } commit eed4042fa028b3f73bad6a768f5b0a82f642e545 Author: Jussi Kivilinna Date: Wed May 22 14:10:59 2013 +0300 Convert bulk CTR and CBC selftest functions in Camellia to generic selftest helper functions * cipher/Makefile.am (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 diff --git a/cipher/Makefile.am b/cipher/Makefile.am index 00e4429..0808bd2 100644 --- a/cipher/Makefile.am +++ b/cipher/Makefile.am @@ -40,6 +40,7 @@ libcipher_la_LIBADD = $(GCRYPT_MODULES) libcipher_la_SOURCES = \ cipher.c cipher-internal.h \ cipher-cbc.c cipher-cfb.c cipher-ofb.c cipher-ctr.c cipher-aeswrap.c \ +cipher-selftest.c cipher-selftest.h \ pubkey.c pubkey-internal.h \ md.c \ kdf.c kdf-internal.h \ diff --git a/cipher/camellia-glue.c b/cipher/camellia-glue.c index e9e2bf2..4c724a9 100644 --- a/cipher/camellia-glue.c +++ b/cipher/camellia-glue.c @@ -63,6 +63,7 @@ #include "cipher.h" #include "camellia.h" #include "bufhelp.h" +#include "cipher-selftest.h" /* Helper macro to force alignment to 16 bytes. */ #ifdef HAVE_GCC_ATTRIBUTE_ALIGNED @@ -313,93 +314,12 @@ static const char* selftest_ctr_128 (void) { const int nblocks = 16+1; - CAMELLIA_context ctx ATTR_ALIGNED_16; - unsigned char plaintext[nblocks*16] ATTR_ALIGNED_16; - unsigned char ciphertext[nblocks*16] ATTR_ALIGNED_16; - unsigned char plaintext2[nblocks*16] ATTR_ALIGNED_16; - unsigned char iv[16] ATTR_ALIGNED_16; - unsigned char iv2[16] ATTR_ALIGNED_16; - int i, j, diff; - - static const unsigned char key[16] ATTR_ALIGNED_16 = { - 0x06,0x9A,0x00,0x7F,0xC7,0x6A,0x45,0x9F, - 0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x21 - }; - static char error_str[128]; - - camellia_setkey (&ctx, key, sizeof (key)); - - /* Test single block code path */ - memset(iv, 0xff, sizeof(iv)); - for (i = 0; i < 16; i++) - plaintext[i] = i; - - /* CTR manually. */ - camellia_encrypt (&ctx, ciphertext, iv); - for (i = 0; i < 16; i++) - ciphertext[i] ^= plaintext[i]; - for (i = 16; i > 0; i--) - { - iv[i-1]++; - if (iv[i-1]) - break; - } - - memset(iv2, 0xff, sizeof(iv2)); - _gcry_camellia_ctr_enc (&ctx, iv2, plaintext2, ciphertext, 1); - - if (memcmp(plaintext2, plaintext, 16)) - return "CAMELLIA-128-CTR test failed (plaintext mismatch)"; - - if (memcmp(iv2, iv, 16)) - return "CAMELLIA-128-CTR test failed (IV mismatch)"; - - /* Test parallelized code paths */ - for (diff = 0; diff < nblocks; diff++) { - memset(iv, 0xff, sizeof(iv)); - iv[15] -= diff; - - for (i = 0; i < sizeof(plaintext); i++) - plaintext[i] = i; - - /* Create CTR ciphertext manually. */ - for (i = 0; i < sizeof(plaintext); i+=16) - { - camellia_encrypt (&ctx, &ciphertext[i], iv); - for (j = 0; j < 16; j++) - ciphertext[i+j] ^= plaintext[i+j]; - for (j = 16; j > 0; j--) - { - iv[j-1]++; - if (iv[j-1]) - break; - } - } - - /* Decrypt using bulk CTR and compare result. */ - memset(iv2, 0xff, sizeof(iv2)); - iv2[15] -= diff; - - _gcry_camellia_ctr_enc (&ctx, iv2, plaintext2, ciphertext, - sizeof(ciphertext) / CAMELLIA_BLOCK_SIZE); - - if (memcmp(plaintext2, plaintext, sizeof(plaintext))) - { - snprintf(error_str, sizeof(error_str), - "CAMELLIA-128-CTR test failed (plaintext mismatch, diff: %d)", - diff); - return error_str; - } - if (memcmp(iv2, iv, sizeof(iv))) - { - snprintf(error_str, sizeof(error_str), - "CAMELLIA-128-CTR test failed (IV mismatch, diff: %d)", - diff); - return error_str; - } - } + const int blocksize = CAMELLIA_BLOCK_SIZE; + const int context_size = sizeof(CAMELLIA_context); - return NULL; + return _gcry_selftest_helper_ctr_128("CAMELLIA", &camellia_setkey, + &camellia_encrypt, &_gcry_camellia_ctr_enc, nblocks, blocksize, + context_size); } /* Run the self-tests for CAMELLIA-CBC-128, tests bulk CBC decryption. @@ -408,78 +328,12 @@ static const char* selftest_cbc_128 (void) { const int nblocks = 16+2; - CAMELLIA_context ctx ATTR_ALIGNED_16; - unsigned char plaintext[nblocks*16] ATTR_ALIGNED_16; - unsigned char ciphertext[nblocks*16] ATTR_ALIGNED_16; - unsigned char plaintext2[nblocks*16] ATTR_ALIGNED_16; - unsigned char iv[16] ATTR_ALIGNED_16; - unsigned char iv2[16] ATTR_ALIGNED_16; - int i, j; - - static const unsigned char key[16] ATTR_ALIGNED_16 = { - 0x66,0x9A,0x00,0x7F,0xC7,0x6A,0x45,0x9F, - 0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x22 - }; - static char error_str[128]; - - camellia_setkey (&ctx, key, sizeof (key)); - - /* Test single block code path */ - memset(iv, 0x4e, sizeof(iv)); - memset(iv2, 0x4e, sizeof(iv2)); - for (i = 0; i < 16; i++) - plaintext[i] = i; - - /* CBC manually. */ - for (i = 0; i < 16; i++) - ciphertext[i] = iv[i] ^ plaintext[i]; - camellia_encrypt (&ctx, ciphertext, ciphertext); - memcpy(iv, ciphertext, sizeof(iv)); - - /* CBC decrypt. */ - _gcry_camellia_cbc_dec (&ctx, iv2, plaintext2, ciphertext, 1); - - if (memcmp(plaintext2, plaintext, 16)) - return "CAMELLIA-128-CBC test failed (plaintext mismatch)"; + const int blocksize = CAMELLIA_BLOCK_SIZE; + const int context_size = sizeof(CAMELLIA_context); - if (memcmp(iv2, iv, 16)) - return "CAMELLIA-128-CBC test failed (IV mismatch)"; - - /* Test parallelized code paths */ - memset(iv, 0x5f, sizeof(iv)); - memset(iv2, 0x5f, sizeof(iv2)); - - for (i = 0; i < sizeof(plaintext); i++) - plaintext[i] = i; - - /* Create CBC ciphertext manually. */ - for (i = 0; i < sizeof(plaintext); i+=16) - { - for (j = 0; j < 16; j++) - ciphertext[i+j] = iv[j] ^ plaintext[i+j]; - camellia_encrypt (&ctx, &ciphertext[i], &ciphertext[i]); - memcpy(iv, &ciphertext[i], sizeof(iv)); - } - - /* Decrypt using bulk CBC and compare result. */ - _gcry_camellia_cbc_dec (&ctx, iv2, plaintext2, ciphertext, - sizeof(ciphertext) / CAMELLIA_BLOCK_SIZE); - - if (memcmp(plaintext2, plaintext, sizeof(plaintext))) - { - snprintf(error_str, sizeof(error_str), - "CAMELLIA-128-CBC test failed (plaintext mismatch, " - "parallel path)"); - return error_str; - } - if (memcmp(iv2, iv, sizeof(iv))) - { - snprintf(error_str, sizeof(error_str), - "CAMELLIA-128-CBC test failed (IV mismatch, parallel path)"); - return error_str; - } - - return NULL; + return _gcry_selftest_helper_cbc_128("CAMELLIA", &camellia_setkey, + &camellia_encrypt, &_gcry_camellia_cbc_dec, nblocks, blocksize, + context_size); } static const char * diff --git a/cipher/cipher-selftest.c b/cipher/cipher-selftest.c new file mode 100644 index 0000000..50c7752 --- /dev/null +++ b/cipher/cipher-selftest.c @@ -0,0 +1,291 @@ +/* cipher-selftest.c - Helper functions for bulk encryption selftests. + * Copyright ? 2013 Jussi Kivilinna + * + * This file is part of Libgcrypt. + * + * Libgcrypt is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser general Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * Libgcrypt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include +#ifdef HAVE_SYSLOG +# include +#endif /*HAVE_SYSLOG*/ + +#include "types.h" +#include "g10lib.h" +#include "cipher.h" +#include "bufhelp.h" +#include "cipher-selftest.h" + +#ifdef HAVE_STDINT_H +# include /* uintptr_t */ +#elif defined(HAVE_INTTYPES_H) +# include +#else +/* In this case, uintptr_t is provided by config.h. */ +#endif + +/* Helper macro to force alignment to 16 bytes. */ +#ifdef HAVE_GCC_ATTRIBUTE_ALIGNED +# define ATTR_ALIGNED_16 __attribute__ ((aligned (16))) +#else +# define ATTR_ALIGNED_16 +#endif + + +/* Run the self-tests for -CBC-128, tests bulk CBC + decryption. Returns NULL on success. */ +const char * +_gcry_selftest_helper_cbc_128 (const char *cipher, gcry_cipher_setkey_t setkey, + gcry_cipher_encrypt_t encrypt_one, + gcry_cipher_bulk_cbc_dec_t bulk_cbc_dec, + const int nblocks, const int blocksize, + const int context_size) +{ + int i, offs; + unsigned char *ctx, *plaintext, *plaintext2, *ciphertext, *iv, *iv2, *mem; + unsigned int ctx_aligned_size, memsize; + + static const unsigned char key[16] ATTR_ALIGNED_16 = { + 0x66,0x9A,0x00,0x7F,0xC7,0x6A,0x45,0x9F, + 0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x22 + }; + + /* Allocate buffers, align elements to 16 bytes. */ + ctx_aligned_size = context_size + 15; + ctx_aligned_size -= ctx_aligned_size & 0xf; + + memsize = ctx_aligned_size + (blocksize * 2) + (blocksize * nblocks * 3) + 16; + + mem = gcry_calloc (1, memsize); + if (!mem) + return "failed to allocate memory"; + + offs = (16 - ((uintptr_t)mem & 15)) & 15; + ctx = (void*)(mem + offs); + iv = ctx + ctx_aligned_size; + iv2 = iv + blocksize; + plaintext = iv2 + blocksize; + plaintext2 = plaintext + nblocks * blocksize; + ciphertext = plaintext2 + nblocks * blocksize; + + /* Initialize ctx */ + setkey (ctx, key, sizeof(key)); + + /* Test single block code path */ + memset (iv, 0x4e, blocksize); + memset (iv2, 0x4e, blocksize); + for (i = 0; i < blocksize; i++) + plaintext[i] = i; + + /* CBC manually. */ + buf_xor (ciphertext, iv, plaintext, blocksize); + encrypt_one (ctx, ciphertext, ciphertext); + memcpy (iv, ciphertext, blocksize); + + /* CBC decrypt. */ + bulk_cbc_dec (ctx, iv2, plaintext2, ciphertext, 1); + if (memcmp (plaintext2, plaintext, 16)) + { + gcry_free (mem); +#ifdef HAVE_SYSLOG + syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " + "%s-128-CBC test failed (plaintext mismatch)", cipher); +#endif + return "selftest for 128 bit CBC failed - see syslog for details"; + } + + if (memcmp (iv2, iv, 16)) + { + gcry_free (mem); +#ifdef HAVE_SYSLOG + syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " + "%s-128-CBC test failed (IV mismatch)", cipher); +#endif + return "selftest for 128 bit CBC failed - see syslog for details"; + } + + /* Test parallelized code paths */ + memset (iv, 0x5f, blocksize); + memset (iv2, 0x5f, blocksize); + + for (i = 0; i < nblocks * blocksize; i++) + plaintext[i] = i; + + /* Create CBC ciphertext manually. */ + for (i = 0; i < nblocks * blocksize; i+=blocksize) + { + buf_xor (&ciphertext[i], iv, &plaintext[i], blocksize); + encrypt_one (ctx, &ciphertext[i], &ciphertext[i]); + memcpy (iv, &ciphertext[i], blocksize); + } + + /* Decrypt using bulk CBC and compare result. */ + bulk_cbc_dec (ctx, iv2, plaintext2, ciphertext, nblocks); + + if (memcmp (plaintext2, plaintext, nblocks * blocksize)) + { + gcry_free (mem); +#ifdef HAVE_SYSLOG + syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " + "%s-128-CBC test failed (plaintext mismatch, parallel path)", + cipher); +#endif + return "selftest for 128 bit CBC failed - see syslog for details"; + } + if (memcmp (iv2, iv, blocksize)) + { + gcry_free (mem); +#ifdef HAVE_SYSLOG + syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " + "%s-128-CBC test failed (IV mismatch, parallel path)", + cipher); +#endif + return "selftest for 128 bit CBC failed - see syslog for details"; + } + + gcry_free (mem); + return NULL; +} + +/* Run the self-tests for -CTR-128, tests IV increment of bulk CTR + encryption. Returns NULL on success. */ +const char * +_gcry_selftest_helper_ctr_128 (const char *cipher, gcry_cipher_setkey_t setkey, + gcry_cipher_encrypt_t encrypt_one, + gcry_cipher_bulk_ctr_enc_t bulk_ctr_enc, + const int nblocks, const int blocksize, + const int context_size) +{ + int i, j, offs, diff; + unsigned char *ctx, *plaintext, *plaintext2, *ciphertext, *iv, *iv2, *mem; + unsigned int ctx_aligned_size, memsize; + + static const unsigned char key[16] ATTR_ALIGNED_16 = { + 0x06,0x9A,0x00,0x7F,0xC7,0x6A,0x45,0x9F, + 0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x21 + }; + + /* Allocate buffers, align elements to 16 bytes. */ + ctx_aligned_size = context_size + 15; + ctx_aligned_size -= ctx_aligned_size & 0xf; + + memsize = ctx_aligned_size + (blocksize * 2) + (blocksize * nblocks * 3) + 16; + + mem = gcry_calloc (1, memsize); + if (!mem) + return "failed to allocate memory"; + + offs = (16 - ((uintptr_t)mem & 15)) & 15; + ctx = (void*)(mem + offs); + iv = ctx + ctx_aligned_size; + iv2 = iv + blocksize; + plaintext = iv2 + blocksize; + plaintext2 = plaintext + nblocks * blocksize; + ciphertext = plaintext2 + nblocks * blocksize; + + /* Initialize ctx */ + setkey (ctx, key, sizeof(key)); + + /* Test single block code path */ + memset (iv, 0xff, blocksize); + for (i = 0; i < blocksize; i++) + plaintext[i] = i; + + /* CTR manually. */ + encrypt_one (ctx, ciphertext, iv); + for (i = 0; i < blocksize; i++) + ciphertext[i] ^= plaintext[i]; + for (i = blocksize; i > 0; i--) + { + iv[i-1]++; + if (iv[i-1]) + break; + } + + memset (iv2, 0xff, blocksize); + bulk_ctr_enc (ctx, iv2, plaintext2, ciphertext, 1); + + if (memcmp (plaintext2, plaintext, blocksize)) + { + gcry_free (mem); +#ifdef HAVE_SYSLOG + syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " + "%s-128-CTR test failed (plaintext mismatch)", cipher); +#endif + return "selftest for 128 bit CTR failed - see syslog for details"; + } + + if (memcmp (iv2, iv, blocksize)) + { + gcry_free (mem); +#ifdef HAVE_SYSLOG + syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " + "%s-128-CTR test failed (IV mismatch)", cipher); +#endif + return "selftest for 128 bit CTR failed - see syslog for details"; + } + + /* Test parallelized code paths */ + for (diff = 0; diff < nblocks; diff++) { + memset(iv, 0xff, blocksize); + iv[blocksize-1] -= diff; + + for (i = 0; i < blocksize * nblocks; i++) + plaintext[i] = i; + + /* Create CTR ciphertext manually. */ + for (i = 0; i < blocksize * nblocks; i+=blocksize) + { + encrypt_one (ctx, &ciphertext[i], iv); + for (j = 0; j < blocksize; j++) + ciphertext[i+j] ^= plaintext[i+j]; + for (j = blocksize; j > 0; j--) + { + iv[j-1]++; + if (iv[j-1]) + break; + } + } + + /* Decrypt using bulk CTR and compare result. */ + memset(iv2, 0xff, blocksize); + iv2[blocksize-1] -= diff; + + bulk_ctr_enc (ctx, iv2, plaintext2, ciphertext, nblocks); + + if (memcmp (plaintext2, plaintext, blocksize * nblocks)) + { + gcry_free (mem); +#ifdef HAVE_SYSLOG + syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " + "%s-128-CTR test failed (plaintext mismatch, diff: %d)", cipher, + diff); +#endif + return "selftest for 128 bit CTR failed - see syslog for details"; + } + if (memcmp(iv2, iv, blocksize)) + { + gcry_free (mem); +#ifdef HAVE_SYSLOG + syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " + "%s-128-CTR test failed (IV mismatch, diff: %d)", cipher, diff); +#endif + return "selftest for 128 bit CTR failed - see syslog for details"; + } + } + + gcry_free (mem); + return NULL; +} diff --git a/cipher/cipher-selftest.h b/cipher/cipher-selftest.h new file mode 100644 index 0000000..89d79c2 --- /dev/null +++ b/cipher/cipher-selftest.h @@ -0,0 +1,54 @@ +/* cipher-selftest.h - Helper functions for bulk encryption selftests. + * Copyright ? 2013 Jussi Kivilinna + * + * This file is part of Libgcrypt. + * + * Libgcrypt is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser general Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * Libgcrypt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifndef G10_SELFTEST_HELP_H +#define G10_SELFTEST_HELP_H + +#include +#include "types.h" +#include "g10lib.h" +#include "cipher.h" + +typedef void (*gcry_cipher_bulk_cbc_dec_t)(void *context, unsigned char *iv, + void *outbuf_arg, + const void *inbuf_arg, + unsigned int nblocks); + +typedef void (*gcry_cipher_bulk_ctr_enc_t)(void *context, unsigned char *iv, + void *outbuf_arg, + const void *inbuf_arg, + unsigned int nblocks); + +/* Helper function for bulk CBC decryption selftest */ +const char * +_gcry_selftest_helper_cbc_128 (const char *cipher, gcry_cipher_setkey_t setkey, + gcry_cipher_encrypt_t encrypt_one, + gcry_cipher_bulk_cbc_dec_t bulk_cbc_dec, + const int nblocks, const int blocksize, + const int context_size); + +/* Helper function for bulk CTR encryption selftest */ +const char * +_gcry_selftest_helper_ctr_128 (const char *cipher, gcry_cipher_setkey_t setkey, + gcry_cipher_encrypt_t encrypt_one, + gcry_cipher_bulk_ctr_enc_t bulk_ctr_enc, + const int nblocks, const int blocksize, + const int context_size); + +#endif /*G10_SELFTEST_HELP_H*/ commit f2986f03d1ae59f973bae56ce4333e5457003de5 Author: Jussi Kivilinna Date: Wed May 22 14:10:54 2013 +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 diff --git a/cipher/camellia-glue.c b/cipher/camellia-glue.c index dd9206f..e9e2bf2 100644 --- a/cipher/camellia-glue.c +++ b/cipher/camellia-glue.c @@ -402,6 +402,86 @@ selftest_ctr_128 (void) return NULL; } +/* Run the self-tests for CAMELLIA-CBC-128, tests bulk CBC decryption. + Returns NULL on success. */ +static const char* +selftest_cbc_128 (void) +{ + const int nblocks = 16+2; + CAMELLIA_context ctx ATTR_ALIGNED_16; + unsigned char plaintext[nblocks*16] ATTR_ALIGNED_16; + unsigned char ciphertext[nblocks*16] ATTR_ALIGNED_16; + unsigned char plaintext2[nblocks*16] ATTR_ALIGNED_16; + unsigned char iv[16] ATTR_ALIGNED_16; + unsigned char iv2[16] ATTR_ALIGNED_16; + int i, j; + + static const unsigned char key[16] ATTR_ALIGNED_16 = { + 0x66,0x9A,0x00,0x7F,0xC7,0x6A,0x45,0x9F, + 0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x22 + }; + static char error_str[128]; + + camellia_setkey (&ctx, key, sizeof (key)); + + /* Test single block code path */ + memset(iv, 0x4e, sizeof(iv)); + memset(iv2, 0x4e, sizeof(iv2)); + for (i = 0; i < 16; i++) + plaintext[i] = i; + + /* CBC manually. */ + for (i = 0; i < 16; i++) + ciphertext[i] = iv[i] ^ plaintext[i]; + camellia_encrypt (&ctx, ciphertext, ciphertext); + memcpy(iv, ciphertext, sizeof(iv)); + + /* CBC decrypt. */ + _gcry_camellia_cbc_dec (&ctx, iv2, plaintext2, ciphertext, 1); + + if (memcmp(plaintext2, plaintext, 16)) + return "CAMELLIA-128-CBC test failed (plaintext mismatch)"; + + if (memcmp(iv2, iv, 16)) + return "CAMELLIA-128-CBC test failed (IV mismatch)"; + + /* Test parallelized code paths */ + memset(iv, 0x5f, sizeof(iv)); + memset(iv2, 0x5f, sizeof(iv2)); + + for (i = 0; i < sizeof(plaintext); i++) + plaintext[i] = i; + + /* Create CBC ciphertext manually. */ + for (i = 0; i < sizeof(plaintext); i+=16) + { + for (j = 0; j < 16; j++) + ciphertext[i+j] = iv[j] ^ plaintext[i+j]; + camellia_encrypt (&ctx, &ciphertext[i], &ciphertext[i]); + memcpy(iv, &ciphertext[i], sizeof(iv)); + } + + /* Decrypt using bulk CBC and compare result. */ + _gcry_camellia_cbc_dec (&ctx, iv2, plaintext2, ciphertext, + sizeof(ciphertext) / CAMELLIA_BLOCK_SIZE); + + if (memcmp(plaintext2, plaintext, sizeof(plaintext))) + { + snprintf(error_str, sizeof(error_str), + "CAMELLIA-128-CBC test failed (plaintext mismatch, " + "parallel path)"); + return error_str; + } + if (memcmp(iv2, iv, sizeof(iv))) + { + snprintf(error_str, sizeof(error_str), + "CAMELLIA-128-CBC test failed (IV mismatch, parallel path)"); + return error_str; + } + + return NULL; +} + static const char * selftest(void) { @@ -474,6 +554,9 @@ selftest(void) if ( (r = selftest_ctr_128 ()) ) return r; + if ( (r = selftest_cbc_128 ()) ) + return r; + return NULL; } commit 194ae35da7830a76b96e9b21121a2e1248762d3f Author: Jussi Kivilinna Date: Wed May 22 12:06:03 2013 +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/Makefile.am: Use the new filename. * configure.ac: Use the new filename. -- Signed-off-by: Jussi Kivilinna diff --git a/cipher/Makefile.am b/cipher/Makefile.am index c39f627..00e4429 100644 --- a/cipher/Makefile.am +++ b/cipher/Makefile.am @@ -75,7 +75,7 @@ tiger.c \ whirlpool.c \ twofish.c \ rfc2268.c \ -camellia.c camellia.h camellia-glue.c camellia_aesni_avx_x86-64.S +camellia.c camellia.h camellia-glue.c camellia-aesni-avx-amd64.S if ENABLE_O_FLAG_MUNGING o_flag_munging = sed -e 's/-O\([2-9s][2-9s]*\)/-O1/' -e 's/-Ofast/-O1/g' diff --git a/cipher/camellia_aesni_avx_x86-64.S b/cipher/camellia-aesni-avx-amd64.S similarity index 99% rename from cipher/camellia_aesni_avx_x86-64.S rename to cipher/camellia-aesni-avx-amd64.S index e25ad8f..2b1df17 100644 --- a/cipher/camellia_aesni_avx_x86-64.S +++ b/cipher/camellia-aesni-avx-amd64.S @@ -1,6 +1,6 @@ -/* camellia_avx_aesni_x86-64.S - AES-NI/AVX implementation of Camellia cipher +/* camellia-avx-aesni-amd64.S - AES-NI/AVX implementation of Camellia cipher * - * Copyright (C) 2013 Jussi Kivilinna + * Copyright ? 2013 Jussi Kivilinna * * This file is part of Libgcrypt. * diff --git a/configure.ac b/configure.ac index 079951d..f14e28a 100644 --- a/configure.ac +++ b/configure.ac @@ -1241,7 +1241,7 @@ if test "$found" = "1" ; then if test x"$avxsupport" = xyes ; then if test x"$aesnisupport" = xyes ; then # Build with the AES-NI/AVX implementation - GCRYPT_CIPHERS="$GCRYPT_CIPHERS camellia_aesni_avx_x86-64.lo" + GCRYPT_CIPHERS="$GCRYPT_CIPHERS camellia-aesni-avx-amd64.lo" fi fi fi ----------------------------------------------------------------------- Summary of changes: cipher/Makefile.am | 3 +- ...sni_avx_x86-64.S => camellia-aesni-avx-amd64.S} | 4 +- cipher/camellia-glue.c | 105 ++------ cipher/cipher-selftest.c | 291 ++++++++++++++++++++ cipher/cipher-selftest.h | 54 ++++ cipher/rijndael.c | 105 ++------ configure.ac | 2 +- 7 files changed, 393 insertions(+), 171 deletions(-) rename cipher/{camellia_aesni_avx_x86-64.S => camellia-aesni-avx-amd64.S} (99%) create mode 100644 cipher/cipher-selftest.c create mode 100644 cipher/cipher-selftest.h hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 22 18:22:38 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 22 May 2013 18:22:38 +0200 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.5.0-134-g638b209 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via 638b20967fb4f60b3366251f16963a4a54108087 (commit) via 2b8014af202c9e0f7619f7a4377f5eb752235220 (commit) via 05b3e2dda61d3d532a7f1ffd2487a85ed1c4f3ab (commit) from b65281a1b76d7898eb7607932246b78277d8570b (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 638b20967fb4f60b3366251f16963a4a54108087 Author: Werner Koch Date: Thu Apr 25 12:00:16 2013 +0100 Register a DCO. -- diff --git a/AUTHORS b/AUTHORS index a7a8f3f..fac0219 100644 --- a/AUTHORS +++ b/AUTHORS @@ -124,6 +124,9 @@ Dmitry Kasatkin Jussi Kivilinna 2012-11-15:20121115172331.150537dzb5i6jmy8 at www.dalek.fi: +Jussi Kivilinna +2013-05-06:5186720A.4090101 at iki.fi: + Rafa?l Carr? 2012-04-20:4F91988B.1080502 at videolan.org: commit 2b8014af202c9e0f7619f7a4377f5eb752235220 Author: Werner Koch Date: Thu Apr 18 14:40:43 2013 +0200 Add control commands to disable mlock and setuid dropping. * src/gcrypt.h.in (GCRYCTL_DISABLE_LOCKED_SECMEM): New. (GCRYCTL_DISABLE_PRIV_DROP): New. * src/global.c (_gcry_vcontrol): Implement them. * src/secmem.h (GCRY_SECMEM_FLAG_NO_MLOCK): New. (GCRY_SECMEM_FLAG_NO_PRIV_DROP): New. * src/secmem.c (no_mlock, no_priv_drop): New. (_gcry_secmem_set_flags, _gcry_secmem_get_flags): Set and get them. (lock_pool): Handle no_mlock and no_priv_drop. Signed-off-by: Werner Koch diff --git a/NEWS b/NEWS index 5dea552..ac60993 100644 --- a/NEWS +++ b/NEWS @@ -68,6 +68,8 @@ Noteworthy changes in version 1.6.0 (unreleased) GCRYPT_VERSION_NUMBER NEW. GCRY_KDF_SCRYPT NEW. gcry_pubkey_get_sexp NEW. + GCRYCTL_DISABLE_LOCKED_SECMEM NEW. + GCRYCTL_DISABLE_PRIV_DROP NEW. Noteworthy changes in version 1.5.0 (2011-06-29) diff --git a/doc/gcrypt.texi b/doc/gcrypt.texi index d4c4194..4d24475 100644 --- a/doc/gcrypt.texi +++ b/doc/gcrypt.texi @@ -679,6 +679,24 @@ Many applications do not require secure memory, so they should disable it right away. This command should be executed right after @code{gcry_check_version}. + at item GCRYCTL_DISABLE_LOCKED_SECMEM; Arguments: none +This command disables the use of the mlock call for secure memory. +Disabling the use of mlock may for example be done if an encrypted +swap space is in use. This command should be executed right after + at code{gcry_check_version}. + + at item GCRYCTL_DISABLE_PRIV_DROP; Arguments: none +This command sets a global flag to tell the secure memory subsystem +that it shall not drop privileges after secure memory has been +allocated. This command is commonly used right after + at code{gcry_check_version} but may also be used right away at program +startup. It won't have an effect after the secure memory pool has +been initialized. WARNING: A process running setuid(root) is a severe +security risk. Processes making use of Libgcrypt or other complex +code should drop these extra privileges as soon as possible. If this +command has been used the caller is responsible for dropping the +privileges. + @item GCRYCTL_INIT_SECMEM; Arguments: int nbytes This command is used to allocate a pool of secure memory and thus enabling the use of secure memory. It also drops all extra privileges diff --git a/src/gcrypt.h.in b/src/gcrypt.h.in index f472b02..27a29ec 100644 --- a/src/gcrypt.h.in +++ b/src/gcrypt.h.in @@ -302,7 +302,9 @@ enum gcry_ctl_cmds GCRYCTL_DISABLE_HWF = 63, GCRYCTL_SET_ENFORCED_FIPS_FLAG = 64, GCRYCTL_SET_PREFERRED_RNG_TYPE = 65, - GCRYCTL_GET_CURRENT_RNG_TYPE = 66 + GCRYCTL_GET_CURRENT_RNG_TYPE = 66, + GCRYCTL_DISABLE_LOCKED_SECMEM = 67, + GCRYCTL_DISABLE_PRIV_DROP = 68 }; /* Perform various operations defined by CMD. */ diff --git a/src/global.c b/src/global.c index f873897..a6fe980 100644 --- a/src/global.c +++ b/src/global.c @@ -2,6 +2,7 @@ * Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 * 2004, 2005, 2006, 2008, 2011, * 2012 Free Software Foundation, Inc. + * Copyright (C) 2013 g10 Code GmbH * * This file is part of Libgcrypt. * @@ -687,6 +688,18 @@ _gcry_vcontrol (enum gcry_ctl_cmds cmd, va_list arg_ptr) } break; + case GCRYCTL_DISABLE_LOCKED_SECMEM: + _gcry_set_preferred_rng_type (0); + _gcry_secmem_set_flags ((_gcry_secmem_get_flags () + | GCRY_SECMEM_FLAG_NO_MLOCK)); + break; + + case GCRYCTL_DISABLE_PRIV_DROP: + _gcry_set_preferred_rng_type (0); + _gcry_secmem_set_flags ((_gcry_secmem_get_flags () + | GCRY_SECMEM_FLAG_NO_PRIV_DROP)); + break; + default: _gcry_set_preferred_rng_type (0); err = GPG_ERR_INV_OP; diff --git a/src/secmem.c b/src/secmem.c index 107c662..c350bc9 100644 --- a/src/secmem.c +++ b/src/secmem.c @@ -1,6 +1,7 @@ /* secmem.c - memory allocation from a secure heap * Copyright (C) 1998, 1999, 2000, 2001, 2002, * 2003, 2007 Free Software Foundation, Inc. + * Copyright (C) 2013 g10 Code GmbH * * This file is part of Libgcrypt. * @@ -78,6 +79,8 @@ static int show_warning; static int not_locked; static int no_warning; static int suspend_warning; +static int no_mlock; +static int no_priv_drop; /* Stats. */ static unsigned int cur_alloced, cur_blocks; @@ -241,7 +244,7 @@ lock_pool (void *p, size_t n) int err; cap_set_proc (cap_from_text ("cap_ipc_lock+ep")); - err = mlock (p, n); + err = no_mlock? 0 : mlock (p, n); if (err && errno) err = errno; cap_set_proc (cap_from_text ("cap_ipc_lock+p")); @@ -282,22 +285,27 @@ lock_pool (void *p, size_t n) } else { - err = mlock (p, n); + err = no_mlock? 0 : mlock (p, n); if (err && errno) err = errno; } #else /* !HAVE_BROKEN_MLOCK */ - err = mlock (p, n); + err = no_mlock? 0 : mlock (p, n); if (err && errno) err = errno; #endif /* !HAVE_BROKEN_MLOCK */ + /* Test whether we are running setuid(0). */ if (uid && ! geteuid ()) { - /* check that we really dropped the privs. - * Note: setuid(0) should always fail */ - if (setuid (uid) || getuid () != geteuid () || !setuid (0)) - log_fatal ("failed to reset uid: %s\n", strerror (errno)); + /* Yes, we are. */ + if (!no_priv_drop) + { + /* Check that we really dropped the privs. + * Note: setuid(0) should always fail */ + if (setuid (uid) || getuid () != geteuid () || !setuid (0)) + log_fatal ("failed to reset uid: %s\n", strerror (errno)); + } } if (err) @@ -339,7 +347,8 @@ lock_pool (void *p, size_t n) #else (void)p; (void)n; - log_info ("Please note that you don't have secure memory on this system\n"); + if (!no_mlock) + log_info ("Please note that you don't have secure memory on this system\n"); #endif } @@ -424,6 +433,8 @@ _gcry_secmem_set_flags (unsigned flags) was_susp = suspend_warning; no_warning = flags & GCRY_SECMEM_FLAG_NO_WARNING; suspend_warning = flags & GCRY_SECMEM_FLAG_SUSPEND_WARNING; + no_mlock = flags & GCRY_SECMEM_FLAG_NO_MLOCK; + no_priv_drop = flags & GCRY_SECMEM_FLAG_NO_PRIV_DROP; /* and now issue the warning if it is not longer suspended */ if (was_susp && !suspend_warning && show_warning) @@ -445,6 +456,8 @@ _gcry_secmem_get_flags (void) flags = no_warning ? GCRY_SECMEM_FLAG_NO_WARNING : 0; flags |= suspend_warning ? GCRY_SECMEM_FLAG_SUSPEND_WARNING : 0; flags |= not_locked ? GCRY_SECMEM_FLAG_NOT_LOCKED : 0; + flags |= no_mlock ? GCRY_SECMEM_FLAG_NO_MLOCK : 0; + flags |= no_priv_drop ? GCRY_SECMEM_FLAG_NO_PRIV_DROP : 0; SECMEM_UNLOCK; diff --git a/src/secmem.h b/src/secmem.h index 29e151a..3577381 100644 --- a/src/secmem.h +++ b/src/secmem.h @@ -35,5 +35,7 @@ int _gcry_private_is_secure (const void *p); #define GCRY_SECMEM_FLAG_NO_WARNING (1 << 0) #define GCRY_SECMEM_FLAG_SUSPEND_WARNING (1 << 1) #define GCRY_SECMEM_FLAG_NOT_LOCKED (1 << 2) +#define GCRY_SECMEM_FLAG_NO_MLOCK (1 << 3) +#define GCRY_SECMEM_FLAG_NO_PRIV_DROP (1 << 4) #endif /* G10_SECMEM_H */ commit 05b3e2dda61d3d532a7f1ffd2487a85ed1c4f3ab Author: Werner Koch Date: Thu Apr 18 14:40:43 2013 +0200 Fix libtool 2.4.2 to correctly detect .def files. * ltmain.sh (sed_uncomment_deffile): New. (orig_export_symbols): Uncomment def file before testing for EXPORTS. * m4/libtool.m4: Do the same for the generated code. -- The old code was not correct in that it only looked at the first line and puts an EXPORTS keyword in front if missing. Binutils 2.22 accepted a duplicated EXPORTS keyword but at least 2.23.2 is more stringent and bails out without this fix. There is no need to send this upstream. Upstream's git master has a lot of changes including a similar fix for this problems. There are no signs that a libtool 2.4.3 will be released to fix this problem and thus we need to stick to our copy of 2.4.2 along with this patch. Signed-off-by: Werner Koch diff --git a/ltmain.sh b/ltmain.sh index c7d06c3..24e3fd3 100644 --- a/ltmain.sh +++ b/ltmain.sh @@ -411,6 +411,10 @@ sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' +# Sed substitution to remove simple comments and empty +# lines from a Windows .def file. +sed_uncomment_deffile='/^;/d; /^[ ]*$/d' + # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. @@ -8143,7 +8147,7 @@ EOF cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile - if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + if test "x`$SED "$sed_uncomment_deffile" $export_symbols | $SED 1q`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. diff --git a/m4/libtool.m4 b/m4/libtool.m4 index 4bedbd3..ff871a0 100644 --- a/m4/libtool.m4 +++ b/m4/libtool.m4 @@ -4773,7 +4773,7 @@ _LT_EOF _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED \"$sed_uncomment_deffile\" $export_symbols | $SED 1q`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; @@ -5150,7 +5150,7 @@ _LT_EOF shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED \"$sed_uncomment_deffile\" $export_symbols | $SED 1q`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; @@ -6149,7 +6149,7 @@ if test "$_lt_caught_CXX_error" != yes; then shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED \"$sed_uncomment_deffile\" $export_symbols | $SED 1q`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; @@ -6190,7 +6190,7 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED \"$sed_uncomment_deffile\" $export_symbols | $SED 1q`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; ----------------------------------------------------------------------- Summary of changes: AUTHORS | 3 +++ NEWS | 2 ++ doc/gcrypt.texi | 18 ++++++++++++++++++ ltmain.sh | 6 +++++- m4/libtool.m4 | 8 ++++---- src/gcrypt.h.in | 4 +++- src/global.c | 13 +++++++++++++ src/secmem.c | 29 +++++++++++++++++++++-------- src/secmem.h | 2 ++ 9 files changed, 71 insertions(+), 14 deletions(-) hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 22 19:03:20 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Wed, 22 May 2013 19:03:20 +0200 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.5.0-135-g4e46d8b Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via 4e46d8bc78008ba06f106b368cefb0dddf15fe38 (commit) from 638b20967fb4f60b3366251f16963a4a54108087 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 4e46d8bc78008ba06f106b368cefb0dddf15fe38 Author: Werner Koch Date: Thu Apr 18 14:40:43 2013 +0200 w32: Fix installing of .def file. * src/Makefile.am (install-def-file): Create libdir first. -- Reported-by: LRN diff --git a/src/Makefile.am b/src/Makefile.am index 2fbe6ef..22263d9 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -83,6 +83,7 @@ no_undefined = -no-undefined export_symbols = -export-symbols $(srcdir)/libgcrypt.def install-def-file: + -$(INSTALL) -d $(DESTDIR)$(libdir) $(INSTALL) $(srcdir)/libgcrypt.def $(DESTDIR)$(libdir)/libgcrypt.def uninstall-def-file: ----------------------------------------------------------------------- Summary of changes: src/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 23 12:45:35 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 23 May 2013 12:45:35 +0200 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.5.0-138-gb402de8 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via b402de8b9c4a9f269faf03ca952b1eb68a1f33c8 (commit) via 2fd06e207dcea1d8a7f0e7e92f3359615a99421b (commit) via c85501af8222913f0a1e20e77fceb88e93417925 (commit) from 4e46d8bc78008ba06f106b368cefb0dddf15fe38 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit b402de8b9c4a9f269faf03ca952b1eb68a1f33c8 Author: Werner Koch Date: Thu Apr 18 14:40:43 2013 +0200 Avoid compiler warning due to the global symbol setkey. * cipher/cipher-selftest.c (_gcry_selftest_helper_cbc_128) (_gcry_selftest_helper_ctr_128): Rename setkey to setkey_func. -- setkey is a POSIX.1 function defined in stdlib. diff --git a/cipher/cipher-selftest.c b/cipher/cipher-selftest.c index 50c7752..439f3ae 100644 --- a/cipher/cipher-selftest.c +++ b/cipher/cipher-selftest.c @@ -47,7 +47,8 @@ /* Run the self-tests for -CBC-128, tests bulk CBC decryption. Returns NULL on success. */ const char * -_gcry_selftest_helper_cbc_128 (const char *cipher, gcry_cipher_setkey_t setkey, +_gcry_selftest_helper_cbc_128 (const char *cipher, + gcry_cipher_setkey_t setkey_func, gcry_cipher_encrypt_t encrypt_one, gcry_cipher_bulk_cbc_dec_t bulk_cbc_dec, const int nblocks, const int blocksize, @@ -81,7 +82,7 @@ _gcry_selftest_helper_cbc_128 (const char *cipher, gcry_cipher_setkey_t setkey, ciphertext = plaintext2 + nblocks * blocksize; /* Initialize ctx */ - setkey (ctx, key, sizeof(key)); + setkey_func (ctx, key, sizeof(key)); /* Test single block code path */ memset (iv, 0x4e, blocksize); @@ -162,7 +163,8 @@ _gcry_selftest_helper_cbc_128 (const char *cipher, gcry_cipher_setkey_t setkey, /* Run the self-tests for -CTR-128, tests IV increment of bulk CTR encryption. Returns NULL on success. */ const char * -_gcry_selftest_helper_ctr_128 (const char *cipher, gcry_cipher_setkey_t setkey, +_gcry_selftest_helper_ctr_128 (const char *cipher, + gcry_cipher_setkey_t setkey_func, gcry_cipher_encrypt_t encrypt_one, gcry_cipher_bulk_ctr_enc_t bulk_ctr_enc, const int nblocks, const int blocksize, @@ -196,7 +198,7 @@ _gcry_selftest_helper_ctr_128 (const char *cipher, gcry_cipher_setkey_t setkey, ciphertext = plaintext2 + nblocks * blocksize; /* Initialize ctx */ - setkey (ctx, key, sizeof(key)); + setkey_func (ctx, key, sizeof(key)); /* Test single block code path */ memset (iv, 0xff, blocksize); commit 2fd06e207dcea1d8a7f0e7e92f3359615a99421b Author: Jussi Kivilinna Date: Thu May 23 11:04:18 2013 +0300 serpent: add SSE2 accelerated amd64 implementation * configure.ac (serpent): Add 'serpent-sse2-amd64.lo'. * cipher/Makefile.am (EXTRA_libcipher_la_SOURCES): Add 'serpent-sse2-amd64.S'. * cipher/cipher.c (gcry_cipher_open) [USE_SERPENT]: Register bulk functions for CBC-decryption and CTR-mode. * cipher/serpent.c (USE_SSE2): New macro. [USE_SSE2] (_gcry_serpent_sse2_ctr_enc, _gcry_serpent_sse2_cbc_dec): New prototypes to assembler functions. (serpent_setkey): Set 'serpent_init_done' before calling serpent_test. (_gcry_serpent_ctr_enc): New function. (_gcry_serpent_cbc_dec): New function. (selftest_ctr_128): New function. (selftest_cbc_128): New function. (selftest): Call selftest_ctr_128 and selftest_cbc_128. * cipher/serpent-sse2-amd64.S: New file. * src/cipher.h (_gcry_serpent_ctr_enc): New prototype. (_gcry_serpent_cbc_dec): New prototype. -- [v2]: Converted to SSE2, to support all amd64 processors (SSE2 is required feature by AMD64 SysV ABI). Patch adds word-sliced SSE2 implementation of Serpent for amd64 for speeding up parallelizable workloads (CTR mode, CBC mode decryption). Implementation processes eight blocks in parallel, with two four-block sets interleaved for out-of-order scheduling. Speed old vs. new on Intel Core i5-2450M (Sandy-Bridge): ECB/Stream CBC CFB OFB CTR --------------- --------------- --------------- --------------- --------------- SERPENT128 1.00x 0.99x 1.00x 3.98x 1.00x 1.01x 1.00x 1.01x 4.04x 4.04x Speed old vs. new on AMD Phenom II X6 1055T: ECB/Stream CBC CFB OFB CTR --------------- --------------- --------------- --------------- --------------- SERPENT128 1.02x 1.01x 1.00x 2.83x 1.00x 1.00x 1.00x 1.00x 2.72x 2.72x Speed old vs. new on Intel Core2 Duo T8100: ECB/Stream CBC CFB OFB CTR --------------- --------------- --------------- --------------- --------------- SERPENT128 1.00x 1.02x 0.97x 4.02x 0.98x 1.01x 0.98x 1.00x 3.82x 3.91x Signed-off-by: Jussi Kivilinna diff --git a/cipher/Makefile.am b/cipher/Makefile.am index 0808bd2..69f1e6d 100644 --- a/cipher/Makefile.am +++ b/cipher/Makefile.am @@ -68,7 +68,7 @@ rmd160.c \ rsa.c \ scrypt.c \ seed.c \ -serpent.c \ +serpent.c serpent-sse2-amd64.S \ sha1.c \ sha256.c \ sha512.c \ diff --git a/cipher/cipher.c b/cipher/cipher.c index f1224af..20ac2c7 100644 --- a/cipher/cipher.c +++ b/cipher/cipher.c @@ -726,6 +726,14 @@ gcry_cipher_open (gcry_cipher_hd_t *handle, h->bulk.ctr_enc = _gcry_camellia_ctr_enc; break; #endif /*USE_CAMELLIA*/ +#ifdef USE_SERPENT + case GCRY_CIPHER_SERPENT128: + case GCRY_CIPHER_SERPENT192: + case GCRY_CIPHER_SERPENT256: + h->bulk.cbc_dec = _gcry_serpent_cbc_dec; + h->bulk.ctr_enc = _gcry_serpent_ctr_enc; + break; +#endif /*USE_SERPENT*/ default: break; diff --git a/cipher/serpent-sse2-amd64.S b/cipher/serpent-sse2-amd64.S new file mode 100644 index 0000000..8d8c8dd --- /dev/null +++ b/cipher/serpent-sse2-amd64.S @@ -0,0 +1,826 @@ +/* serpent-sse2-amd64.S - SSE2 implementation of Serpent cipher + * + * Copyright ? 2013 Jussi Kivilinna + * + * This file is part of Libgcrypt. + * + * Libgcrypt is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * Libgcrypt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifdef __x86_64 +#include +#if defined(USE_SERPENT) + +#ifdef __PIC__ +# define RIP (%rip) +#else +# define RIP +#endif + +/* struct serpent_context: */ +#define ctx_keys 0 + +/* register macros */ +#define CTX %rdi + +/* vector registers */ +.set RA0, %xmm0 +.set RA1, %xmm1 +.set RA2, %xmm2 +.set RA3, %xmm3 +.set RA4, %xmm4 + +.set RB0, %xmm5 +.set RB1, %xmm6 +.set RB2, %xmm7 +.set RB3, %xmm8 +.set RB4, %xmm9 + +.set RNOT, %xmm10 +.set RTMP0, %xmm11 +.set RTMP1, %xmm12 +.set RTMP2, %xmm13 + +/********************************************************************** + helper macros + **********************************************************************/ + +/* preprocessor macro for renaming vector registers using GAS macros */ +#define sbox_reg_rename(r0, r1, r2, r3, r4, \ + new_r0, new_r1, new_r2, new_r3, new_r4) \ + .set rename_reg0, new_r0; \ + .set rename_reg1, new_r1; \ + .set rename_reg2, new_r2; \ + .set rename_reg3, new_r3; \ + .set rename_reg4, new_r4; \ + \ + .set r0, rename_reg0; \ + .set r1, rename_reg1; \ + .set r2, rename_reg2; \ + .set r3, rename_reg3; \ + .set r4, rename_reg4; + +/* vector 32-bit rotation to left */ +#define vec_rol(reg, nleft, tmp) \ + movdqa reg, tmp; \ + pslld $(nleft), tmp; \ + psrld $(32 - (nleft)), reg; \ + por tmp, reg; + +/* vector 32-bit rotation to right */ +#define vec_ror(reg, nright, tmp) \ + vec_rol(reg, 32 - nright, tmp) + +/* 4x4 32-bit integer matrix transpose */ +#define transpose_4x4(x0, x1, x2, x3, t1, t2, t3) \ + movdqa x0, t2; \ + punpckhdq x1, t2; \ + punpckldq x1, x0; \ + \ + movdqa x2, t1; \ + punpckldq x3, t1; \ + punpckhdq x3, x2; \ + \ + movdqa x0, x1; \ + punpckhqdq t1, x1; \ + punpcklqdq t1, x0; \ + \ + movdqa t2, x3; \ + punpckhqdq x2, x3; \ + punpcklqdq x2, t2; \ + movdqa t2, x2; + +/* fill xmm register with 32-bit value from memory */ +#define pbroadcastd(mem32, xreg) \ + movd mem32, xreg; \ + pshufd $0, xreg, xreg; + +/* xor with unaligned memory operand */ +#define pxor_u(umem128, xreg, t) \ + movdqu umem128, t; \ + pxor t, xreg; + +/* 128-bit wide byte swap */ +#define pbswap(xreg, t0) \ + /* reorder 32-bit words, [a,b,c,d] => [d,c,b,a] */ \ + pshufd $0x1b, xreg, xreg; \ + /* reorder high&low 16-bit words, [d0,d1,c0,c1] => [d1,d0,c1,c0] */ \ + pshuflw $0xb1, xreg, xreg; \ + pshufhw $0xb1, xreg, xreg; \ + /* reorder bytes in 16-bit words */ \ + movdqa xreg, t0; \ + psrlw $8, t0; \ + psllw $8, xreg; \ + por t0, xreg; + +/********************************************************************** + 8-way serpent + **********************************************************************/ + +/* + * These are the S-Boxes of Serpent from following research paper. + * + * D. A. Osvik, ?Speeding up Serpent,? in Third AES Candidate Conference, + * (New York, New York, USA), p. 317?329, National Institute of Standards and + * Technology, 2000. + * + * Paper is also available at: http://www.ii.uib.no/~osvik/pub/aes3.pdf + * + */ +#define SBOX0(r0, r1, r2, r3, r4) \ + pxor r0, r3; movdqa r1, r4; \ + pand r3, r1; pxor r2, r4; \ + pxor r0, r1; por r3, r0; \ + pxor r4, r0; pxor r3, r4; \ + pxor r2, r3; por r1, r2; \ + pxor r4, r2; pxor RNOT, r4; \ + por r1, r4; pxor r3, r1; \ + pxor r4, r1; por r0, r3; \ + pxor r3, r1; pxor r3, r4; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r1,r4,r2,r0,r3); + +#define SBOX0_INVERSE(r0, r1, r2, r3, r4) \ + pxor RNOT, r2; movdqa r1, r4; \ + por r0, r1; pxor RNOT, r4; \ + pxor r2, r1; por r4, r2; \ + pxor r3, r1; pxor r4, r0; \ + pxor r0, r2; pand r3, r0; \ + pxor r0, r4; por r1, r0; \ + pxor r2, r0; pxor r4, r3; \ + pxor r1, r2; pxor r0, r3; \ + pxor r1, r3; \ + pand r3, r2; \ + pxor r2, r4; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r0,r4,r1,r3,r2); + +#define SBOX1(r0, r1, r2, r3, r4) \ + pxor RNOT, r0; pxor RNOT, r2; \ + movdqa r0, r4; pand r1, r0; \ + pxor r0, r2; por r3, r0; \ + pxor r2, r3; pxor r0, r1; \ + pxor r4, r0; por r1, r4; \ + pxor r3, r1; por r0, r2; \ + pand r4, r2; pxor r1, r0; \ + pand r2, r1; \ + pxor r0, r1; pand r2, r0; \ + pxor r4, r0; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r2,r0,r3,r1,r4); + +#define SBOX1_INVERSE(r0, r1, r2, r3, r4) \ + movdqa r1, r4; pxor r3, r1; \ + pand r1, r3; pxor r2, r4; \ + pxor r0, r3; por r1, r0; \ + pxor r3, r2; pxor r4, r0; \ + por r2, r0; pxor r3, r1; \ + pxor r1, r0; por r3, r1; \ + pxor r0, r1; pxor RNOT, r4; \ + pxor r1, r4; por r0, r1; \ + pxor r0, r1; \ + por r4, r1; \ + pxor r1, r3; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r4,r0,r3,r2,r1); + +#define SBOX2(r0, r1, r2, r3, r4) \ + movdqa r0, r4; pand r2, r0; \ + pxor r3, r0; pxor r1, r2; \ + pxor r0, r2; por r4, r3; \ + pxor r1, r3; pxor r2, r4; \ + movdqa r3, r1; por r4, r3; \ + pxor r0, r3; pand r1, r0; \ + pxor r0, r4; pxor r3, r1; \ + pxor r4, r1; pxor RNOT, r4; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r2,r3,r1,r4,r0); + +#define SBOX2_INVERSE(r0, r1, r2, r3, r4) \ + pxor r3, r2; pxor r0, r3; \ + movdqa r3, r4; pand r2, r3; \ + pxor r1, r3; por r2, r1; \ + pxor r4, r1; pand r3, r4; \ + pxor r3, r2; pand r0, r4; \ + pxor r2, r4; pand r1, r2; \ + por r0, r2; pxor RNOT, r3; \ + pxor r3, r2; pxor r3, r0; \ + pand r1, r0; pxor r4, r3; \ + pxor r0, r3; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r1,r4,r2,r3,r0); + +#define SBOX3(r0, r1, r2, r3, r4) \ + movdqa r0, r4; por r3, r0; \ + pxor r1, r3; pand r4, r1; \ + pxor r2, r4; pxor r3, r2; \ + pand r0, r3; por r1, r4; \ + pxor r4, r3; pxor r1, r0; \ + pand r0, r4; pxor r3, r1; \ + pxor r2, r4; por r0, r1; \ + pxor r2, r1; pxor r3, r0; \ + movdqa r1, r2; por r3, r1; \ + pxor r0, r1; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r1,r2,r3,r4,r0); + +#define SBOX3_INVERSE(r0, r1, r2, r3, r4) \ + movdqa r2, r4; pxor r1, r2; \ + pxor r2, r0; pand r2, r4; \ + pxor r0, r4; pand r1, r0; \ + pxor r3, r1; por r4, r3; \ + pxor r3, r2; pxor r3, r0; \ + pxor r4, r1; pand r2, r3; \ + pxor r1, r3; pxor r0, r1; \ + por r2, r1; pxor r3, r0; \ + pxor r4, r1; \ + pxor r1, r0; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r2,r1,r3,r0,r4); + +#define SBOX4(r0, r1, r2, r3, r4) \ + pxor r3, r1; pxor RNOT, r3; \ + pxor r3, r2; pxor r0, r3; \ + movdqa r1, r4; pand r3, r1; \ + pxor r2, r1; pxor r3, r4; \ + pxor r4, r0; pand r4, r2; \ + pxor r0, r2; pand r1, r0; \ + pxor r0, r3; por r1, r4; \ + pxor r0, r4; por r3, r0; \ + pxor r2, r0; pand r3, r2; \ + pxor RNOT, r0; pxor r2, r4; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r1,r4,r0,r3,r2); + +#define SBOX4_INVERSE(r0, r1, r2, r3, r4) \ + movdqa r2, r4; pand r3, r2; \ + pxor r1, r2; por r3, r1; \ + pand r0, r1; pxor r2, r4; \ + pxor r1, r4; pand r2, r1; \ + pxor RNOT, r0; pxor r4, r3; \ + pxor r3, r1; pand r0, r3; \ + pxor r2, r3; pxor r1, r0; \ + pand r0, r2; pxor r0, r3; \ + pxor r4, r2; \ + por r3, r2; pxor r0, r3; \ + pxor r1, r2; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r0,r3,r2,r4,r1); + +#define SBOX5(r0, r1, r2, r3, r4) \ + pxor r1, r0; pxor r3, r1; \ + pxor RNOT, r3; movdqa r1, r4; \ + pand r0, r1; pxor r3, r2; \ + pxor r2, r1; por r4, r2; \ + pxor r3, r4; pand r1, r3; \ + pxor r0, r3; pxor r1, r4; \ + pxor r2, r4; pxor r0, r2; \ + pand r3, r0; pxor RNOT, r2; \ + pxor r4, r0; por r3, r4; \ + pxor r4, r2; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r1,r3,r0,r2,r4); + +#define SBOX5_INVERSE(r0, r1, r2, r3, r4) \ + pxor RNOT, r1; movdqa r3, r4; \ + pxor r1, r2; por r0, r3; \ + pxor r2, r3; por r1, r2; \ + pand r0, r2; pxor r3, r4; \ + pxor r4, r2; por r0, r4; \ + pxor r1, r4; pand r2, r1; \ + pxor r3, r1; pxor r2, r4; \ + pand r4, r3; pxor r1, r4; \ + pxor r4, r3; pxor RNOT, r4; \ + pxor r0, r3; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r1,r4,r3,r2,r0); + +#define SBOX6(r0, r1, r2, r3, r4) \ + pxor RNOT, r2; movdqa r3, r4; \ + pand r0, r3; pxor r4, r0; \ + pxor r2, r3; por r4, r2; \ + pxor r3, r1; pxor r0, r2; \ + por r1, r0; pxor r1, r2; \ + pxor r0, r4; por r3, r0; \ + pxor r2, r0; pxor r3, r4; \ + pxor r0, r4; pxor RNOT, r3; \ + pand r4, r2; \ + pxor r3, r2; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r0,r1,r4,r2,r3); + +#define SBOX6_INVERSE(r0, r1, r2, r3, r4) \ + pxor r2, r0; movdqa r2, r4; \ + pand r0, r2; pxor r3, r4; \ + pxor RNOT, r2; pxor r1, r3; \ + pxor r3, r2; por r0, r4; \ + pxor r2, r0; pxor r4, r3; \ + pxor r1, r4; pand r3, r1; \ + pxor r0, r1; pxor r3, r0; \ + por r2, r0; pxor r1, r3; \ + pxor r0, r4; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r1,r2,r4,r3,r0); + +#define SBOX7(r0, r1, r2, r3, r4) \ + movdqa r1, r4; por r2, r1; \ + pxor r3, r1; pxor r2, r4; \ + pxor r1, r2; por r4, r3; \ + pand r0, r3; pxor r2, r4; \ + pxor r1, r3; por r4, r1; \ + pxor r0, r1; por r4, r0; \ + pxor r2, r0; pxor r4, r1; \ + pxor r1, r2; pand r0, r1; \ + pxor r4, r1; pxor RNOT, r2; \ + por r0, r2; \ + pxor r2, r4; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r4,r3,r1,r0,r2); + +#define SBOX7_INVERSE(r0, r1, r2, r3, r4) \ + movdqa r2, r4; pxor r0, r2; \ + pand r3, r0; por r3, r4; \ + pxor RNOT, r2; pxor r1, r3; \ + por r0, r1; pxor r2, r0; \ + pand r4, r2; pand r4, r3; \ + pxor r2, r1; pxor r0, r2; \ + por r2, r0; pxor r1, r4; \ + pxor r3, r0; pxor r4, r3; \ + por r0, r4; pxor r2, r3; \ + pxor r2, r4; \ + \ + sbox_reg_rename(r0,r1,r2,r3,r4, r3,r0,r1,r4,r2); + +/* Apply SBOX number WHICH to to the block. */ +#define SBOX(which, r0, r1, r2, r3, r4) \ + SBOX##which (r0, r1, r2, r3, r4) + +/* Apply inverse SBOX number WHICH to to the block. */ +#define SBOX_INVERSE(which, r0, r1, r2, r3, r4) \ + SBOX##which##_INVERSE (r0, r1, r2, r3, r4) + +/* XOR round key into block state in r0,r1,r2,r3. r4 used as temporary. */ +#define BLOCK_XOR_KEY(r0, r1, r2, r3, r4, round) \ + pbroadcastd ((ctx_keys + (round) * 16 + 0 * 4)(CTX), r4); \ + pxor r4, r0; \ + pbroadcastd ((ctx_keys + (round) * 16 + 1 * 4)(CTX), r4); \ + pxor r4, r1; \ + pbroadcastd ((ctx_keys + (round) * 16 + 2 * 4)(CTX), r4); \ + pxor r4, r2; \ + pbroadcastd ((ctx_keys + (round) * 16 + 3 * 4)(CTX), r4); \ + pxor r4, r3; + +/* Apply the linear transformation to BLOCK. */ +#define LINEAR_TRANSFORMATION(r0, r1, r2, r3, r4) \ + vec_rol(r0, 13, r4); \ + vec_rol(r2, 3, r4); \ + pxor r0, r1; \ + pxor r2, r1; \ + movdqa r0, r4; \ + pslld $3, r4; \ + pxor r2, r3; \ + pxor r4, r3; \ + vec_rol(r1, 1, r4); \ + vec_rol(r3, 7, r4); \ + pxor r1, r0; \ + pxor r3, r0; \ + movdqa r1, r4; \ + pslld $7, r4; \ + pxor r3, r2; \ + pxor r4, r2; \ + vec_rol(r0, 5, r4); \ + vec_rol(r2, 22, r4); + +/* Apply the inverse linear transformation to BLOCK. */ +#define LINEAR_TRANSFORMATION_INVERSE(r0, r1, r2, r3, r4) \ + vec_ror(r2, 22, r4); \ + vec_ror(r0, 5, r4); \ + movdqa r1, r4; \ + pslld $7, r4; \ + pxor r3, r2; \ + pxor r4, r2; \ + pxor r1, r0; \ + pxor r3, r0; \ + vec_ror(r3, 7, r4); \ + vec_ror(r1, 1, r4); \ + movdqa r0, r4; \ + pslld $3, r4; \ + pxor r2, r3; \ + pxor r4, r3; \ + pxor r0, r1; \ + pxor r2, r1; \ + vec_ror(r2, 3, r4); \ + vec_ror(r0, 13, r4); + +/* Apply a Serpent round to eight parallel blocks. This macro increments + `round'. */ +#define ROUND(which, a0, a1, a2, a3, a4, b0, b1, b2, b3, b4) \ + BLOCK_XOR_KEY (a0, a1, a2, a3, a4, round); \ + SBOX (which, a0, a1, a2, a3, a4); \ + BLOCK_XOR_KEY (b0, b1, b2, b3, b4, round); \ + SBOX (which, b0, b1, b2, b3, b4); \ + LINEAR_TRANSFORMATION (a0, a1, a2, a3, a4); \ + LINEAR_TRANSFORMATION (b0, b1, b2, b3, b4); \ + .set round, (round + 1); + +/* Apply the last Serpent round to eight parallel blocks. This macro increments + `round'. */ +#define ROUND_LAST(which, a0, a1, a2, a3, a4, b0, b1, b2, b3, b4) \ + BLOCK_XOR_KEY (a0, a1, a2, a3, a4, round); \ + SBOX (which, a0, a1, a2, a3, a4); \ + BLOCK_XOR_KEY (b0, b1, b2, b3, b4, round); \ + SBOX (which, b0, b1, b2, b3, b4); \ + .set round, (round + 1); \ + BLOCK_XOR_KEY (a0, a1, a2, a3, a4, round); \ + BLOCK_XOR_KEY (b0, b1, b2, b3, b4, round); \ + .set round, (round + 1); + +/* Apply an inverse Serpent round to eight parallel blocks. This macro + increments `round'. */ +#define ROUND_INVERSE(which, a0, a1, a2, a3, a4, b0, b1, b2, b3, b4) \ + LINEAR_TRANSFORMATION_INVERSE (a0, a1, a2, a3, a4); \ + LINEAR_TRANSFORMATION_INVERSE (b0, b1, b2, b3, b4); \ + SBOX_INVERSE (which, a0, a1, a2, a3, a4); \ + BLOCK_XOR_KEY (a0, a1, a2, a3, a4, round); \ + SBOX_INVERSE (which, b0, b1, b2, b3, b4); \ + BLOCK_XOR_KEY (b0, b1, b2, b3, b4, round); \ + .set round, (round - 1); + +/* Apply the first inverse Serpent round to eight parallel blocks. This macro + increments `round'. */ +#define ROUND_FIRST_INVERSE(which, a0, a1, a2, a3, a4, b0, b1, b2, b3, b4) \ + BLOCK_XOR_KEY (a0, a1, a2, a3, a4, round); \ + BLOCK_XOR_KEY (b0, b1, b2, b3, b4, round); \ + .set round, (round - 1); \ + SBOX_INVERSE (which, a0, a1, a2, a3, a4); \ + BLOCK_XOR_KEY (a0, a1, a2, a3, a4, round); \ + SBOX_INVERSE (which, b0, b1, b2, b3, b4); \ + BLOCK_XOR_KEY (b0, b1, b2, b3, b4, round); \ + .set round, (round - 1); + +.text + +.align 8 +.type __serpent_enc_blk8, at function; +__serpent_enc_blk8: + /* input: + * %rdi: ctx, CTX + * RA0, RA1, RA2, RA3, RB0, RB1, RB2, RB3: eight parallel plaintext + * blocks + * output: + * RA0, RA1, RA2, RA3, RB0, RB1, RB2, RB3: eight parallel + * ciphertext blocks + */ + + /* record input vector names for __serpent_enc_blk8 */ + .set enc_in_a0, RA0 + .set enc_in_a1, RA1 + .set enc_in_a2, RA2 + .set enc_in_a3, RA3 + .set enc_in_b0, RB0 + .set enc_in_b1, RB1 + .set enc_in_b2, RB2 + .set enc_in_b3, RB3 + + pcmpeqd RNOT, RNOT; + + transpose_4x4(RA0, RA1, RA2, RA3, RA4, RTMP0, RTMP1); + transpose_4x4(RB0, RB1, RB2, RB3, RB4, RTMP0, RTMP1); + + .set round, 0 + ROUND (0, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (1, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (2, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (3, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (4, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (5, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (6, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (7, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (0, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (1, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (2, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (3, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (4, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (5, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (6, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (7, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (0, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (1, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (2, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (3, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (4, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (5, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (6, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (7, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (0, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (1, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (2, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (3, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (4, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (5, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND (6, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + + ROUND_LAST (7, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + + transpose_4x4(RA0, RA1, RA2, RA3, RA4, RTMP0, RTMP1); + transpose_4x4(RB0, RB1, RB2, RB3, RB4, RTMP0, RTMP1); + + /* record output vector names for __serpent_enc_blk8 */ + .set enc_out_a0, RA0 + .set enc_out_a1, RA1 + .set enc_out_a2, RA2 + .set enc_out_a3, RA3 + .set enc_out_b0, RB0 + .set enc_out_b1, RB1 + .set enc_out_b2, RB2 + .set enc_out_b3, RB3 + + ret; +.size __serpent_enc_blk8,.-__serpent_enc_blk8; + +.align 8 +.type __serpent_dec_blk8, at function; +__serpent_dec_blk8: + /* input: + * %rdi: ctx, CTX + * RA0, RA1, RA2, RA3, RB0, RB1, RB2, RB3: eight parallel + * ciphertext blocks + * output: + * RA0, RA1, RA2, RA3, RB0, RB1, RB2, RB3: eight parallel plaintext + * blocks + */ + + /* record input vector names for __serpent_dec_blk8 */ + .set dec_in_a0, RA0 + .set dec_in_a1, RA1 + .set dec_in_a2, RA2 + .set dec_in_a3, RA3 + .set dec_in_b0, RB0 + .set dec_in_b1, RB1 + .set dec_in_b2, RB2 + .set dec_in_b3, RB3 + + pcmpeqd RNOT, RNOT; + + transpose_4x4(RA0, RA1, RA2, RA3, RA4, RTMP0, RTMP1); + transpose_4x4(RB0, RB1, RB2, RB3, RB4, RTMP0, RTMP1); + + .set round, 32 + ROUND_FIRST_INVERSE (7, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + + ROUND_INVERSE (6, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (5, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (4, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (3, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (2, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (1, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (0, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (7, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (6, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (5, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (4, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (3, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (2, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (1, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (0, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (7, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (6, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (5, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (4, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (3, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (2, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (1, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (0, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (7, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (6, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (5, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (4, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (3, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (2, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (1, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + ROUND_INVERSE (0, RA0, RA1, RA2, RA3, RA4, RB0, RB1, RB2, RB3, RB4); + + transpose_4x4(RA0, RA1, RA2, RA3, RA4, RTMP0, RTMP1); + transpose_4x4(RB0, RB1, RB2, RB3, RB4, RTMP0, RTMP1); + + /* record output vector names for __serpent_dec_blk8 */ + .set dec_out_a0, RA0 + .set dec_out_a1, RA1 + .set dec_out_a2, RA2 + .set dec_out_a3, RA3 + .set dec_out_b0, RB0 + .set dec_out_b1, RB1 + .set dec_out_b2, RB2 + .set dec_out_b3, RB3 + + ret; +.size __serpent_dec_blk8,.-__serpent_dec_blk8; + +.align 8 +.global _gcry_serpent_sse2_ctr_enc +.type _gcry_serpent_sse2_ctr_enc, at function; +_gcry_serpent_sse2_ctr_enc: + /* input: + * %rdi: ctx, CTX + * %rsi: dst (8 blocks) + * %rdx: src (8 blocks) + * %rcx: iv (big endian, 128bit) + */ + + .set RA0, enc_in_a0 + .set RA1, enc_in_a1 + .set RA2, enc_in_a2 + .set RA3, enc_in_a3 + .set RB0, enc_in_b0 + .set RB1, enc_in_b1 + .set RB2, enc_in_b2 + .set RB3, enc_in_b3 + + /* load IV and byteswap */ + movdqu (%rcx), RA0; + movdqa RA0, RTMP0; + pbswap(RTMP0, RTMP1); /* be => le */ + + pcmpeqd RNOT, RNOT; + psrldq $8, RNOT; /* low: -1, high: 0 */ + movdqa RNOT, RTMP2; + paddq RTMP2, RTMP2; /* low: -2, high: 0 */ + + /* construct IVs */ + movdqa RTMP0, RTMP1; + psubq RNOT, RTMP0; /* +1 */ + movdqa RTMP0, RA1; + psubq RTMP2, RTMP1; /* +2 */ + movdqa RTMP1, RA2; + psubq RTMP2, RTMP0; /* +3 */ + movdqa RTMP0, RA3; + psubq RTMP2, RTMP1; /* +4 */ + movdqa RTMP1, RB0; + psubq RTMP2, RTMP0; /* +5 */ + movdqa RTMP0, RB1; + psubq RTMP2, RTMP1; /* +6 */ + movdqa RTMP1, RB2; + psubq RTMP2, RTMP0; /* +7 */ + movdqa RTMP0, RB3; + psubq RTMP2, RTMP1; /* +8 */ + + /* check need for handling 64-bit overflow and carry */ + cmpl $0xffffffff, 8(%rcx); + jne .Lno_ctr_carry; + + movl 12(%rcx), %eax; + bswapl %eax; + cmpl $-8, %eax; + jb .Lno_ctr_carry; + pslldq $8, RNOT; /* low: 0, high: -1 */ + je .Lcarry_RTMP0; + + cmpl $-6, %eax; + jb .Lcarry_RB3; + je .Lcarry_RB2; + + cmpl $-4, %eax; + jb .Lcarry_RB1; + je .Lcarry_RB0; + + cmpl $-2, %eax; + jb .Lcarry_RA3; + je .Lcarry_RA2; + + psubq RNOT, RA1; +.Lcarry_RA2: + psubq RNOT, RA2; +.Lcarry_RA3: + psubq RNOT, RA3; +.Lcarry_RB0: + psubq RNOT, RB0; +.Lcarry_RB1: + psubq RNOT, RB1; +.Lcarry_RB2: + psubq RNOT, RB2; +.Lcarry_RB3: + psubq RNOT, RB3; +.Lcarry_RTMP0: + psubq RNOT, RTMP1; + +.Lno_ctr_carry: + /* le => be */ + pbswap(RA1, RTMP0); + pbswap(RA2, RTMP0); + pbswap(RA3, RTMP0); + pbswap(RB0, RTMP0); + pbswap(RB1, RTMP0); + pbswap(RB2, RTMP0); + pbswap(RB3, RTMP0); + pbswap(RTMP1, RTMP0); + /* store new IV */ + movdqu RTMP1, (%rcx); + + call __serpent_enc_blk8; + + .set RA0, enc_out_a0 + .set RA1, enc_out_a1 + .set RA2, enc_out_a2 + .set RA3, enc_out_a3 + .set RB0, enc_out_b0 + .set RB1, enc_out_b1 + .set RB2, enc_out_b2 + .set RB3, enc_out_b3 + + pxor_u((0 * 16)(%rdx), RA0, RTMP0); + pxor_u((1 * 16)(%rdx), RA1, RTMP0); + pxor_u((2 * 16)(%rdx), RA2, RTMP0); + pxor_u((3 * 16)(%rdx), RA3, RTMP0); + pxor_u((4 * 16)(%rdx), RB0, RTMP0); + pxor_u((5 * 16)(%rdx), RB1, RTMP0); + pxor_u((6 * 16)(%rdx), RB2, RTMP0); + pxor_u((7 * 16)(%rdx), RB3, RTMP0); + + movdqu RA0, (0 * 16)(%rsi); + movdqu RA1, (1 * 16)(%rsi); + movdqu RA2, (2 * 16)(%rsi); + movdqu RA3, (3 * 16)(%rsi); + movdqu RB0, (4 * 16)(%rsi); + movdqu RB1, (5 * 16)(%rsi); + movdqu RB2, (6 * 16)(%rsi); + movdqu RB3, (7 * 16)(%rsi); + + ret +.size _gcry_serpent_sse2_ctr_enc,.-_gcry_serpent_sse2_ctr_enc; + +.align 8 +.global _gcry_serpent_sse2_cbc_dec +.type _gcry_serpent_sse2_cbc_dec, at function; +_gcry_serpent_sse2_cbc_dec: + /* input: + * %rdi: ctx, CTX + * %rsi: dst (8 blocks) + * %rdx: src (8 blocks) + * %rcx: iv + */ + + .set RA0, dec_in_a0 + .set RA1, dec_in_a1 + .set RA2, dec_in_a2 + .set RA3, dec_in_a3 + .set RB0, dec_in_b0 + .set RB1, dec_in_b1 + .set RB2, dec_in_b2 + .set RB3, dec_in_b3 + + movdqu (0 * 16)(%rdx), RA0; + movdqu (1 * 16)(%rdx), RA1; + movdqu (2 * 16)(%rdx), RA2; + movdqu (3 * 16)(%rdx), RA3; + movdqu (4 * 16)(%rdx), RB0; + movdqu (5 * 16)(%rdx), RB1; + movdqu (6 * 16)(%rdx), RB2; + movdqu (7 * 16)(%rdx), RB3; + + call __serpent_dec_blk8; + + .set RA0, dec_out_a0 + .set RA1, dec_out_a1 + .set RA2, dec_out_a2 + .set RA3, dec_out_a3 + .set RB0, dec_out_b0 + .set RB1, dec_out_b1 + .set RB2, dec_out_b2 + .set RB3, dec_out_b3 + + movdqu (7 * 16)(%rdx), RNOT; + pxor_u((%rcx), RA0, RTMP0); + pxor_u((0 * 16)(%rdx), RA1, RTMP0); + pxor_u((1 * 16)(%rdx), RA2, RTMP0); + pxor_u((2 * 16)(%rdx), RA3, RTMP0); + pxor_u((3 * 16)(%rdx), RB0, RTMP0); + pxor_u((4 * 16)(%rdx), RB1, RTMP0); + pxor_u((5 * 16)(%rdx), RB2, RTMP0); + pxor_u((6 * 16)(%rdx), RB3, RTMP0); + movdqu RNOT, (%rcx); /* store new IV */ + + movdqu RA0, (0 * 16)(%rsi); + movdqu RA1, (1 * 16)(%rsi); + movdqu RA2, (2 * 16)(%rsi); + movdqu RA3, (3 * 16)(%rsi); + movdqu RB0, (4 * 16)(%rsi); + movdqu RB1, (5 * 16)(%rsi); + movdqu RB2, (6 * 16)(%rsi); + movdqu RB3, (7 * 16)(%rsi); + + ret +.size _gcry_serpent_sse2_cbc_dec,.-_gcry_serpent_sse2_cbc_dec; + +#endif /*defined(USE_SERPENT)*/ +#endif /*__x86_64*/ diff --git a/cipher/serpent.c b/cipher/serpent.c index 72840cf..7b82b48 100644 --- a/cipher/serpent.c +++ b/cipher/serpent.c @@ -28,6 +28,15 @@ #include "g10lib.h" #include "cipher.h" #include "bithelp.h" +#include "bufhelp.h" +#include "cipher-selftest.h" + + +/* USE_SSE2 indicates whether to compile with AMD64 SSE2 code. */ +#undef USE_SSE2 +#if defined(__x86_64__) +# define USE_SSE2 1 +#endif /* Number of rounds per Serpent encrypt/decrypt operation. */ #define ROUNDS 32 @@ -52,6 +61,21 @@ typedef struct serpent_context } serpent_context_t; +#ifdef USE_SSE2 +/* Assembler implementations of Serpent using SSE2. Process 8 block in + parallel. + */ +extern void _gcry_serpent_sse2_ctr_enc(serpent_context_t *ctx, + unsigned char *out, + const unsigned char *in, + unsigned char *ctr); + +extern void _gcry_serpent_sse2_cbc_dec(serpent_context_t *ctx, + unsigned char *out, + const unsigned char *in, + unsigned char *iv); +#endif + /* A prototype. */ static const char *serpent_test (void); @@ -191,7 +215,7 @@ static const char *serpent_test (void); r4 &= r0; r1 ^= r3; \ r4 ^= r2; r1 |= r0; \ r1 ^= r2; r0 ^= r3; \ - r2 = r1; r1 |= r3; \ + r2 = r1; r1 |= r3; \ r1 ^= r0; \ \ w = r1; x = r2; y = r3; z = r4; \ @@ -587,10 +611,10 @@ serpent_setkey (void *ctx, if (! serpent_init_done) { /* Execute a self-test the first time, Serpent is used. */ + serpent_init_done = 1; serpent_test_ret = serpent_test (); if (serpent_test_ret) log_error ("Serpent test failure: %s\n", serpent_test_ret); - serpent_init_done = 1; } if (serpent_test_ret) @@ -740,6 +764,190 @@ serpent_decrypt (void *ctx, byte *buffer_out, const byte *buffer_in) +/* Bulk encryption of complete blocks in CTR mode. This function is only + intended for the bulk encryption feature of cipher.c. CTR is expected to be + of size sizeof(serpent_block_t). */ +void +_gcry_serpent_ctr_enc(void *context, unsigned char *ctr, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks) +{ + serpent_context_t *ctx = context; + unsigned char *outbuf = outbuf_arg; + const unsigned char *inbuf = inbuf_arg; + unsigned char tmpbuf[sizeof(serpent_block_t)]; + int burn_stack_depth = 2 * sizeof (serpent_block_t); + int i; + +#ifdef USE_SSE2 + { + int did_use_sse2 = 0; + + /* Process data in 8 block chunks. */ + while (nblocks >= 8) + { + _gcry_serpent_sse2_ctr_enc(ctx, outbuf, inbuf, ctr); + + nblocks -= 8; + outbuf += 8 * sizeof(serpent_block_t); + inbuf += 8 * sizeof(serpent_block_t); + did_use_sse2 = 1; + } + + if (did_use_sse2) + { + /* clear SSE2 registers used by serpent-sse2 */ + asm volatile ( + "pxor %%xmm0, %%xmm0;\n" + "pxor %%xmm1, %%xmm1;\n" + "pxor %%xmm2, %%xmm2;\n" + "pxor %%xmm3, %%xmm3;\n" + "pxor %%xmm4, %%xmm4;\n" + "pxor %%xmm5, %%xmm5;\n" + "pxor %%xmm6, %%xmm6;\n" + "pxor %%xmm7, %%xmm7;\n" + "pxor %%xmm10, %%xmm10;\n" + "pxor %%xmm11, %%xmm11;\n" + "pxor %%xmm12, %%xmm12;\n" + "pxor %%xmm13, %%xmm13;\n" + :::); + + /* serpent-sse2 assembly code does not use stack */ + if (nblocks == 0) + burn_stack_depth = 0; + } + + /* Use generic code to handle smaller chunks... */ + /* TODO: use caching instead? */ + } +#endif + + for ( ;nblocks; nblocks-- ) + { + /* Encrypt the counter. */ + serpent_encrypt_internal(ctx, ctr, tmpbuf); + /* XOR the input with the encrypted counter and store in output. */ + buf_xor(outbuf, tmpbuf, inbuf, sizeof(serpent_block_t)); + outbuf += sizeof(serpent_block_t); + inbuf += sizeof(serpent_block_t); + /* Increment the counter. */ + for (i = sizeof(serpent_block_t); i > 0; i--) + { + ctr[i-1]++; + if (ctr[i-1]) + break; + } + } + + wipememory(tmpbuf, sizeof(tmpbuf)); + _gcry_burn_stack(burn_stack_depth); +} + +/* Bulk decryption of complete blocks in CBC mode. This function is only + intended for the bulk encryption feature of cipher.c. */ +void +_gcry_serpent_cbc_dec(void *context, unsigned char *iv, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks) +{ + serpent_context_t *ctx = context; + unsigned char *outbuf = outbuf_arg; + const unsigned char *inbuf = inbuf_arg; + unsigned char savebuf[sizeof(serpent_block_t)]; + int burn_stack_depth = 2 * sizeof (serpent_block_t); + +#ifdef USE_SSE2 + { + int did_use_sse2 = 0; + + /* Process data in 8 block chunks. */ + while (nblocks >= 8) + { + _gcry_serpent_sse2_cbc_dec(ctx, outbuf, inbuf, iv); + + nblocks -= 8; + outbuf += 8 * sizeof(serpent_block_t); + inbuf += 8 * sizeof(serpent_block_t); + did_use_sse2 = 1; + } + + if (did_use_sse2) + { + /* clear SSE2 registers used by serpent-sse2 */ + asm volatile ( + "pxor %%xmm0, %%xmm0;\n" + "pxor %%xmm1, %%xmm1;\n" + "pxor %%xmm2, %%xmm2;\n" + "pxor %%xmm3, %%xmm3;\n" + "pxor %%xmm4, %%xmm4;\n" + "pxor %%xmm5, %%xmm5;\n" + "pxor %%xmm6, %%xmm6;\n" + "pxor %%xmm7, %%xmm7;\n" + "pxor %%xmm10, %%xmm10;\n" + "pxor %%xmm11, %%xmm11;\n" + "pxor %%xmm12, %%xmm12;\n" + "pxor %%xmm13, %%xmm13;\n" + :::); + + /* serpent-sse2 assembly code does not use stack */ + if (nblocks == 0) + burn_stack_depth = 0; + } + + /* Use generic code to handle smaller chunks... */ + } +#endif + + for ( ;nblocks; nblocks-- ) + { + /* We need to save INBUF away because it may be identical to + OUTBUF. */ + memcpy(savebuf, inbuf, sizeof(serpent_block_t)); + + serpent_decrypt_internal (ctx, inbuf, outbuf); + + buf_xor(outbuf, outbuf, iv, sizeof(serpent_block_t)); + memcpy(iv, savebuf, sizeof(serpent_block_t)); + inbuf += sizeof(serpent_block_t); + outbuf += sizeof(serpent_block_t); + } + + wipememory(savebuf, sizeof(savebuf)); + _gcry_burn_stack(burn_stack_depth); +} + + + +/* Run the self-tests for SERPENT-CTR-128, tests IV increment of bulk CTR + encryption. Returns NULL on success. */ +static const char* +selftest_ctr_128 (void) +{ + const int nblocks = 8+1; + const int blocksize = sizeof(serpent_block_t); + const int context_size = sizeof(serpent_context_t); + + return _gcry_selftest_helper_ctr_128("SERPENT", &serpent_setkey, + &serpent_encrypt, &_gcry_serpent_ctr_enc, nblocks, blocksize, + context_size); +} + + +/* Run the self-tests for SERPENT-CBC-128, tests bulk CBC decryption. + Returns NULL on success. */ +static const char* +selftest_cbc_128 (void) +{ + const int nblocks = 8+2; + const int blocksize = sizeof(serpent_block_t); + const int context_size = sizeof(serpent_context_t); + + return _gcry_selftest_helper_cbc_128("SERPENT", &serpent_setkey, + &serpent_encrypt, &_gcry_serpent_cbc_dec, nblocks, blocksize, + context_size); +} + + /* Serpent test. */ static const char * @@ -748,6 +956,7 @@ serpent_test (void) serpent_context_t context; unsigned char scratch[16]; unsigned int i; + const char *r; static struct test { @@ -819,6 +1028,12 @@ serpent_test (void) } } + if ( (r = selftest_ctr_128 ()) ) + return r; + + if ( (r = selftest_cbc_128 ()) ) + return r; + return NULL; } diff --git a/configure.ac b/configure.ac index f14e28a..3fec8bc 100644 --- a/configure.ac +++ b/configure.ac @@ -1219,6 +1219,13 @@ LIST_MEMBER(serpent, $enabled_ciphers) if test "$found" = "1" ; then GCRYPT_CIPHERS="$GCRYPT_CIPHERS serpent.lo" AC_DEFINE(USE_SERPENT, 1, [Defined if this module should be included]) + + case "${host}" in + x86_64-*-*) + # Build with the SSE2 implementation + GCRYPT_CIPHERS="$GCRYPT_CIPHERS serpent-sse2-amd64.lo" + ;; + esac fi LIST_MEMBER(rfc2268, $enabled_ciphers) diff --git a/src/cipher.h b/src/cipher.h index 17fec6c..4e68487 100644 --- a/src/cipher.h +++ b/src/cipher.h @@ -103,6 +103,13 @@ void _gcry_camellia_cbc_dec (void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, unsigned int nblocks); +/*-- serpent.c --*/ +void _gcry_serpent_ctr_enc (void *context, unsigned char *ctr, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks); +void _gcry_serpent_cbc_dec (void *context, unsigned char *iv, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks); /*-- dsa.c --*/ void _gcry_register_pk_dsa_progress (gcry_handler_progress_t cbc, void *cb_data); commit c85501af8222913f0a1e20e77fceb88e93417925 Author: Jussi Kivilinna Date: Thu May 23 11:04:13 2013 +0300 Serpent: faster S-box implementation * cipher/serpent.c (SBOX0, SBOX1, SBOX2, SBOX3, SBOX4, SBOX5, SBOX6) (SBOX7, SBOX0_INVERSE, SBOX1_INVERSE, SBOX2_INVERSE, SBOX3_INVERSE) (SBOX4_INVERSE, SBOX5_INVERSE, SBOX6_INVERSE, SBOX7_INVERSE): Replace with new definitions. -- These new S-box definitions are from paper: D. A. Osvik, ?Speeding up Serpent,? in Third AES Candidate Conference, (New York, New York, USA), p. 317?329, National Institute of Standards and Technology, 2000. Available at http://www.ii.uib.no/~osvik/pub/aes3.ps.gz Although these were optimized for two-operand instructions on i386 and for old Pentium-1 processors, they are slightly faster on current processors on i386 and x86-64. On ARM, the performance of these S-boxes is about the same as with the old S-boxes. new vs old speed ratios (AMD K10, x86-64): ECB/Stream CBC CFB OFB CTR --------------- --------------- --------------- --------------- --------------- SERPENT128 1.06x 1.02x 1.06x 1.02x 1.06x 1.06x 1.06x 1.05x 1.07x 1.07x new vs old speed ratios (Intel Atom, i486): ECB/Stream CBC CFB OFB CTR --------------- --------------- --------------- --------------- --------------- SERPENT128 1.12x 1.15x 1.12x 1.15x 1.13x 1.11x 1.12x 1.12x 1.12x 1.13x new vs old speed ratios (ARM Cortex A8): ECB/Stream CBC CFB OFB CTR --------------- --------------- --------------- --------------- --------------- SERPENT128 1.04x 1.02x 1.02x 0.99x 1.02x 1.02x 1.03x 1.03x 1.01x 1.01x Signed-off-by: Jussi Kivilinna diff --git a/cipher/serpent.c b/cipher/serpent.c index ea14c7e..72840cf 100644 --- a/cipher/serpent.c +++ b/cipher/serpent.c @@ -61,403 +61,303 @@ static const char *serpent_test (void); | (((x) & 0xff000000) >> 24) | (((x) & 0x00ff0000) >> 8) \ | (((x) & 0x0000ff00) << 8) | (((x) & 0x000000ff) << 24)) -/* These are the S-Boxes of Serpent. They are copied from Serpents - reference implementation (the optimized one, contained in - `floppy2') and are therefore: - - Copyright (C) 1998 Ross Anderson, Eli Biham, Lars Knudsen. - - To quote the Serpent homepage - (http://www.cl.cam.ac.uk/~rja14/serpent.html): - - "Serpent is now completely in the public domain, and we impose no - restrictions on its use. This was announced on the 21st August at - the First AES Candidate Conference. The optimised implementations - in the submission package are now under the GNU PUBLIC LICENSE - (GPL), although some comments in the code still say otherwise. You - are welcome to use Serpent for any application." */ +/* + * These are the S-Boxes of Serpent from following research paper. + * + * D. A. Osvik, ?Speeding up Serpent,? in Third AES Candidate Conference, + * (New York, New York, USA), p. 317?329, National Institute of Standards and + * Technology, 2000. + * + * Paper is also available at: http://www.ii.uib.no/~osvik/pub/aes3.pdf + * + */ -#define SBOX0(a, b, c, d, w, x, y, z) \ +#define SBOX0(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t05, t06, t07, t08, t09; \ - u32 t11, t12, t13, t14, t15, t17, t01; \ - t01 = b ^ c ; \ - t02 = a | d ; \ - t03 = a ^ b ; \ - z = t02 ^ t01; \ - t05 = c | z ; \ - t06 = a ^ d ; \ - t07 = b | c ; \ - t08 = d & t05; \ - t09 = t03 & t07; \ - y = t09 ^ t08; \ - t11 = t09 & y ; \ - t12 = c ^ d ; \ - t13 = t07 ^ t11; \ - t14 = b & t06; \ - t15 = t06 ^ t13; \ - w = ~ t15; \ - t17 = w ^ t14; \ - x = t12 ^ t17; \ + u32 r4; \ + \ + r3 ^= r0; r4 = r1; \ + r1 &= r3; r4 ^= r2; \ + r1 ^= r0; r0 |= r3; \ + r0 ^= r4; r4 ^= r3; \ + r3 ^= r2; r2 |= r1; \ + r2 ^= r4; r4 = ~r4; \ + r4 |= r1; r1 ^= r3; \ + r1 ^= r4; r3 |= r0; \ + r1 ^= r3; r4 ^= r3; \ + \ + w = r1; x = r4; y = r2; z = r0; \ } -#define SBOX0_INVERSE(a, b, c, d, w, x, y, z) \ +#define SBOX0_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t05, t06, t08, t09, t10; \ - u32 t12, t13, t14, t15, t17, t18, t01; \ - t01 = c ^ d ; \ - t02 = a | b ; \ - t03 = b | c ; \ - t04 = c & t01; \ - t05 = t02 ^ t01; \ - t06 = a | t04; \ - y = ~ t05; \ - t08 = b ^ d ; \ - t09 = t03 & t08; \ - t10 = d | y ; \ - x = t09 ^ t06; \ - t12 = a | t05; \ - t13 = x ^ t12; \ - t14 = t03 ^ t10; \ - t15 = a ^ c ; \ - z = t14 ^ t13; \ - t17 = t05 & t13; \ - t18 = t14 | t17; \ - w = t15 ^ t18; \ + u32 r4; \ + \ + r2 = ~r2; r4 = r1; \ + r1 |= r0; r4 = ~r4; \ + r1 ^= r2; r2 |= r4; \ + r1 ^= r3; r0 ^= r4; \ + r2 ^= r0; r0 &= r3; \ + r4 ^= r0; r0 |= r1; \ + r0 ^= r2; r3 ^= r4; \ + r2 ^= r1; r3 ^= r0; \ + r3 ^= r1; \ + r2 &= r3; \ + r4 ^= r2; \ + \ + w = r0; x = r4; y = r1; z = r3; \ } -#define SBOX1(a, b, c, d, w, x, y, z) \ +#define SBOX1(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t05, t06, t07, t08; \ - u32 t10, t11, t12, t13, t16, t17, t01; \ - t01 = a | d ; \ - t02 = c ^ d ; \ - t03 = ~ b ; \ - t04 = a ^ c ; \ - t05 = a | t03; \ - t06 = d & t04; \ - t07 = t01 & t02; \ - t08 = b | t06; \ - y = t02 ^ t05; \ - t10 = t07 ^ t08; \ - t11 = t01 ^ t10; \ - t12 = y ^ t11; \ - t13 = b & d ; \ - z = ~ t10; \ - x = t13 ^ t12; \ - t16 = t10 | x ; \ - t17 = t05 & t16; \ - w = c ^ t17; \ + u32 r4; \ + \ + r0 = ~r0; r2 = ~r2; \ + r4 = r0; r0 &= r1; \ + r2 ^= r0; r0 |= r3; \ + r3 ^= r2; r1 ^= r0; \ + r0 ^= r4; r4 |= r1; \ + r1 ^= r3; r2 |= r0; \ + r2 &= r4; r0 ^= r1; \ + r1 &= r2; \ + r1 ^= r0; r0 &= r2; \ + r0 ^= r4; \ + \ + w = r2; x = r0; y = r3; z = r1; \ } -#define SBOX1_INVERSE(a, b, c, d, w, x, y, z) \ +#define SBOX1_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t05, t06, t07, t08; \ - u32 t09, t10, t11, t14, t15, t17, t01; \ - t01 = a ^ b ; \ - t02 = b | d ; \ - t03 = a & c ; \ - t04 = c ^ t02; \ - t05 = a | t04; \ - t06 = t01 & t05; \ - t07 = d | t03; \ - t08 = b ^ t06; \ - t09 = t07 ^ t06; \ - t10 = t04 | t03; \ - t11 = d & t08; \ - y = ~ t09; \ - x = t10 ^ t11; \ - t14 = a | y ; \ - t15 = t06 ^ x ; \ - z = t01 ^ t04; \ - t17 = c ^ t15; \ - w = t14 ^ t17; \ + u32 r4; \ + \ + r4 = r1; r1 ^= r3; \ + r3 &= r1; r4 ^= r2; \ + r3 ^= r0; r0 |= r1; \ + r2 ^= r3; r0 ^= r4; \ + r0 |= r2; r1 ^= r3; \ + r0 ^= r1; r1 |= r3; \ + r1 ^= r0; r4 = ~r4; \ + r4 ^= r1; r1 |= r0; \ + r1 ^= r0; \ + r1 |= r4; \ + r3 ^= r1; \ + \ + w = r4; x = r0; y = r3; z = r2; \ } -#define SBOX2(a, b, c, d, w, x, y, z) \ +#define SBOX2(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t05, t06, t07, t08; \ - u32 t09, t10, t12, t13, t14, t01; \ - t01 = a | c ; \ - t02 = a ^ b ; \ - t03 = d ^ t01; \ - w = t02 ^ t03; \ - t05 = c ^ w ; \ - t06 = b ^ t05; \ - t07 = b | t05; \ - t08 = t01 & t06; \ - t09 = t03 ^ t07; \ - t10 = t02 | t09; \ - x = t10 ^ t08; \ - t12 = a | d ; \ - t13 = t09 ^ x ; \ - t14 = b ^ t13; \ - z = ~ t09; \ - y = t12 ^ t14; \ + u32 r4; \ + \ + r4 = r0; r0 &= r2; \ + r0 ^= r3; r2 ^= r1; \ + r2 ^= r0; r3 |= r4; \ + r3 ^= r1; r4 ^= r2; \ + r1 = r3; r3 |= r4; \ + r3 ^= r0; r0 &= r1; \ + r4 ^= r0; r1 ^= r3; \ + r1 ^= r4; r4 = ~r4; \ + \ + w = r2; x = r3; y = r1; z = r4; \ } -#define SBOX2_INVERSE(a, b, c, d, w, x, y, z) \ +#define SBOX2_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t06, t07, t08, t09; \ - u32 t10, t11, t12, t15, t16, t17, t01; \ - t01 = a ^ d ; \ - t02 = c ^ d ; \ - t03 = a & c ; \ - t04 = b | t02; \ - w = t01 ^ t04; \ - t06 = a | c ; \ - t07 = d | w ; \ - t08 = ~ d ; \ - t09 = b & t06; \ - t10 = t08 | t03; \ - t11 = b & t07; \ - t12 = t06 & t02; \ - z = t09 ^ t10; \ - x = t12 ^ t11; \ - t15 = c & z ; \ - t16 = w ^ x ; \ - t17 = t10 ^ t15; \ - y = t16 ^ t17; \ + u32 r4; \ + \ + r2 ^= r3; r3 ^= r0; \ + r4 = r3; r3 &= r2; \ + r3 ^= r1; r1 |= r2; \ + r1 ^= r4; r4 &= r3; \ + r2 ^= r3; r4 &= r0; \ + r4 ^= r2; r2 &= r1; \ + r2 |= r0; r3 = ~r3; \ + r2 ^= r3; r0 ^= r3; \ + r0 &= r1; r3 ^= r4; \ + r3 ^= r0; \ + \ + w = r1; x = r4; y = r2; z = r3; \ } -#define SBOX3(a, b, c, d, w, x, y, z) \ +#define SBOX3(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t05, t06, t07, t08; \ - u32 t09, t10, t11, t13, t14, t15, t01; \ - t01 = a ^ c ; \ - t02 = a | d ; \ - t03 = a & d ; \ - t04 = t01 & t02; \ - t05 = b | t03; \ - t06 = a & b ; \ - t07 = d ^ t04; \ - t08 = c | t06; \ - t09 = b ^ t07; \ - t10 = d & t05; \ - t11 = t02 ^ t10; \ - z = t08 ^ t09; \ - t13 = d | z ; \ - t14 = a | t07; \ - t15 = b & t13; \ - y = t08 ^ t11; \ - w = t14 ^ t15; \ - x = t05 ^ t04; \ + u32 r4; \ + \ + r4 = r0; r0 |= r3; \ + r3 ^= r1; r1 &= r4; \ + r4 ^= r2; r2 ^= r3; \ + r3 &= r0; r4 |= r1; \ + r3 ^= r4; r0 ^= r1; \ + r4 &= r0; r1 ^= r3; \ + r4 ^= r2; r1 |= r0; \ + r1 ^= r2; r0 ^= r3; \ + r2 = r1; r1 |= r3; \ + r1 ^= r0; \ + \ + w = r1; x = r2; y = r3; z = r4; \ } -#define SBOX3_INVERSE(a, b, c, d, w, x, y, z) \ +#define SBOX3_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t05, t06, t07, t09; \ - u32 t11, t12, t13, t14, t16, t01; \ - t01 = c | d ; \ - t02 = a | d ; \ - t03 = c ^ t02; \ - t04 = b ^ t02; \ - t05 = a ^ d ; \ - t06 = t04 & t03; \ - t07 = b & t01; \ - y = t05 ^ t06; \ - t09 = a ^ t03; \ - w = t07 ^ t03; \ - t11 = w | t05; \ - t12 = t09 & t11; \ - t13 = a & y ; \ - t14 = t01 ^ t05; \ - x = b ^ t12; \ - t16 = b | t13; \ - z = t14 ^ t16; \ + u32 r4; \ + \ + r4 = r2; r2 ^= r1; \ + r0 ^= r2; r4 &= r2; \ + r4 ^= r0; r0 &= r1; \ + r1 ^= r3; r3 |= r4; \ + r2 ^= r3; r0 ^= r3; \ + r1 ^= r4; r3 &= r2; \ + r3 ^= r1; r1 ^= r0; \ + r1 |= r2; r0 ^= r3; \ + r1 ^= r4; \ + r0 ^= r1; \ + \ + w = r2; x = r1; y = r3; z = r0; \ } -#define SBOX4(a, b, c, d, w, x, y, z) \ +#define SBOX4(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t05, t06, t08, t09; \ - u32 t10, t11, t12, t13, t14, t15, t16, t01; \ - t01 = a | b ; \ - t02 = b | c ; \ - t03 = a ^ t02; \ - t04 = b ^ d ; \ - t05 = d | t03; \ - t06 = d & t01; \ - z = t03 ^ t06; \ - t08 = z & t04; \ - t09 = t04 & t05; \ - t10 = c ^ t06; \ - t11 = b & c ; \ - t12 = t04 ^ t08; \ - t13 = t11 | t03; \ - t14 = t10 ^ t09; \ - t15 = a & t05; \ - t16 = t11 | t12; \ - y = t13 ^ t08; \ - x = t15 ^ t16; \ - w = ~ t14; \ + u32 r4; \ + \ + r1 ^= r3; r3 = ~r3; \ + r2 ^= r3; r3 ^= r0; \ + r4 = r1; r1 &= r3; \ + r1 ^= r2; r4 ^= r3; \ + r0 ^= r4; r2 &= r4; \ + r2 ^= r0; r0 &= r1; \ + r3 ^= r0; r4 |= r1; \ + r4 ^= r0; r0 |= r3; \ + r0 ^= r2; r2 &= r3; \ + r0 = ~r0; r4 ^= r2; \ + \ + w = r1; x = r4; y = r0; z = r3; \ } -#define SBOX4_INVERSE(a, b, c, d, w, x, y, z) \ +#define SBOX4_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t05, t06, t07, t09; \ - u32 t10, t11, t12, t13, t15, t01; \ - t01 = b | d ; \ - t02 = c | d ; \ - t03 = a & t01; \ - t04 = b ^ t02; \ - t05 = c ^ d ; \ - t06 = ~ t03; \ - t07 = a & t04; \ - x = t05 ^ t07; \ - t09 = x | t06; \ - t10 = a ^ t07; \ - t11 = t01 ^ t09; \ - t12 = d ^ t04; \ - t13 = c | t10; \ - z = t03 ^ t12; \ - t15 = a ^ t04; \ - y = t11 ^ t13; \ - w = t15 ^ t09; \ + u32 r4; \ + \ + r4 = r2; r2 &= r3; \ + r2 ^= r1; r1 |= r3; \ + r1 &= r0; r4 ^= r2; \ + r4 ^= r1; r1 &= r2; \ + r0 = ~r0; r3 ^= r4; \ + r1 ^= r3; r3 &= r0; \ + r3 ^= r2; r0 ^= r1; \ + r2 &= r0; r3 ^= r0; \ + r2 ^= r4; \ + r2 |= r3; r3 ^= r0; \ + r2 ^= r1; \ + \ + w = r0; x = r3; y = r2; z = r4; \ } -#define SBOX5(a, b, c, d, w, x, y, z) \ +#define SBOX5(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t05, t07, t08, t09; \ - u32 t10, t11, t12, t13, t14, t01; \ - t01 = b ^ d ; \ - t02 = b | d ; \ - t03 = a & t01; \ - t04 = c ^ t02; \ - t05 = t03 ^ t04; \ - w = ~ t05; \ - t07 = a ^ t01; \ - t08 = d | w ; \ - t09 = b | t05; \ - t10 = d ^ t08; \ - t11 = b | t07; \ - t12 = t03 | w ; \ - t13 = t07 | t10; \ - t14 = t01 ^ t11; \ - y = t09 ^ t13; \ - x = t07 ^ t08; \ - z = t12 ^ t14; \ + u32 r4; \ + \ + r0 ^= r1; r1 ^= r3; \ + r3 = ~r3; r4 = r1; \ + r1 &= r0; r2 ^= r3; \ + r1 ^= r2; r2 |= r4; \ + r4 ^= r3; r3 &= r1; \ + r3 ^= r0; r4 ^= r1; \ + r4 ^= r2; r2 ^= r0; \ + r0 &= r3; r2 = ~r2; \ + r0 ^= r4; r4 |= r3; \ + r2 ^= r4; \ + \ + w = r1; x = r3; y = r0; z = r2; \ } -#define SBOX5_INVERSE(a, b, c, d, w, x, y, z) \ +#define SBOX5_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t05, t07, t08, t09; \ - u32 t10, t12, t13, t15, t16, t01; \ - t01 = a & d ; \ - t02 = c ^ t01; \ - t03 = a ^ d ; \ - t04 = b & t02; \ - t05 = a & c ; \ - w = t03 ^ t04; \ - t07 = a & w ; \ - t08 = t01 ^ w ; \ - t09 = b | t05; \ - t10 = ~ b ; \ - x = t08 ^ t09; \ - t12 = t10 | t07; \ - t13 = w | x ; \ - z = t02 ^ t12; \ - t15 = t02 ^ t13; \ - t16 = b ^ d ; \ - y = t16 ^ t15; \ + u32 r4; \ + \ + r1 = ~r1; r4 = r3; \ + r2 ^= r1; r3 |= r0; \ + r3 ^= r2; r2 |= r1; \ + r2 &= r0; r4 ^= r3; \ + r2 ^= r4; r4 |= r0; \ + r4 ^= r1; r1 &= r2; \ + r1 ^= r3; r4 ^= r2; \ + r3 &= r4; r4 ^= r1; \ + r3 ^= r4; r4 = ~r4; \ + r3 ^= r0; \ + \ + w = r1; x = r4; y = r3; z = r2; \ } -#define SBOX6(a, b, c, d, w, x, y, z) \ +#define SBOX6(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t05, t07, t08, t09, t10; \ - u32 t11, t12, t13, t15, t17, t18, t01; \ - t01 = a & d ; \ - t02 = b ^ c ; \ - t03 = a ^ d ; \ - t04 = t01 ^ t02; \ - t05 = b | c ; \ - x = ~ t04; \ - t07 = t03 & t05; \ - t08 = b & x ; \ - t09 = a | c ; \ - t10 = t07 ^ t08; \ - t11 = b | d ; \ - t12 = c ^ t11; \ - t13 = t09 ^ t10; \ - y = ~ t13; \ - t15 = x & t03; \ - z = t12 ^ t07; \ - t17 = a ^ b ; \ - t18 = y ^ t15; \ - w = t17 ^ t18; \ + u32 r4; \ + \ + r2 = ~r2; r4 = r3; \ + r3 &= r0; r0 ^= r4; \ + r3 ^= r2; r2 |= r4; \ + r1 ^= r3; r2 ^= r0; \ + r0 |= r1; r2 ^= r1; \ + r4 ^= r0; r0 |= r3; \ + r0 ^= r2; r4 ^= r3; \ + r4 ^= r0; r3 = ~r3; \ + r2 &= r4; \ + r2 ^= r3; \ + \ + w = r0; x = r1; y = r4; z = r2; \ } -#define SBOX6_INVERSE(a, b, c, d, w, x, y, z) \ +#define SBOX6_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t05, t06, t07, t08, t09; \ - u32 t12, t13, t14, t15, t16, t17, t01; \ - t01 = a ^ c ; \ - t02 = ~ c ; \ - t03 = b & t01; \ - t04 = b | t02; \ - t05 = d | t03; \ - t06 = b ^ d ; \ - t07 = a & t04; \ - t08 = a | t02; \ - t09 = t07 ^ t05; \ - x = t06 ^ t08; \ - w = ~ t09; \ - t12 = b & w ; \ - t13 = t01 & t05; \ - t14 = t01 ^ t12; \ - t15 = t07 ^ t13; \ - t16 = d | t02; \ - t17 = a ^ x ; \ - z = t17 ^ t15; \ - y = t16 ^ t14; \ + u32 r4; \ + \ + r0 ^= r2; r4 = r2; \ + r2 &= r0; r4 ^= r3; \ + r2 = ~r2; r3 ^= r1; \ + r2 ^= r3; r4 |= r0; \ + r0 ^= r2; r3 ^= r4; \ + r4 ^= r1; r1 &= r3; \ + r1 ^= r0; r0 ^= r3; \ + r0 |= r2; r3 ^= r1; \ + r4 ^= r0; \ + \ + w = r1; x = r2; y = r4; z = r3; \ } -#define SBOX7(a, b, c, d, w, x, y, z) \ +#define SBOX7(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t05, t06, t08, t09, t10; \ - u32 t11, t13, t14, t15, t16, t17, t01; \ - t01 = a & c ; \ - t02 = ~ d ; \ - t03 = a & t02; \ - t04 = b | t01; \ - t05 = a & b ; \ - t06 = c ^ t04; \ - z = t03 ^ t06; \ - t08 = c | z ; \ - t09 = d | t05; \ - t10 = a ^ t08; \ - t11 = t04 & z ; \ - x = t09 ^ t10; \ - t13 = b ^ x ; \ - t14 = t01 ^ x ; \ - t15 = c ^ t05; \ - t16 = t11 | t13; \ - t17 = t02 | t14; \ - w = t15 ^ t17; \ - y = a ^ t16; \ + u32 r4; \ + \ + r4 = r1; r1 |= r2; \ + r1 ^= r3; r4 ^= r2; \ + r2 ^= r1; r3 |= r4; \ + r3 &= r0; r4 ^= r2; \ + r3 ^= r1; r1 |= r4; \ + r1 ^= r0; r0 |= r4; \ + r0 ^= r2; r1 ^= r4; \ + r2 ^= r1; r1 &= r0; \ + r1 ^= r4; r2 = ~r2; \ + r2 |= r0; \ + r4 ^= r2; \ + \ + w = r4; x = r3; y = r1; z = r0; \ } -#define SBOX7_INVERSE(a, b, c, d, w, x, y, z) \ +#define SBOX7_INVERSE(r0, r1, r2, r3, w, x, y, z) \ { \ - u32 t02, t03, t04, t06, t07, t08, t09; \ - u32 t10, t11, t13, t14, t15, t16, t01; \ - t01 = a & b ; \ - t02 = a | b ; \ - t03 = c | t01; \ - t04 = d & t02; \ - z = t03 ^ t04; \ - t06 = b ^ t04; \ - t07 = d ^ z ; \ - t08 = ~ t07; \ - t09 = t06 | t08; \ - t10 = b ^ d ; \ - t11 = a | d ; \ - x = a ^ t09; \ - t13 = c ^ t06; \ - t14 = c & t11; \ - t15 = d | x ; \ - t16 = t01 | t10; \ - w = t13 ^ t15; \ - y = t14 ^ t16; \ + u32 r4; \ + \ + r4 = r2; r2 ^= r0; \ + r0 &= r3; r4 |= r3; \ + r2 = ~r2; r3 ^= r1; \ + r1 |= r0; r0 ^= r2; \ + r2 &= r4; r3 &= r4; \ + r1 ^= r2; r2 ^= r0; \ + r0 |= r2; r4 ^= r1; \ + r0 ^= r3; r3 ^= r4; \ + r4 |= r0; r3 ^= r2; \ + r4 ^= r2; \ + \ + w = r3; x = r0; y = r1; z = r4; \ } /* XOR BLOCK1 into BLOCK0. */ ----------------------------------------------------------------------- Summary of changes: cipher/Makefile.am | 2 +- cipher/cipher-selftest.c | 10 +- cipher/cipher.c | 8 + cipher/serpent-sse2-amd64.S | 826 +++++++++++++++++++++++++++++++++++++++++++ cipher/serpent.c | 817 ++++++++++++++++++++++++------------------ configure.ac | 7 + src/cipher.h | 7 + 7 files changed, 1321 insertions(+), 356 deletions(-) create mode 100644 cipher/serpent-sse2-amd64.S hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 23 17:02:24 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 23 May 2013 17:02:24 +0200 Subject: [git] GPG-ERROR - branch, master, updated. libgpg-error-1.11-3-gdd05f37 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Error codes used by GnuPG et al.". The branch, master has been updated via dd05f3790e536dec6ed56087780a1065ca66371e (commit) via d2e6d96dfd2acc855b244a972269adfcf477cd10 (commit) from 5763c8135c02b2e99214647e0619e939ef9a95f8 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit dd05f3790e536dec6ed56087780a1065ca66371e Author: Werner Koch Date: Thu Apr 18 14:40:43 2013 +0200 Fix libtool 2.4.2 to correctly detect .def files. * ltmain.sh (sed_uncomment_deffile): New. (orig_export_symbols): Uncomment def file before testing for EXPORTS. * m4/libtool.m4: Do the same for the generated code. -- The old code was not correct in that it only looked at the first line and puts an EXPORTS keyword in front if missing. Binutils 2.22 accepted a duplicated EXPORTS keyword but at least 2.23.2 is more stringent and bails out without this fix. There is no need to send this upstream. Upstream's git master has a lot of changes including a similar fix for this problems. There are no signs that a libtool 2.4.3 will be released to fix this problem and thus we need to stick to our copy of 2.4.2 along with this patch. Signed-off-by: Werner Koch diff --git a/ltmain.sh b/ltmain.sh index c7d06c3..24e3fd3 100644 --- a/ltmain.sh +++ b/ltmain.sh @@ -411,6 +411,10 @@ sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' +# Sed substitution to remove simple comments and empty +# lines from a Windows .def file. +sed_uncomment_deffile='/^;/d; /^[ ]*$/d' + # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. @@ -8143,7 +8147,7 @@ EOF cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile - if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + if test "x`$SED "$sed_uncomment_deffile" $export_symbols | $SED 1q`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. diff --git a/m4/libtool.m4 b/m4/libtool.m4 index 4bedbd3..ff871a0 100644 --- a/m4/libtool.m4 +++ b/m4/libtool.m4 @@ -4773,7 +4773,7 @@ _LT_EOF _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED \"$sed_uncomment_deffile\" $export_symbols | $SED 1q`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; @@ -5150,7 +5150,7 @@ _LT_EOF shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED \"$sed_uncomment_deffile\" $export_symbols | $SED 1q`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; @@ -6149,7 +6149,7 @@ if test "$_lt_caught_CXX_error" != yes; then shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED \"$sed_uncomment_deffile\" $export_symbols | $SED 1q`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; @@ -6190,7 +6190,7 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED \"$sed_uncomment_deffile\" $export_symbols | $SED 1q`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; commit d2e6d96dfd2acc855b244a972269adfcf477cd10 Author: Werner Koch Date: Thu Apr 11 16:27:41 2013 +0200 Add GPG_ERR_*CRYPT_CTX* and GPG_ERR_BROKEN_*KEY. * src/err-codes.h.in (GPG_ERR_NO_CRYPT_CTX): New. (GPG_ERR_WRONG_CRYPT_CTX, GPG_ERR_BAD_CRYPT_CTX): New. (GPG_ERR_CRYPT_CTX_CONFLICT): New. (GPG_ERR_BROKEN_PUBKEY, GPG_ERR_BROKEN_SECKEY): New. diff --git a/NEWS b/NEWS index a53444e..8dd35ff 100644 --- a/NEWS +++ b/NEWS @@ -1,6 +1,15 @@ Noteworthy changes in version 1.12 (unreleased) ----------------------------------------------- + * Interface changes relative to the 1.11 release: + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + GPG_ERR_NO_CRYPT_CTX NEW. + GPG_ERR_WRONG_CRYPT_CTX NEW. + GPG_ERR_BAD_CRYPT_CTX NEW. + GPG_ERR_CRYPT_CTX_CONFLICT NEW. + GPG_ERR_BROKEN_PUBKEY NEW. + GPG_ERR_BROKEN_SECKEY NEW. + Noteworthy changes in version 1.11 (2013-02-25) ----------------------------------------------- diff --git a/doc/errorref.txt b/doc/errorref.txt index eafd9d8..2986937 100644 --- a/doc/errorref.txt +++ b/doc/errorref.txt @@ -258,7 +258,14 @@ GPG_ERR_INV_NAME Invalid name [more to come] 89 GPG_ERR_BAD_DATA Bad data -90 GPG_ERR_INV_PARAMETER Invalid parameter + +GPG_ERR_INV_PARAMETER Invalid parameter + + GNUPG: - Returned if gpg-agent sends a new generated key with + unknown parameter names. + - Invalid parameter in the parameter file for key + generation by gpgsm. + 91 GPG_ERR_WRONG_CARD Wrong card 92 GPG_ERR_NO_DIRMNGR No dirmngr 93 GPG_ERR_DIRMNGR dirmngr error @@ -401,8 +408,9 @@ GPG_ERR_INV_CERT_OBJ Invalid certificate object 165 GPG_ERR_UNKNOWN_NAME Unknown name Used by GPG to indicate an unknown ECC curve name (may also - indicate missing ECC support). - + indicate missing ECC support). It is also used to indicate an + unsuported parameter name in functions which take a name and + value to update state. 166 GPG_ERR_LOCALE_PROBLEM A locale function failed 167 GPG_ERR_NOT_LOCKED Not locked @@ -446,6 +454,16 @@ GPG_ERR_LIMIT_REACHED Limit reached GnuPG: gpgtar: Extract directory can't be created because too many of directories with a similar name are already existing. +184 GPG_ERR_NOT_INITIALIZED Not initialized +185 GPG_ERR_MISSING_ISSUER_CERT Missing issuer certificate +186 GPG_ERR_NO_KEYSERVER No keyserver available + +GPG_ERR_INV_CURVE Invalid elliptic curve + + The curve is missing parameters or the curve is invald, for example + it is not possible to get affine coordinates for the public key. + +188 GPG_ERR_UNKNOWN_CURVE Unknown elliptic curve GPG_ERR_DUP_KEY Duplicated key @@ -457,6 +475,41 @@ GPG_ERR_AMBIGUOUS Ambiguous search A search etc returned an ambigious result. This usually means that the search string was not specific enough. +GPG_ERR_NO_CRYPT_CTX No crypto context + + A crypto context was expected but not given. Commonly used by + Libgcrypt. + +GPG_ERR_WRONG_CRYPT_CTX Wrong crypto context + + The given crypto context does not match the requirements. For + example in Libgcrypt a crypto context has private data + pertaining to certain algorithms. This error is for example + returned if a crypto context initialized for a different + algorithm is used. + +GPG_ERR_BAD_CRYPT_CTX Bad crypto context + + The is a problem with the crypto context. For example it has + not been properly initialized. + +GPG_ERR_CRYPT_CTX_CONFLICT Conflict in the crypto context + + Conflicting use of a crypto context. For example if a context + is used with objects that don't match the state of the + context. + +GPG_ERR_BROKEN_PUBKEY Broken public key + + The public key was mathematically not correctly generated. + (It would have been nicer if we would have used BAD_PUBKEY for + this, but that error code is in long time use to describe for + example policy and encoding problems with a key. Using + INV_PUBKEY would have been better for these purposes) + +GPG_ERR_BROKEN_SECKEY Broken secret key + + The secret key was mathematically not correctly generated. 199 GPG_ERR_UNFINISHED Operation not yet finished 200 GPG_ERR_BUFFER_TOO_SHORT Buffer too short diff --git a/src/err-codes.h.in b/src/err-codes.h.in index fd7030d..9c213de 100644 --- a/src/err-codes.h.in +++ b/src/err-codes.h.in @@ -220,8 +220,13 @@ 188 GPG_ERR_UNKNOWN_CURVE Unknown elliptic curve 189 GPG_ERR_DUP_KEY Duplicated key 190 GPG_ERR_AMBIGUOUS Ambiguous result -# 191 to 197 are free to be used. - +191 GPG_ERR_NO_CRYPT_CTX No crypto context +192 GPG_ERR_WRONG_CRYPT_CTX Wrong crypto context +193 GPG_ERR_BAD_CRYPT_CTX Bad crypto context +194 GPG_ERR_CRYPT_CTX_CONFLICT Conflict in the crypto context +195 GPG_ERR_BROKEN_PUBKEY Broken public key +196 GPG_ERR_BROKEN_SECKEY Broken secret key +# 197 is free to be used. 198 GPG_ERR_FULLY_CANCELED Operation fully cancelled 199 GPG_ERR_UNFINISHED Operation not yet finished 200 GPG_ERR_BUFFER_TOO_SHORT Buffer too short ----------------------------------------------------------------------- Summary of changes: NEWS | 9 ++++++++ doc/errorref.txt | 59 +++++++++++++++++++++++++++++++++++++++++++++++++-- ltmain.sh | 6 ++++- m4/libtool.m4 | 8 +++--- src/err-codes.h.in | 9 ++++++- 5 files changed, 81 insertions(+), 10 deletions(-) hooks/post-receive -- Error codes used by GnuPG et al. http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 23 17:16:06 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 23 May 2013 17:16:06 +0200 Subject: [git] GPG-ERROR - branch, master, updated. libgpg-error-1.11-4-gdb43814 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "Error codes used by GnuPG et al.". The branch, master has been updated via db438148df9623528aa7305b6d56edd23db8cbbe (commit) from dd05f3790e536dec6ed56087780a1065ca66371e (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit db438148df9623528aa7305b6d56edd23db8cbbe Author: Werner Koch Date: Thu Apr 18 14:40:43 2013 +0200 w32: Fix installing of .def file. * src/Makefile.am (install-def-file): Create libdir first. -- Reported-by: LRN diff --git a/src/Makefile.am b/src/Makefile.am index cf9a364..7143dbd 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -73,6 +73,7 @@ no_undefined = -no-undefined export_symbols = -export-symbols gpg-error.def install-def-file: gpg-error.def + -$(INSTALL) -d $(DESTDIR)$(libdir) $(INSTALL) gpg-error.def $(DESTDIR)$(libdir)/gpg-error.def uninstall-def-file: ----------------------------------------------------------------------- Summary of changes: src/Makefile.am | 1 + 1 files changed, 1 insertions(+), 0 deletions(-) hooks/post-receive -- Error codes used by GnuPG et al. http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 23 17:59:37 2013 From: cvs at cvs.gnupg.org (by Jussi Kivilinna) Date: Thu, 23 May 2013 17:59:37 +0200 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.5.0-141-g6deb0cc Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via 6deb0ccdf718a0670f80e6762a3842caf76437d6 (commit) via b60f06f70227c1e69e1010da8b47ea51ade48145 (commit) via 319ee14f2aab8db56a830fd7ac8926f91b4f738a (commit) from b402de8b9c4a9f269faf03ca952b1eb68a1f33c8 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 6deb0ccdf718a0670f80e6762a3842caf76437d6 Author: Jussi Kivilinna Date: Thu May 23 14:15:51 2013 +0300 serpent: add parallel processing for CFB decryption * cipher/cipher.c (gcry_cipher_open): Add bulf CFB decryption function for Serpent. * cipher/serpent-sse2-amd64.S (_gcry_serpent_sse2_cfb_dec): New function. * cipher/serpent.c (_gcry_serpent_sse2_cfb_dec): New prototype. (_gcry_serpent_cfb_dec) New function. (selftest_cfb_128) New function. (selftest) Call selftest_cfb_128. * src/cipher.h (_gcry_serpent_cfb_dec): New prototype. -- Patch makes Serpent-CFB decryption 4.0 times faster on Intel Sandy-Bridge and 2.7 times faster on AMD K10. Signed-off-by: Jussi Kivilinna diff --git a/cipher/cipher.c b/cipher/cipher.c index e9a652f..652d795 100644 --- a/cipher/cipher.c +++ b/cipher/cipher.c @@ -732,6 +732,7 @@ gcry_cipher_open (gcry_cipher_hd_t *handle, case GCRY_CIPHER_SERPENT192: case GCRY_CIPHER_SERPENT256: h->bulk.cbc_dec = _gcry_serpent_cbc_dec; + h->bulk.cfb_dec = _gcry_serpent_cfb_dec; h->bulk.ctr_enc = _gcry_serpent_ctr_enc; break; #endif /*USE_SERPENT*/ diff --git a/cipher/serpent-sse2-amd64.S b/cipher/serpent-sse2-amd64.S index 8d8c8dd..5f9e9d2 100644 --- a/cipher/serpent-sse2-amd64.S +++ b/cipher/serpent-sse2-amd64.S @@ -822,5 +822,71 @@ _gcry_serpent_sse2_cbc_dec: ret .size _gcry_serpent_sse2_cbc_dec,.-_gcry_serpent_sse2_cbc_dec; +.align 8 +.global _gcry_serpent_sse2_cfb_dec +.type _gcry_serpent_sse2_cfb_dec, at function; +_gcry_serpent_sse2_cfb_dec: + /* input: + * %rdi: ctx, CTX + * %rsi: dst (8 blocks) + * %rdx: src (8 blocks) + * %rcx: iv + */ + + .set RA0, enc_in_a0 + .set RA1, enc_in_a1 + .set RA2, enc_in_a2 + .set RA3, enc_in_a3 + .set RB0, enc_in_b0 + .set RB1, enc_in_b1 + .set RB2, enc_in_b2 + .set RB3, enc_in_b3 + + /* Load input */ + movdqu (%rcx), RA0; + movdqu 0 * 16(%rdx), RA1; + movdqu 1 * 16(%rdx), RA2; + movdqu 2 * 16(%rdx), RA3; + movdqu 3 * 16(%rdx), RB0; + movdqu 4 * 16(%rdx), RB1; + movdqu 5 * 16(%rdx), RB2; + movdqu 6 * 16(%rdx), RB3; + + /* Update IV */ + movdqu 7 * 16(%rdx), RNOT; + movdqu RNOT, (%rcx); + + call __serpent_enc_blk8; + + .set RA0, enc_out_a0 + .set RA1, enc_out_a1 + .set RA2, enc_out_a2 + .set RA3, enc_out_a3 + .set RB0, enc_out_b0 + .set RB1, enc_out_b1 + .set RB2, enc_out_b2 + .set RB3, enc_out_b3 + + pxor_u((0 * 16)(%rdx), RA0, RTMP0); + pxor_u((1 * 16)(%rdx), RA1, RTMP0); + pxor_u((2 * 16)(%rdx), RA2, RTMP0); + pxor_u((3 * 16)(%rdx), RA3, RTMP0); + pxor_u((4 * 16)(%rdx), RB0, RTMP0); + pxor_u((5 * 16)(%rdx), RB1, RTMP0); + pxor_u((6 * 16)(%rdx), RB2, RTMP0); + pxor_u((7 * 16)(%rdx), RB3, RTMP0); + + movdqu RA0, (0 * 16)(%rsi); + movdqu RA1, (1 * 16)(%rsi); + movdqu RA2, (2 * 16)(%rsi); + movdqu RA3, (3 * 16)(%rsi); + movdqu RB0, (4 * 16)(%rsi); + movdqu RB1, (5 * 16)(%rsi); + movdqu RB2, (6 * 16)(%rsi); + movdqu RB3, (7 * 16)(%rsi); + + ret +.size _gcry_serpent_sse2_cfb_dec,.-_gcry_serpent_sse2_cfb_dec; + #endif /*defined(USE_SERPENT)*/ #endif /*__x86_64*/ diff --git a/cipher/serpent.c b/cipher/serpent.c index 7b82b48..95ac7c1 100644 --- a/cipher/serpent.c +++ b/cipher/serpent.c @@ -74,6 +74,11 @@ extern void _gcry_serpent_sse2_cbc_dec(serpent_context_t *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv); + +extern void _gcry_serpent_sse2_cfb_dec(serpent_context_t *ctx, + unsigned char *out, + const unsigned char *in, + unsigned char *iv); #endif /* A prototype. */ @@ -916,6 +921,71 @@ _gcry_serpent_cbc_dec(void *context, unsigned char *iv, _gcry_burn_stack(burn_stack_depth); } +/* Bulk decryption of complete blocks in CFB mode. This function is only + intended for the bulk encryption feature of cipher.c. */ +void +_gcry_serpent_cfb_dec(void *context, unsigned char *iv, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks) +{ + serpent_context_t *ctx = context; + unsigned char *outbuf = outbuf_arg; + const unsigned char *inbuf = inbuf_arg; + int burn_stack_depth = 2 * sizeof (serpent_block_t); + +#ifdef USE_SSE2 + { + int did_use_sse2 = 0; + + /* Process data in 8 block chunks. */ + while (nblocks >= 8) + { + _gcry_serpent_sse2_cfb_dec(ctx, outbuf, inbuf, iv); + + nblocks -= 8; + outbuf += 8 * sizeof(serpent_block_t); + inbuf += 8 * sizeof(serpent_block_t); + did_use_sse2 = 1; + } + + if (did_use_sse2) + { + /* clear SSE2 registers used by serpent-sse2 */ + asm volatile ( + "pxor %%xmm0, %%xmm0;\n" + "pxor %%xmm1, %%xmm1;\n" + "pxor %%xmm2, %%xmm2;\n" + "pxor %%xmm3, %%xmm3;\n" + "pxor %%xmm4, %%xmm4;\n" + "pxor %%xmm5, %%xmm5;\n" + "pxor %%xmm6, %%xmm6;\n" + "pxor %%xmm7, %%xmm7;\n" + "pxor %%xmm10, %%xmm10;\n" + "pxor %%xmm11, %%xmm11;\n" + "pxor %%xmm12, %%xmm12;\n" + "pxor %%xmm13, %%xmm13;\n" + :::); + + /* serpent-sse2 assembly code does not use stack */ + if (nblocks == 0) + burn_stack_depth = 0; + } + + /* Use generic code to handle smaller chunks... */ + } +#endif + + for ( ;nblocks; nblocks-- ) + { + serpent_encrypt_internal(ctx, iv, iv); + buf_xor_n_copy(outbuf, iv, inbuf, sizeof(serpent_block_t)); + outbuf += sizeof(serpent_block_t); + inbuf += sizeof(serpent_block_t); + } + + _gcry_burn_stack(burn_stack_depth); +} + /* Run the self-tests for SERPENT-CTR-128, tests IV increment of bulk CTR @@ -948,6 +1018,21 @@ selftest_cbc_128 (void) } +/* Run the self-tests for SERPENT-CBC-128, tests bulk CBC decryption. + Returns NULL on success. */ +static const char* +selftest_cfb_128 (void) +{ + const int nblocks = 8+2; + const int blocksize = sizeof(serpent_block_t); + const int context_size = sizeof(serpent_context_t); + + return _gcry_selftest_helper_cfb_128("SERPENT", &serpent_setkey, + &serpent_encrypt, &_gcry_serpent_cfb_dec, nblocks, blocksize, + context_size); +} + + /* Serpent test. */ static const char * @@ -1034,6 +1119,9 @@ serpent_test (void) if ( (r = selftest_cbc_128 ()) ) return r; + if ( (r = selftest_cfb_128 ()) ) + return r; + return NULL; } diff --git a/src/cipher.h b/src/cipher.h index f28990d..9d6cc01 100644 --- a/src/cipher.h +++ b/src/cipher.h @@ -113,6 +113,9 @@ void _gcry_serpent_ctr_enc (void *context, unsigned char *ctr, void _gcry_serpent_cbc_dec (void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, unsigned int nblocks); +void _gcry_serpent_cfb_dec (void *context, unsigned char *iv, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks); /*-- dsa.c --*/ void _gcry_register_pk_dsa_progress (gcry_handler_progress_t cbc, void *cb_data); commit b60f06f70227c1e69e1010da8b47ea51ade48145 Author: Jussi Kivilinna Date: Thu May 23 14:15:46 2013 +0300 camellia: add parallel processing for CFB decryption * cipher/camellia-aesni-avx-amd64.S (_gcry_camellia_aesni_avx_cfb_dec): New function. * cipher/camellia-glue.c (_gcry_camellia_aesni_avx_cfb_dec): New prototype. (_gcry_camellia_cfb_dec): New function. (selftest_cfb_128): New function. (selftest): Call selftest_cfb_128. * cipher/cipher.c (gry_cipher_open): Add bulk CFB decryption function for Camellia. * src/cipher.h (_gcry_camellia_cfb_dec): New prototype. -- Patch makes Camellia-CFB decryption 4.7 times faster on Intel Sandy-Bridge. Signed-off-by: Jussi Kivilinna diff --git a/cipher/camellia-aesni-avx-amd64.S b/cipher/camellia-aesni-avx-amd64.S index 2b1df17..95c96b8 100644 --- a/cipher/camellia-aesni-avx-amd64.S +++ b/cipher/camellia-aesni-avx-amd64.S @@ -1116,5 +1116,70 @@ _gcry_camellia_aesni_avx_cbc_dec: ret; .size _gcry_camellia_aesni_avx_cbc_dec,.-_gcry_camellia_aesni_avx_cbc_dec; +.align 8 +.global _gcry_camellia_aesni_avx_cfb_dec +.type _gcry_camellia_aesni_avx_cfb_dec, at function; + +_gcry_camellia_aesni_avx_cfb_dec: + /* input: + * %rdi: ctx, CTX + * %rsi: dst (16 blocks) + * %rdx: src (16 blocks) + * %rcx: iv + */ + + subq $(16 * 16), %rsp; + movq %rsp, %rax; + + /* inpack16_pre: */ + vmovq (key_table)(CTX), %xmm0; + vpshufb .Lpack_bswap RIP, %xmm0, %xmm0; + vpxor (%rcx), %xmm0, %xmm15; + vmovdqu 15 * 16(%rdx), %xmm1; + vmovdqu %xmm1, (%rcx); /* store new IV */ + vpxor 0 * 16(%rdx), %xmm0, %xmm14; + vpxor 1 * 16(%rdx), %xmm0, %xmm13; + vpxor 2 * 16(%rdx), %xmm0, %xmm12; + vpxor 3 * 16(%rdx), %xmm0, %xmm11; + vpxor 4 * 16(%rdx), %xmm0, %xmm10; + vpxor 5 * 16(%rdx), %xmm0, %xmm9; + vpxor 6 * 16(%rdx), %xmm0, %xmm8; + vpxor 7 * 16(%rdx), %xmm0, %xmm7; + vpxor 8 * 16(%rdx), %xmm0, %xmm6; + vpxor 9 * 16(%rdx), %xmm0, %xmm5; + vpxor 10 * 16(%rdx), %xmm0, %xmm4; + vpxor 11 * 16(%rdx), %xmm0, %xmm3; + vpxor 12 * 16(%rdx), %xmm0, %xmm2; + vpxor 13 * 16(%rdx), %xmm0, %xmm1; + vpxor 14 * 16(%rdx), %xmm0, %xmm0; + + call __camellia_enc_blk16; + + addq $(16 * 16), %rsp; + + vpxor 0 * 16(%rdx), %xmm7, %xmm7; + vpxor 1 * 16(%rdx), %xmm6, %xmm6; + vpxor 2 * 16(%rdx), %xmm5, %xmm5; + vpxor 3 * 16(%rdx), %xmm4, %xmm4; + vpxor 4 * 16(%rdx), %xmm3, %xmm3; + vpxor 5 * 16(%rdx), %xmm2, %xmm2; + vpxor 6 * 16(%rdx), %xmm1, %xmm1; + vpxor 7 * 16(%rdx), %xmm0, %xmm0; + vpxor 8 * 16(%rdx), %xmm15, %xmm15; + vpxor 9 * 16(%rdx), %xmm14, %xmm14; + vpxor 10 * 16(%rdx), %xmm13, %xmm13; + vpxor 11 * 16(%rdx), %xmm12, %xmm12; + vpxor 12 * 16(%rdx), %xmm11, %xmm11; + vpxor 13 * 16(%rdx), %xmm10, %xmm10; + vpxor 14 * 16(%rdx), %xmm9, %xmm9; + vpxor 15 * 16(%rdx), %xmm8, %xmm8; + + write_output(%xmm7, %xmm6, %xmm5, %xmm4, %xmm3, %xmm2, %xmm1, %xmm0, + %xmm15, %xmm14, %xmm13, %xmm12, %xmm11, %xmm10, %xmm9, + %xmm8, %rsi); + + ret; +.size _gcry_camellia_aesni_avx_cfb_dec,.-_gcry_camellia_aesni_avx_cfb_dec; + #endif /*defined(ENABLE_AESNI_SUPPORT) && defined(ENABLE_AVX_SUPPORT)*/ #endif /*__x86_64*/ diff --git a/cipher/camellia-glue.c b/cipher/camellia-glue.c index 4c724a9..f9bbb33 100644 --- a/cipher/camellia-glue.c +++ b/cipher/camellia-glue.c @@ -102,6 +102,11 @@ extern void _gcry_camellia_aesni_avx_cbc_dec(CAMELLIA_context *ctx, unsigned char *out, const unsigned char *in, unsigned char *iv); + +extern void _gcry_camellia_aesni_avx_cfb_dec(CAMELLIA_context *ctx, + unsigned char *out, + const unsigned char *in, + unsigned char *iv); #endif static const char *selftest(void); @@ -308,6 +313,58 @@ _gcry_camellia_cbc_dec(void *context, unsigned char *iv, _gcry_burn_stack(burn_stack_depth); } +/* Bulk decryption of complete blocks in CFB mode. This function is only + intended for the bulk encryption feature of cipher.c. */ +void +_gcry_camellia_cfb_dec(void *context, unsigned char *iv, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks) +{ + CAMELLIA_context *ctx = context; + unsigned char *outbuf = outbuf_arg; + const unsigned char *inbuf = inbuf_arg; + int burn_stack_depth = CAMELLIA_decrypt_stack_burn_size; + +#ifdef USE_AESNI_AVX + if (ctx->use_aesni_avx) + { + int did_use_aesni_avx = 0; + + /* Process data in 16 block chunks. */ + while (nblocks >= 16) + { + _gcry_camellia_aesni_avx_cfb_dec(ctx, outbuf, inbuf, iv); + + nblocks -= 16; + outbuf += 16 * CAMELLIA_BLOCK_SIZE; + inbuf += 16 * CAMELLIA_BLOCK_SIZE; + did_use_aesni_avx = 1; + } + + if (did_use_aesni_avx) + { + /* clear AVX registers */ + asm volatile ("vzeroall;\n":::); + + if (burn_stack_depth < 16 * CAMELLIA_BLOCK_SIZE + 2 * sizeof(void *)) + burn_stack_depth = 16 * CAMELLIA_BLOCK_SIZE + 2 * sizeof(void *); + } + + /* Use generic code to handle smaller chunks... */ + } +#endif + + for ( ;nblocks; nblocks-- ) + { + Camellia_EncryptBlock(ctx->keybitlength, iv, ctx->keytable, iv); + buf_xor_n_copy(outbuf, iv, inbuf, CAMELLIA_BLOCK_SIZE); + outbuf += CAMELLIA_BLOCK_SIZE; + inbuf += CAMELLIA_BLOCK_SIZE; + } + + _gcry_burn_stack(burn_stack_depth); +} + /* Run the self-tests for CAMELLIA-CTR-128, tests IV increment of bulk CTR encryption. Returns NULL on success. */ static const char* @@ -336,6 +393,20 @@ selftest_cbc_128 (void) context_size); } +/* Run the self-tests for CAMELLIA-CFB-128, tests bulk CFB decryption. + Returns NULL on success. */ +static const char* +selftest_cfb_128 (void) +{ + const int nblocks = 16+2; + const int blocksize = CAMELLIA_BLOCK_SIZE; + const int context_size = sizeof(CAMELLIA_context); + + return _gcry_selftest_helper_cfb_128("CAMELLIA", &camellia_setkey, + &camellia_encrypt, &_gcry_camellia_cfb_dec, nblocks, blocksize, + context_size); +} + static const char * selftest(void) { @@ -411,6 +482,9 @@ selftest(void) if ( (r = selftest_cbc_128 ()) ) return r; + if ( (r = selftest_cfb_128 ()) ) + return r; + return NULL; } diff --git a/cipher/cipher.c b/cipher/cipher.c index 20ac2c7..e9a652f 100644 --- a/cipher/cipher.c +++ b/cipher/cipher.c @@ -723,6 +723,7 @@ gcry_cipher_open (gcry_cipher_hd_t *handle, case GCRY_CIPHER_CAMELLIA192: case GCRY_CIPHER_CAMELLIA256: h->bulk.cbc_dec = _gcry_camellia_cbc_dec; + h->bulk.cfb_dec = _gcry_camellia_cfb_dec; h->bulk.ctr_enc = _gcry_camellia_ctr_enc; break; #endif /*USE_CAMELLIA*/ diff --git a/src/cipher.h b/src/cipher.h index 4e68487..f28990d 100644 --- a/src/cipher.h +++ b/src/cipher.h @@ -102,6 +102,9 @@ void _gcry_camellia_ctr_enc (void *context, unsigned char *ctr, void _gcry_camellia_cbc_dec (void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, unsigned int nblocks); +void _gcry_camellia_cfb_dec (void *context, unsigned char *iv, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks); /*-- serpent.c --*/ void _gcry_serpent_ctr_enc (void *context, unsigned char *ctr, commit 319ee14f2aab8db56a830fd7ac8926f91b4f738a Author: Jussi Kivilinna Date: Thu May 23 14:15:41 2013 +0300 rinjdael: add parallel processing for CFB decryption with AES-NI * cipher/cipher-selftest.c (_gcry_selftest_helper_cfb_128): New function for CFB selftests. * cipher/cipher-selftest.h (_gcry_selftest_helper_cfb_128): New prototype. * cipher/rijndael.c [USE_AESNI] (do_aesni_enc_vec4): New function. (_gcry_aes_cfb_dec) [USE_AESNI]: Add parallelized CFB decryption. (selftest_cfb_128): New function. (selftest): Call selftest_cfb_128. -- CFB decryption can be parallelized for additional performance. On Intel Sandy-Bridge processor, this change makes CFB decryption 4.6 times faster. Signed-off-by: Jussi Kivilinna diff --git a/cipher/cipher-selftest.c b/cipher/cipher-selftest.c index 439f3ae..41eb405 100644 --- a/cipher/cipher-selftest.c +++ b/cipher/cipher-selftest.c @@ -160,6 +160,119 @@ _gcry_selftest_helper_cbc_128 (const char *cipher, return NULL; } +/* Run the self-tests for -CFB-128, tests bulk CFB + decryption. Returns NULL on success. */ +const char * +_gcry_selftest_helper_cfb_128 (const char *cipher, + gcry_cipher_setkey_t setkey_func, + gcry_cipher_encrypt_t encrypt_one, + gcry_cipher_bulk_cfb_dec_t bulk_cfb_dec, + const int nblocks, const int blocksize, + const int context_size) +{ + int i, offs; + unsigned char *ctx, *plaintext, *plaintext2, *ciphertext, *iv, *iv2, *mem; + unsigned int ctx_aligned_size, memsize; + + static const unsigned char key[16] ATTR_ALIGNED_16 = { + 0x11,0x9A,0x00,0x7F,0xC7,0x6A,0x45,0x9F, + 0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x33 + }; + + /* Allocate buffers, align elements to 16 bytes. */ + ctx_aligned_size = context_size + 15; + ctx_aligned_size -= ctx_aligned_size & 0xf; + + memsize = ctx_aligned_size + (blocksize * 2) + (blocksize * nblocks * 3) + 16; + + mem = gcry_calloc (1, memsize); + if (!mem) + return "failed to allocate memory"; + + offs = (16 - ((uintptr_t)mem & 15)) & 15; + ctx = (void*)(mem + offs); + iv = ctx + ctx_aligned_size; + iv2 = iv + blocksize; + plaintext = iv2 + blocksize; + plaintext2 = plaintext + nblocks * blocksize; + ciphertext = plaintext2 + nblocks * blocksize; + + /* Initialize ctx */ + setkey_func (ctx, key, sizeof(key)); + + /* Test single block code path */ + memset(iv, 0xd3, blocksize); + memset(iv2, 0xd3, blocksize); + for (i = 0; i < blocksize; i++) + plaintext[i] = i; + + /* CFB manually. */ + encrypt_one (ctx, ciphertext, iv); + buf_xor_2dst (iv, ciphertext, plaintext, blocksize); + + /* CFB decrypt. */ + bulk_cfb_dec (ctx, iv2, plaintext2, ciphertext, 1); + if (memcmp(plaintext2, plaintext, blocksize)) + { + gcry_free(mem); +#ifdef HAVE_SYSLOG + syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " + "%s-128-CFB test failed (plaintext mismatch)", cipher); +#endif + return "selftest for 128 bit CFB failed - see syslog for details"; + } + + if (memcmp(iv2, iv, blocksize)) + { + gcry_free(mem); +#ifdef HAVE_SYSLOG + syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " + "%s-128-CFB test failed (IV mismatch)", cipher); +#endif + return "selftest for 128 bit CFB failed - see syslog for details"; + } + + /* Test parallelized code paths */ + memset(iv, 0xe6, blocksize); + memset(iv2, 0xe6, blocksize); + + for (i = 0; i < nblocks * blocksize; i++) + plaintext[i] = i; + + /* Create CFB ciphertext manually. */ + for (i = 0; i < nblocks * blocksize; i+=blocksize) + { + encrypt_one (ctx, &ciphertext[i], iv); + buf_xor_2dst (iv, &ciphertext[i], &plaintext[i], blocksize); + } + + /* Decrypt using bulk CBC and compare result. */ + bulk_cfb_dec (ctx, iv2, plaintext2, ciphertext, nblocks); + + if (memcmp(plaintext2, plaintext, nblocks * blocksize)) + { + gcry_free(mem); +#ifdef HAVE_SYSLOG + syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " + "%s-128-CFB test failed (plaintext mismatch, parallel path)", + cipher); +#endif + return "selftest for 128 bit CFB failed - see syslog for details"; + } + if (memcmp(iv2, iv, blocksize)) + { + gcry_free(mem); +#ifdef HAVE_SYSLOG + syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " + "%s-128-CFB test failed (IV mismatch, parallel path)", cipher); +#endif + return "selftest for 128 bit CFB failed - see syslog for details"; + } + + gcry_free(mem); + return NULL; +} + /* Run the self-tests for -CTR-128, tests IV increment of bulk CTR encryption. Returns NULL on success. */ const char * diff --git a/cipher/cipher-selftest.h b/cipher/cipher-selftest.h index 89d79c2..30bc251 100644 --- a/cipher/cipher-selftest.h +++ b/cipher/cipher-selftest.h @@ -30,6 +30,11 @@ typedef void (*gcry_cipher_bulk_cbc_dec_t)(void *context, unsigned char *iv, const void *inbuf_arg, unsigned int nblocks); +typedef void (*gcry_cipher_bulk_cfb_dec_t)(void *context, unsigned char *iv, + void *outbuf_arg, + const void *inbuf_arg, + unsigned int nblocks); + typedef void (*gcry_cipher_bulk_ctr_enc_t)(void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, @@ -43,6 +48,14 @@ _gcry_selftest_helper_cbc_128 (const char *cipher, gcry_cipher_setkey_t setkey, const int nblocks, const int blocksize, const int context_size); +/* Helper function for bulk CFB decryption selftest */ +const char * +_gcry_selftest_helper_cfb_128 (const char *cipher, gcry_cipher_setkey_t setkey, + gcry_cipher_encrypt_t encrypt_one, + gcry_cipher_bulk_cfb_dec_t bulk_cfb_dec, + const int nblocks, const int blocksize, + const int context_size); + /* Helper function for bulk CTR encryption selftest */ const char * _gcry_selftest_helper_ctr_128 (const char *cipher, gcry_cipher_setkey_t setkey, diff --git a/cipher/rijndael.c b/cipher/rijndael.c index 4c81688..9f075ff 100644 --- a/cipher/rijndael.c +++ b/cipher/rijndael.c @@ -821,6 +821,115 @@ do_aesni_dec_aligned (const RIJNDAEL_context *ctx, } +/* Encrypt four blocks using the Intel AES-NI instructions. Blocks are input + * and output through SSE registers xmm1 to xmm4. */ +static void +do_aesni_enc_vec4 (const RIJNDAEL_context *ctx) +{ +#define aesenc_xmm0_xmm1 ".byte 0x66, 0x0f, 0x38, 0xdc, 0xc8\n\t" +#define aesenc_xmm0_xmm2 ".byte 0x66, 0x0f, 0x38, 0xdc, 0xd0\n\t" +#define aesenc_xmm0_xmm3 ".byte 0x66, 0x0f, 0x38, 0xdc, 0xd8\n\t" +#define aesenc_xmm0_xmm4 ".byte 0x66, 0x0f, 0x38, 0xdc, 0xe0\n\t" +#define aesenclast_xmm0_xmm1 ".byte 0x66, 0x0f, 0x38, 0xdd, 0xc8\n\t" +#define aesenclast_xmm0_xmm2 ".byte 0x66, 0x0f, 0x38, 0xdd, 0xd0\n\t" +#define aesenclast_xmm0_xmm3 ".byte 0x66, 0x0f, 0x38, 0xdd, 0xd8\n\t" +#define aesenclast_xmm0_xmm4 ".byte 0x66, 0x0f, 0x38, 0xdd, 0xe0\n\t" + asm volatile ("movdqa (%[key]), %%xmm0\n\t" + "pxor %%xmm0, %%xmm1\n\t" /* xmm1 ^= key[0] */ + "pxor %%xmm0, %%xmm2\n\t" /* xmm2 ^= key[0] */ + "pxor %%xmm0, %%xmm3\n\t" /* xmm3 ^= key[0] */ + "pxor %%xmm0, %%xmm4\n\t" /* xmm4 ^= key[0] */ + "movdqa 0x10(%[key]), %%xmm0\n\t" + aesenc_xmm0_xmm1 + aesenc_xmm0_xmm2 + aesenc_xmm0_xmm3 + aesenc_xmm0_xmm4 + "movdqa 0x20(%[key]), %%xmm0\n\t" + aesenc_xmm0_xmm1 + aesenc_xmm0_xmm2 + aesenc_xmm0_xmm3 + aesenc_xmm0_xmm4 + "movdqa 0x30(%[key]), %%xmm0\n\t" + aesenc_xmm0_xmm1 + aesenc_xmm0_xmm2 + aesenc_xmm0_xmm3 + aesenc_xmm0_xmm4 + "movdqa 0x40(%[key]), %%xmm0\n\t" + aesenc_xmm0_xmm1 + aesenc_xmm0_xmm2 + aesenc_xmm0_xmm3 + aesenc_xmm0_xmm4 + "movdqa 0x50(%[key]), %%xmm0\n\t" + aesenc_xmm0_xmm1 + aesenc_xmm0_xmm2 + aesenc_xmm0_xmm3 + aesenc_xmm0_xmm4 + "movdqa 0x60(%[key]), %%xmm0\n\t" + aesenc_xmm0_xmm1 + aesenc_xmm0_xmm2 + aesenc_xmm0_xmm3 + aesenc_xmm0_xmm4 + "movdqa 0x70(%[key]), %%xmm0\n\t" + aesenc_xmm0_xmm1 + aesenc_xmm0_xmm2 + aesenc_xmm0_xmm3 + aesenc_xmm0_xmm4 + "movdqa 0x80(%[key]), %%xmm0\n\t" + aesenc_xmm0_xmm1 + aesenc_xmm0_xmm2 + aesenc_xmm0_xmm3 + aesenc_xmm0_xmm4 + "movdqa 0x90(%[key]), %%xmm0\n\t" + aesenc_xmm0_xmm1 + aesenc_xmm0_xmm2 + aesenc_xmm0_xmm3 + aesenc_xmm0_xmm4 + "movdqa 0xa0(%[key]), %%xmm0\n\t" + "cmpl $10, %[rounds]\n\t" + "jz .Ldeclast%=\n\t" + aesenc_xmm0_xmm1 + aesenc_xmm0_xmm2 + aesenc_xmm0_xmm3 + aesenc_xmm0_xmm4 + "movdqa 0xb0(%[key]), %%xmm0\n\t" + aesenc_xmm0_xmm1 + aesenc_xmm0_xmm2 + aesenc_xmm0_xmm3 + aesenc_xmm0_xmm4 + "movdqa 0xc0(%[key]), %%xmm0\n\t" + "cmpl $12, %[rounds]\n\t" + "jz .Ldeclast%=\n\t" + aesenc_xmm0_xmm1 + aesenc_xmm0_xmm2 + aesenc_xmm0_xmm3 + aesenc_xmm0_xmm4 + "movdqa 0xd0(%[key]), %%xmm0\n\t" + aesenc_xmm0_xmm1 + aesenc_xmm0_xmm2 + aesenc_xmm0_xmm3 + aesenc_xmm0_xmm4 + "movdqa 0xe0(%[key]), %%xmm0\n" + + ".Ldeclast%=:\n\t" + aesenclast_xmm0_xmm1 + aesenclast_xmm0_xmm2 + aesenclast_xmm0_xmm3 + aesenclast_xmm0_xmm4 + : /* no output */ + : [key] "r" (ctx->keyschenc), + [rounds] "r" (ctx->rounds) + : "cc", "memory"); +#undef aesenc_xmm0_xmm1 +#undef aesenc_xmm0_xmm2 +#undef aesenc_xmm0_xmm3 +#undef aesenc_xmm0_xmm4 +#undef aesenclast_xmm0_xmm1 +#undef aesenclast_xmm0_xmm2 +#undef aesenclast_xmm0_xmm3 +#undef aesenclast_xmm0_xmm4 +} + + /* Decrypt four blocks using the Intel AES-NI instructions. Blocks are input * and output through SSE registers xmm1 to xmm4. */ static void @@ -1685,7 +1794,7 @@ rijndael_decrypt (void *context, byte *b, const byte *a) /* Bulk decryption of complete blocks in CFB mode. Caller needs to - make sure that IV is aligned on an unisgned lonhg boundary. This + make sure that IV is aligned on an unsigned long boundary. This function is only intended for the bulk encryption feature of cipher.c. */ void @@ -1716,6 +1825,50 @@ _gcry_aes_cfb_dec (void *context, unsigned char *iv, else if (ctx->use_aesni) { aesni_prepare (); + + /* CFB decryption can be parallelized */ + for ( ;nblocks >= 4; nblocks -= 4) + { + asm volatile + ("movdqu (%[iv]), %%xmm1\n\t" /* load input blocks */ + "movdqu 0*16(%[inbuf]), %%xmm2\n\t" + "movdqu 1*16(%[inbuf]), %%xmm3\n\t" + "movdqu 2*16(%[inbuf]), %%xmm4\n\t" + + "movdqu 3*16(%[inbuf]), %%xmm0\n\t" /* update IV */ + "movdqu %%xmm0, (%[iv])\n\t" + : /* No output */ + : [inbuf] "r" (inbuf), [iv] "r" (iv) + : "memory"); + + do_aesni_enc_vec4 (ctx); + + asm volatile + ("movdqu 0*16(%[inbuf]), %%xmm5\n\t" + "pxor %%xmm5, %%xmm1\n\t" + "movdqu %%xmm1, 0*16(%[outbuf])\n\t" + + "movdqu 1*16(%[inbuf]), %%xmm5\n\t" + "pxor %%xmm5, %%xmm2\n\t" + "movdqu %%xmm2, 1*16(%[outbuf])\n\t" + + "movdqu 2*16(%[inbuf]), %%xmm5\n\t" + "pxor %%xmm5, %%xmm3\n\t" + "movdqu %%xmm3, 2*16(%[outbuf])\n\t" + + "movdqu 3*16(%[inbuf]), %%xmm5\n\t" + "pxor %%xmm5, %%xmm4\n\t" + "movdqu %%xmm4, 3*16(%[outbuf])\n\t" + + : /* No output */ + : [inbuf] "r" (inbuf), + [outbuf] "r" (outbuf) + : "memory"); + + outbuf += 4*BLOCKSIZE; + inbuf += 4*BLOCKSIZE; + } + for ( ;nblocks; nblocks-- ) { do_aesni_cfb (ctx, 1, iv, outbuf, inbuf); @@ -1723,6 +1876,7 @@ _gcry_aes_cfb_dec (void *context, unsigned char *iv, inbuf += BLOCKSIZE; } aesni_cleanup (); + aesni_cleanup_2_5 (); } #endif /*USE_AESNI*/ else @@ -2035,6 +2189,21 @@ selftest_cbc_128 (void) } +/* Run the self-tests for AES-CFB-128, tests bulk CFB decryption. + Returns NULL on success. */ +static const char* +selftest_cfb_128 (void) +{ + const int nblocks = 8+2; + const int blocksize = BLOCKSIZE; + const int context_size = sizeof(RIJNDAEL_context); + + return _gcry_selftest_helper_cfb_128("AES", &rijndael_setkey, + &rijndael_encrypt, &_gcry_aes_cfb_dec, nblocks, blocksize, + context_size); +} + + /* Run all the self-tests and return NULL on success. This function is used for the on-the-fly self-tests. */ static const char * @@ -2053,6 +2222,9 @@ selftest (void) if ( (r = selftest_cbc_128 ()) ) return r; + if ( (r = selftest_cfb_128 ()) ) + return r; + return r; } ----------------------------------------------------------------------- Summary of changes: cipher/camellia-aesni-avx-amd64.S | 65 ++++++++++++++ cipher/camellia-glue.c | 74 ++++++++++++++++ cipher/cipher-selftest.c | 113 ++++++++++++++++++++++++ cipher/cipher-selftest.h | 13 +++ cipher/cipher.c | 2 + cipher/rijndael.c | 174 ++++++++++++++++++++++++++++++++++++- cipher/serpent-sse2-amd64.S | 66 ++++++++++++++ cipher/serpent.c | 88 +++++++++++++++++++ src/cipher.h | 6 ++ 9 files changed, 600 insertions(+), 1 deletions(-) hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 23 20:40:11 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Thu, 23 May 2013 20:40:11 +0200 Subject: [git] GPGME - branch, master, updated. gpgme-1.4.1-13-gc29dad2 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via c29dad2315406bed75b9547103650bef642e6aa7 (commit) via d739d4d8cf9c873b0f3bb7836aaf3d0ba31a7b7f (commit) from d4371ed30da2e8b3d9f440613af299a952bde2b1 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit c29dad2315406bed75b9547103650bef642e6aa7 Author: Werner Koch Date: Thu Apr 18 14:40:43 2013 +0200 w32: Fix installing of .def file. * src/Makefile.am (install-def-file): Create libdir first. diff --git a/src/Makefile.am b/src/Makefile.am index ea8e70e..fa3b077 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -172,6 +172,7 @@ no_undefined = -no-undefined export_symbols = -export-symbols $(srcdir)/gpgme.def install-def-file: + -$(INSTALL) -d $(DESTDIR)$(libdir) $(INSTALL) $(srcdir)/gpgme.def $(DESTDIR)$(libdir)/gpgme.def uninstall-def-file: commit d739d4d8cf9c873b0f3bb7836aaf3d0ba31a7b7f Author: Werner Koch Date: Thu Apr 18 14:40:43 2013 +0200 Fix libtool 2.4.2 to correctly detect .def files. * build-aux/ltmain.sh (sed_uncomment_deffile): New. (orig_export_symbols): Uncomment def file before testing for EXPORTS. * m4/libtool.m4: Do the same for the generated code. -- The old code was not correct in that it only looked at the first line and puts an EXPORTS keyword in front if missing. Binutils 2.22 accepted a duplicated EXPORTS keyword but at least 2.23.2 is more stringent and bails out without this fix. There is no need to send this upstream. Upstream's git master has a lot of changes including a similar fix for this problems. There are no signs that a libtool 2.4.3 will be released to fix this problem and thus we need to stick to our copy of 2.4.2 along with this patch. Signed-off-by: Werner Koch diff --git a/build-aux/ltmain.sh b/build-aux/ltmain.sh index 905e09a..859599a 100644 --- a/build-aux/ltmain.sh +++ b/build-aux/ltmain.sh @@ -411,6 +411,10 @@ sed_make_literal_regex='s,[].[^$\\*\/],\\&,g' # (escaped) backslashes. A very naive implementation. lt_sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' +# Sed substitution to remove simple comments and empty +# lines from a Windows .def file. +sed_uncomment_deffile='/^;/d; /^[ ]*$/d' + # Re-`\' parameter expansions in output of double_quote_subst that were # `\'-ed in input to the same. If an odd number of `\' preceded a '$' # in input to double_quote_subst, that '$' was protected from expansion. @@ -8143,7 +8147,7 @@ EOF cygwin* | mingw* | cegcc*) if test -n "$export_symbols" && test -z "$export_symbols_regex"; then # exporting using user supplied symfile - if test "x`$SED 1q $export_symbols`" != xEXPORTS; then + if test "x`$SED "$sed_uncomment_deffile" $export_symbols | $SED 1q`" != xEXPORTS; then # and it's NOT already a .def file. Must figure out # which of the given symbols are data symbols and tag # them as such. So, trigger use of export_symbols_cmds. diff --git a/m4/libtool.m4 b/m4/libtool.m4 index 4bedbd3..ff871a0 100644 --- a/m4/libtool.m4 +++ b/m4/libtool.m4 @@ -4773,7 +4773,7 @@ _LT_EOF _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED \"$sed_uncomment_deffile\" $export_symbols | $SED 1q`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; @@ -5150,7 +5150,7 @@ _LT_EOF shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED \"$sed_uncomment_deffile\" $export_symbols | $SED 1q`" = xEXPORTS; then sed -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else sed -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; @@ -6149,7 +6149,7 @@ if test "$_lt_caught_CXX_error" != yes; then shrext_cmds=".dll" # FIXME: Setting linknames here is a bad hack. _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames=' - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED \"$sed_uncomment_deffile\" $export_symbols | $SED 1q`" = xEXPORTS; then $SED -n -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' -e '1\\\!p' < $export_symbols > $output_objdir/$soname.exp; else $SED -e 's/\\\\\\\(.*\\\\\\\)/-link\\\ -EXPORT:\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp; @@ -6190,7 +6190,7 @@ if test "$_lt_caught_CXX_error" != yes; then _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib' # If the export-symbols file already is a .def file (1st line # is EXPORTS), use it as is; otherwise, prepend... - _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED 1q $export_symbols`" = xEXPORTS; then + _LT_TAGVAR(archive_expsym_cmds, $1)='if test "x`$SED \"$sed_uncomment_deffile\" $export_symbols | $SED 1q`" = xEXPORTS; then cp $export_symbols $output_objdir/$soname.def; else echo EXPORTS > $output_objdir/$soname.def; ----------------------------------------------------------------------- Summary of changes: build-aux/ltmain.sh | 6 +++++- m4/libtool.m4 | 8 ++++---- src/Makefile.am | 1 + 3 files changed, 10 insertions(+), 5 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Fri May 24 14:04:46 2013 From: cvs at cvs.gnupg.org (by Jussi Kivilinna) Date: Fri, 24 May 2013 14:04:46 +0200 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.5.0-143-g0bdf26e Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via 0bdf26eea8cdbffefe7e37578f8f896c4f5f5275 (commit) via ab8fc70b5f0c396a5bc941267f59166e860b8c5d (commit) from 6deb0ccdf718a0670f80e6762a3842caf76437d6 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 0bdf26eea8cdbffefe7e37578f8f896c4f5f5275 Author: Jussi Kivilinna Date: Fri May 24 12:43:29 2013 +0300 cast5: add amd64 assembly implementation * cipher/Makefile.am: Add 'cast5-amd64.S'. * cipher/cast5-amd64.S: New file. * cipher/cast5.c (USE_AMD64_ASM): New macro. (_gcry_cast5_s1tos4): Merge arrays s1, s2, s3, s4 to single array to simplify access from assembly implementation. (s1, s2, s3, s4): New macros pointing to subarrays in _gcry_cast5_s1tos4. [USE_AMD64_ASM] (_gcry_cast5_amd64_encrypt_block) (_gcry_cast5_amd64_decrypt_block, _gcry_cast5_amd64_ctr_enc) (_gcry_cast5_amd64_cbc_dec, _gcry_cast5_amd64_cfb_dec): New prototypes. [USE_AMD64_ASM] (do_encrypt_block, do_decrypt_block, encrypt_block) (decrypt_block): New functions. (_gcry_cast5_ctr_enc, _gcry_cast5_cbc_dec, _gcry_cast5_cfb_dec) (selftest_ctr, selftest_cbc, selftest_cfb): New functions. (selftest): Call new bulk selftests. * cipher/cipher.c (gcry_cipher_open) [USE_CAST5]: Register CAST5 bulk functions for ctr-enc, cbc-dec and cfb-dec. * configure.ac (cast5) [x86_64]: Add 'cast5-amd64.lo'. * src/cipher.h (_gcry_cast5_ctr_enc, _gcry_cast5_cbc_dec) (gcry_cast5_cfb_dec): New prototypes. -- Provides non-parallel implementations for small speed-up and 4-way parallel implementations that gets accelerated on `out-of-order' CPUs. Speed old vs. new on AMD Phenom II X6 1055T: ECB/Stream CBC CFB OFB CTR --------------- --------------- --------------- --------------- --------------- CAST5 1.23x 1.22x 1.21x 2.86x 1.21x 2.83x 1.22x 1.17x 2.73x 2.73x Speed old vs. new on Intel Core i5-2450M (Sandy-Bridge): ECB/Stream CBC CFB OFB CTR --------------- --------------- --------------- --------------- --------------- CAST5 1.00x 1.04x 1.06x 2.56x 1.06x 2.37x 1.03x 1.01x 2.43x 2.41x Signed-off-by: Jussi Kivilinna diff --git a/cipher/Makefile.am b/cipher/Makefile.am index 69f1e6d..1e2696f 100644 --- a/cipher/Makefile.am +++ b/cipher/Makefile.am @@ -54,7 +54,7 @@ rmd.h EXTRA_libcipher_la_SOURCES = \ arcfour.c \ blowfish.c \ -cast5.c \ +cast5.c cast5-amd64.S \ crc.c \ des.c \ dsa.c \ diff --git a/cipher/cast5-amd64.S b/cipher/cast5-amd64.S new file mode 100644 index 0000000..c3007d3 --- /dev/null +++ b/cipher/cast5-amd64.S @@ -0,0 +1,587 @@ +/* cast5-amd64.S - AMD64 assembly implementation of CAST5 cipher + * + * Copyright ? 2013 Jussi Kivilinna + * + * This file is part of Libgcrypt. + * + * Libgcrypt is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * Libgcrypt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifdef __x86_64 +#include +#if defined(USE_CAST5) + +#ifdef __PIC__ +# define RIP %rip +# define GET_EXTERN_POINTER(name, reg) movq name at GOTPCREL(%rip), reg +#else +# define RIP +# define GET_EXTERN_POINTER(name, reg) leaq name, reg +#endif + +.text + +.extern _gcry_cast5_s1to4; + +#define s1 0 +#define s2 (s1 + (4 * 256)) +#define s3 (s2 + (4 * 256)) +#define s4 (s3 + (4 * 256)) + +/* structure of CAST5_context: */ +#define Km 0 +#define Kr (Km + (16 * 4)) + +/* register macros */ +#define CTX %rdi +#define RIO %rsi +#define RTAB %r8 + +#define RLR0 %r9 +#define RLR1 %r10 +#define RLR2 %r11 +#define RLR3 %r12 + +#define RLR0d %r9d +#define RLR1d %r10d +#define RLR2d %r11d +#define RLR3d %r12d + +#define RX0 %rax +#define RX1 %rbx +#define RX2 %rdx + +#define RX0d %eax +#define RX1d %ebx +#define RX2d %edx + +#define RX0bl %al +#define RX1bl %bl +#define RX2bl %dl + +#define RX0bh %ah +#define RX1bh %bh +#define RX2bh %dh + +#define RKR %rcx +#define RKRd %ecx +#define RKRbl %cl + +#define RT0 %rbp +#define RT1 %rsi + +#define RT0d %ebp +#define RT1d %esi + +#define RKM0d %r13d +#define RKM1d %r14d + +/*********************************************************************** + * 1-way cast5 + ***********************************************************************/ +#define dummy(x) + +#define shr_kr(none) \ + shrq $8, RKR; + +#define F(km, load_next_kr, op0, op1, op2, op3) \ + op0 ## l RLR0d, km ## d; \ + roll RKRbl, km ## d; \ + rorq $32, RLR0; \ + movzbl km ## bh, RT0d; \ + movzbl km ## bl, RT1d; \ + roll $16, km ## d; \ + movl s1(RTAB,RT0,4), RT0d; \ + op1 ## l s2(RTAB,RT1,4), RT0d; \ + load_next_kr(kr_next); \ + movzbl km ## bh, RT1d; \ + movzbl km ## bl, km ## d; \ + op2 ## l s3(RTAB,RT1,4), RT0d; \ + op3 ## l s4(RTAB,km,4), RT0d; \ + xorq RT0, RLR0; + +#define F1(km, load_next_kr) \ + F(##km, load_next_kr, add, xor, sub, add) +#define F2(km, load_next_kr) \ + F(##km, load_next_kr, xor, sub, add, xor) +#define F3(km, load_next_kr) \ + F(##km, load_next_kr, sub, add, xor, sub) + +#define get_round_km(n, km) \ + movl Km+4*(n)(CTX), km; + +#define get_round_kr_enc(n) \ + movq $0x1010101010101010, RKR; \ + \ + /* merge rorl rk and rorl $16 */ \ + xorq Kr+(n)(CTX), RKR; + +#define get_round_kr_dec(n) \ + movq $0x1010101010101010, RKR; \ + \ + /* merge rorl rk and rorl $16 */ \ + xorq Kr+(n - 7)(CTX), RKR; \ + bswapq RKR; + +#define round_enc(n, FA, FB, fn1, fn2) \ + get_round_km(n + 1, RX2d); \ + FA(RX0, fn1); \ + get_round_km(n + 2, RX0d); \ + FB(RX2, fn2); + +#define round_enc_last(n, FXA, FXB) \ + get_round_km(n + 1, RX2d); \ + \ + FXA(RX0, shr_kr); \ + FXB(RX2, dummy); + +#define round_enc_1(n, FA, FB) \ + round_enc(n, FA, FB, shr_kr, shr_kr) + +#define round_enc_2(n, FA, FB) \ + round_enc(n, FA, FB, shr_kr, dummy) + +#define round_dec(n, FA, FB, fn1, fn2) \ + get_round_km(n - 1, RX2d); \ + FA(RX0, fn1); \ + get_round_km(n - 2, RX0d); \ + FB(RX2, fn2); + +#define round_dec_last(n, FXA, FXB) \ + get_round_km(n - 1, RX2d); \ + FXA(RX0, shr_kr); \ + FXB(RX2, dummy); + +#define round_dec_1(n, FA, FB) \ + round_dec(n, FA, FB, shr_kr, shr_kr) + +#define round_dec_2(n, FA, FB) \ + round_dec(n, FA, FB, shr_kr, dummy) + +#define read_block() \ + movq (RIO), RLR0; \ + bswapq RLR0; + +#define write_block() \ + bswapq RLR0; \ + rorq $32, RLR0; \ + movq RLR0, (RIO); + +.align 8 +.global _gcry_cast5_amd64_encrypt_block +.type _gcry_cast5_amd64_encrypt_block, at function; + +_gcry_cast5_amd64_encrypt_block: + /* input: + * %rdi: ctx, CTX + * %rsi: dst + * %rdx: src + */ + pushq %rbp; + pushq %rbx; + + movq %rsi, %r10; + + GET_EXTERN_POINTER(_gcry_cast5_s1to4, RTAB); + + movq %rdx, RIO; + read_block(); + + get_round_km(0, RX0d); + get_round_kr_enc(0); + round_enc_1(0, F1, F2); + round_enc_1(2, F3, F1); + round_enc_1(4, F2, F3); + round_enc_2(6, F1, F2); + get_round_kr_enc(8); + round_enc_1(8, F3, F1); + round_enc_1(10, F2, F3); + round_enc_1(12, F1, F2); + round_enc_last(14, F3, F1); + + movq %r10, RIO; + write_block(); + + popq %rbx; + popq %rbp; + ret; +.size _gcry_cast5_amd64_encrypt_block,.-_gcry_cast5_amd64_encrypt_block; + +.align 8 +.global _gcry_cast5_amd64_decrypt_block +.type _gcry_cast5_amd64_decrypt_block, at function; + +_gcry_cast5_amd64_decrypt_block: + /* input: + * %rdi: ctx, CTX + * %rsi: dst + * %rdx: src + */ + pushq %rbp; + pushq %rbx; + + movq %rsi, %r10; + + GET_EXTERN_POINTER(_gcry_cast5_s1to4, RTAB); + + movq %rdx, RIO; + read_block(); + + get_round_km(15, RX0d); + get_round_kr_dec(15); + round_dec_1(15, F1, F3); + round_dec_1(13, F2, F1); + round_dec_1(11, F3, F2); + round_dec_2(9, F1, F3); + get_round_kr_dec(7); + round_dec_1(7, F2, F1); + round_dec_1(5, F3, F2); + round_dec_1(3, F1, F3); + round_dec_last(1, F2, F1); + + movq %r10, RIO; + write_block(); + + popq %rbx; + popq %rbp; + ret; +.size _gcry_cast5_amd64_decrypt_block,.-_gcry_cast5_amd64_decrypt_block; + +/********************************************************************** + 4-way cast5, four blocks parallel + **********************************************************************/ +#define F_tail(rlr, rx, op1, op2, op3) \ + movzbl rx ## bh, RT0d; \ + movzbl rx ## bl, RT1d; \ + roll $16, rx ## d; \ + movl s1(RTAB,RT0,4), RT0d; \ + op1 ## l s2(RTAB,RT1,4), RT0d; \ + movzbl rx ## bh, RT1d; \ + movzbl rx ## bl, rx ## d; \ + op2 ## l s3(RTAB,RT1,4), RT0d; \ + op3 ## l s4(RTAB,rx,4), RT0d; \ + xorq RT0, rlr; + +#define F4(km, load_next_kr, op0, op1, op2, op3) \ + movl km, RX0d; \ + op0 ## l RLR0d, RX0d; \ + roll RKRbl, RX0d; \ + rorq $32, RLR0; \ + \ + movl km, RX1d; \ + op0 ## l RLR1d, RX1d; \ + roll RKRbl, RX1d; \ + rorq $32, RLR1; \ + \ + movl km, RX2d; \ + op0 ## l RLR2d, RX2d; \ + roll RKRbl, RX2d; \ + rorq $32, RLR2; \ + \ + F_tail(RLR0, RX0, op1, op2, op3); \ + F_tail(RLR1, RX1, op1, op2, op3); \ + F_tail(RLR2, RX2, op1, op2, op3); \ + \ + movl km, RX0d; \ + op0 ## l RLR3d, RX0d; \ + roll RKRbl, RX0d; \ + load_next_kr(); \ + rorq $32, RLR3; \ + \ + F_tail(RLR3, RX0, op1, op2, op3); + +#define F4_1(km, load_next_kr) \ + F4(km, load_next_kr, add, xor, sub, add) +#define F4_2(km, load_next_kr) \ + F4(km, load_next_kr, xor, sub, add, xor) +#define F4_3(km, load_next_kr) \ + F4(km, load_next_kr, sub, add, xor, sub) + +#define round_enc4(n, FA, FB, fn1, fn2) \ + get_round_km(n + 1, RKM1d); \ + FA(RKM0d, fn1); \ + get_round_km(n + 2, RKM0d); \ + FB(RKM1d, fn2); + +#define round_enc_last4(n, FXA, FXB) \ + get_round_km(n + 1, RKM1d); \ + FXA(RKM0d, shr_kr); \ + FXB(RKM1d, dummy); + +#define round_enc4_1(n, FA, FB) \ + round_enc4(n, FA, FB, shr_kr, shr_kr); + +#define round_enc4_2(n, FA, FB) \ + round_enc4(n, FA, FB, shr_kr, dummy); + +#define round_dec4(n, FA, FB, fn1, fn2) \ + get_round_km(n - 1, RKM1d); \ + FA(RKM0d, fn1); \ + get_round_km(n - 2, RKM0d); \ + FB(RKM1d, fn2); + +#define round_dec_last4(n, FXA, FXB) \ + get_round_km(n - 1, RKM1d); \ + FXA(RKM0d, shr_kr); \ + FXB(RKM1d, dummy); + +#define round_dec4_1(n, FA, FB) \ + round_dec4(n, FA, FB, shr_kr, shr_kr); + +#define round_dec4_2(n, FA, FB) \ + round_dec4(n, FA, FB, shr_kr, dummy); + +#define inbswap_block4(a, b, c, d) \ + bswapq a; \ + bswapq b; \ + bswapq c; \ + bswapq d; + +#define outbswap_block4(a, b, c, d) \ + bswapq a; \ + bswapq b; \ + bswapq c; \ + bswapq d; \ + rorq $32, a; \ + rorq $32, b; \ + rorq $32, c; \ + rorq $32, d; + +.align 8 +.type __cast5_enc_blk4, at function; + +__cast5_enc_blk4: + /* input: + * %rdi: ctx, CTX + * RLR0,RLR1,RLR2,RLR3: four input plaintext blocks + * output: + * RLR0,RLR1,RLR2,RLR3: four output ciphertext blocks + */ + GET_EXTERN_POINTER(_gcry_cast5_s1to4, RTAB); + + get_round_km(0, RKM0d); + get_round_kr_enc(0); + round_enc4_1(0, F4_1, F4_2); + round_enc4_1(2, F4_3, F4_1); + round_enc4_1(4, F4_2, F4_3); + round_enc4_2(6, F4_1, F4_2); + get_round_kr_enc(8); + round_enc4_1(8, F4_3, F4_1); + round_enc4_1(10, F4_2, F4_3); + round_enc4_1(12, F4_1, F4_2); + round_enc_last4(14, F4_3, F4_1); + + outbswap_block4(RLR0, RLR1, RLR2, RLR3); + ret; +.size __cast5_enc_blk4,.-__cast5_enc_blk4; + +.align 8 +.type __cast5_dec_blk4, at function; + +__cast5_dec_blk4: + /* input: + * %rdi: ctx, CTX + * RLR0,RLR1,RLR2,RLR3: four input ciphertext blocks + * output: + * RLR0,RLR1,RLR2,RLR3: four output plaintext blocks + */ + GET_EXTERN_POINTER(_gcry_cast5_s1to4, RTAB); + + inbswap_block4(RLR0, RLR1, RLR2, RLR3); + + get_round_km(15, RKM0d); + get_round_kr_dec(15); + round_dec4_1(15, F4_1, F4_3); + round_dec4_1(13, F4_2, F4_1); + round_dec4_1(11, F4_3, F4_2); + round_dec4_2(9, F4_1, F4_3); + get_round_kr_dec(7); + round_dec4_1(7, F4_2, F4_1); + round_dec4_1(5, F4_3, F4_2); + round_dec4_1(3, F4_1, F4_3); + round_dec_last4(1, F4_2, F4_1); + + outbswap_block4(RLR0, RLR1, RLR2, RLR3); + ret; +.size __cast5_dec_blk4,.-__cast5_dec_blk4; + +.align 8 +.global _gcry_cast5_amd64_ctr_enc +.type _gcry_cast5_amd64_ctr_enc, at function; +_gcry_cast5_amd64_ctr_enc: + /* input: + * %rdi: ctx, CTX + * %rsi: dst (8 blocks) + * %rdx: src (8 blocks) + * %rcx: iv (big endian, 64bit) + */ + + pushq %rbp; + pushq %rbx; + pushq %r12; + pushq %r13; + pushq %r14; + + pushq %rsi; + pushq %rdx; + + /* load IV and byteswap */ + movq (%rcx), RX0; + bswapq RX0; + movq RX0, RLR0; + + /* construct IVs */ + leaq 1(RX0), RLR1; + leaq 2(RX0), RLR2; + leaq 3(RX0), RLR3; + leaq 4(RX0), RX0; + bswapq RX0; + + /* store new IV */ + movq RX0, (%rcx); + + call __cast5_enc_blk4; + + popq %r14; /*src*/ + popq %r13; /*dst*/ + + /* XOR key-stream with plaintext */ + xorq 0 * 8(%r14), RLR0; + xorq 1 * 8(%r14), RLR1; + xorq 2 * 8(%r14), RLR2; + xorq 3 * 8(%r14), RLR3; + movq RLR0, 0 * 8(%r13); + movq RLR1, 1 * 8(%r13); + movq RLR2, 2 * 8(%r13); + movq RLR3, 3 * 8(%r13); + + popq %r14; + popq %r13; + popq %r12; + popq %rbx; + popq %rbp; + ret +.size _gcry_cast5_amd64_ctr_enc,.-_gcry_cast5_amd64_ctr_enc; + +.align 8 +.global _gcry_cast5_amd64_cbc_dec +.type _gcry_cast5_amd64_cbc_dec, at function; +_gcry_cast5_amd64_cbc_dec: + /* input: + * %rdi: ctx, CTX + * %rsi: dst (8 blocks) + * %rdx: src (8 blocks) + * %rcx: iv (64bit) + */ + + pushq %rbp; + pushq %rbx; + pushq %r12; + pushq %r13; + pushq %r14; + + pushq %rcx; + pushq %rsi; + pushq %rdx; + + /* load input */ + movq 0 * 8(%rdx), RLR0; + movq 1 * 8(%rdx), RLR1; + movq 2 * 8(%rdx), RLR2; + movq 3 * 8(%rdx), RLR3; + + call __cast5_dec_blk4; + + popq RX0; /*src*/ + popq RX1; /*dst*/ + popq RX2; /*iv*/ + + movq 3 * 8(RX0), %r14; + xorq (RX2), RLR0; + xorq 0 * 8(RX0), RLR1; + xorq 1 * 8(RX0), RLR2; + xorq 2 * 8(RX0), RLR3; + movq %r14, (RX2); /* store new IV */ + + movq RLR0, 0 * 8(RX1); + movq RLR1, 1 * 8(RX1); + movq RLR2, 2 * 8(RX1); + movq RLR3, 3 * 8(RX1); + + popq %r14; + popq %r13; + popq %r12; + popq %rbx; + popq %rbp; + ret; + +.size _gcry_cast5_amd64_cbc_dec,.-_gcry_cast5_amd64_cbc_dec; + +.align 8 +.global _gcry_cast5_amd64_cfb_dec +.type _gcry_cast5_amd64_cfb_dec, at function; +_gcry_cast5_amd64_cfb_dec: + /* input: + * %rdi: ctx, CTX + * %rsi: dst (8 blocks) + * %rdx: src (8 blocks) + * %rcx: iv (64bit) + */ + + pushq %rbp; + pushq %rbx; + pushq %r12; + pushq %r13; + pushq %r14; + + pushq %rsi; + pushq %rdx; + + /* Load input */ + movq (%rcx), RLR0; + movq 0 * 8(%rdx), RLR1; + movq 1 * 8(%rdx), RLR2; + movq 2 * 8(%rdx), RLR3; + + inbswap_block4(RLR0, RLR1, RLR2, RLR3); + + /* Update IV */ + movq 3 * 8(%rdx), %rdx; + movq %rdx, (%rcx); + + call __cast5_enc_blk4; + + popq %rdx; /*src*/ + popq %rcx; /*dst*/ + + xorq 0 * 8(%rdx), RLR0; + xorq 1 * 8(%rdx), RLR1; + xorq 2 * 8(%rdx), RLR2; + xorq 3 * 8(%rdx), RLR3; + movq RLR0, 0 * 8(%rcx); + movq RLR1, 1 * 8(%rcx); + movq RLR2, 2 * 8(%rcx); + movq RLR3, 3 * 8(%rcx); + + popq %r14; + popq %r13; + popq %r12; + popq %rbx; + popq %rbp; + ret; + +.size _gcry_cast5_amd64_cfb_dec,.-_gcry_cast5_amd64_cfb_dec; + +#endif /*defined(USE_CAST5)*/ +#endif /*__x86_64*/ diff --git a/cipher/cast5.c b/cipher/cast5.c index 9905f5c..8c5664d 100644 --- a/cipher/cast5.c +++ b/cipher/cast5.c @@ -42,6 +42,14 @@ #include "g10lib.h" #include "types.h" #include "cipher.h" +#include "bufhelp.h" +#include "cipher-selftest.h" + +/* USE_AMD64_ASM indicates whether to use AMD64 assembly code. */ +#undef USE_AMD64_ASM +#if defined(__x86_64__) +# define USE_AMD64_ASM 1 +#endif #define CAST5_BLOCKSIZE 8 @@ -56,8 +64,12 @@ static void decrypt_block (void *c, byte *outbuf, const byte *inbuf); +#define s1 _gcry_cast5_s1to4[0] +#define s2 _gcry_cast5_s1to4[1] +#define s3 _gcry_cast5_s1to4[2] +#define s4 _gcry_cast5_s1to4[3] -static const u32 s1[256] = { +const u32 _gcry_cast5_s1to4[4][256] = { { 0x30fb40d4, 0x9fa0ff0b, 0x6beccd2f, 0x3f258c7a, 0x1e213f2f, 0x9c004dd3, 0x6003e540, 0xcf9fc949, 0xbfd4af27, 0x88bbbdb5, 0xe2034090, 0x98d09675, 0x6e63a0e0, 0x15c361d2, 0xc2e7661d, 0x22d4ff8e, 0x28683b6f, 0xc07fd059, 0xff2379c8, 0x775f50e2, 0x43c340d3, 0xdf2f8656, 0x887ca41a, 0xa2d2bd2d, @@ -90,8 +102,7 @@ static const u32 s1[256] = { 0x474d6ad7, 0x7c0c5e5c, 0xd1231959, 0x381b7298, 0xf5d2f4db, 0xab838653, 0x6e2f1e23, 0x83719c9e, 0xbd91e046, 0x9a56456e, 0xdc39200c, 0x20c8c571, 0x962bda1c, 0xe1e696ff, 0xb141ab08, 0x7cca89b9, 0x1a69e783, 0x02cc4843, 0xa2f7c579, 0x429ef47d, 0x427b169c, 0x5ac9f049, 0xdd8f0f00, 0x5c8165bf -}; -static const u32 s2[256] = { +}, { 0x1f201094, 0xef0ba75b, 0x69e3cf7e, 0x393f4380, 0xfe61cf7a, 0xeec5207a, 0x55889c94, 0x72fc0651, 0xada7ef79, 0x4e1d7235, 0xd55a63ce, 0xde0436ba, 0x99c430ef, 0x5f0c0794, 0x18dcdb7d, 0xa1d6eff3, 0xa0b52f7b, 0x59e83605, 0xee15b094, 0xe9ffd909, 0xdc440086, 0xef944459, 0xba83ccb3, 0xe0c3cdfb, @@ -124,8 +135,7 @@ static const u32 s2[256] = { 0xb284600c, 0xd835731d, 0xdcb1c647, 0xac4c56ea, 0x3ebd81b3, 0x230eabb0, 0x6438bc87, 0xf0b5b1fa, 0x8f5ea2b3, 0xfc184642, 0x0a036b7a, 0x4fb089bd, 0x649da589, 0xa345415e, 0x5c038323, 0x3e5d3bb9, 0x43d79572, 0x7e6dd07c, 0x06dfdf1e, 0x6c6cc4ef, 0x7160a539, 0x73bfbe70, 0x83877605, 0x4523ecf1 -}; -static const u32 s3[256] = { +}, { 0x8defc240, 0x25fa5d9f, 0xeb903dbf, 0xe810c907, 0x47607fff, 0x369fe44b, 0x8c1fc644, 0xaececa90, 0xbeb1f9bf, 0xeefbcaea, 0xe8cf1950, 0x51df07ae, 0x920e8806, 0xf0ad0548, 0xe13c8d83, 0x927010d5, 0x11107d9f, 0x07647db9, 0xb2e3e4d4, 0x3d4f285e, 0xb9afa820, 0xfade82e0, 0xa067268b, 0x8272792e, @@ -158,8 +168,7 @@ static const u32 s3[256] = { 0x5727c148, 0x2be98a1d, 0x8ab41738, 0x20e1be24, 0xaf96da0f, 0x68458425, 0x99833be5, 0x600d457d, 0x282f9350, 0x8334b362, 0xd91d1120, 0x2b6d8da0, 0x642b1e31, 0x9c305a00, 0x52bce688, 0x1b03588a, 0xf7baefd5, 0x4142ed9c, 0xa4315c11, 0x83323ec5, 0xdfef4636, 0xa133c501, 0xe9d3531c, 0xee353783 -}; -static const u32 s4[256] = { +}, { 0x9db30420, 0x1fb6e9de, 0xa7be7bef, 0xd273a298, 0x4a4f7bdb, 0x64ad8c57, 0x85510443, 0xfa020ed1, 0x7e287aff, 0xe60fb663, 0x095f35a1, 0x79ebf120, 0xfd059d43, 0x6497b7b1, 0xf3641f63, 0x241e4adf, 0x28147f5f, 0x4fa2b8cd, 0xc9430040, 0x0cc32220, 0xfdd30b30, 0xc0a5374f, 0x1d2d00d9, 0x24147b15, @@ -192,7 +201,7 @@ static const u32 s4[256] = { 0xb5676e69, 0x9bd3ddda, 0xdf7e052f, 0xdb25701c, 0x1b5e51ee, 0xf65324e6, 0x6afce36c, 0x0316cc04, 0x8644213e, 0xb7dc59d0, 0x7965291f, 0xccd6fd43, 0x41823979, 0x932bcdf6, 0xb657c34d, 0x4edfd282, 0x7ae5290c, 0x3cb9536b, 0x851e20fe, 0x9833557e, 0x13ecf0b0, 0xd3ffb372, 0x3f85c5c1, 0x0aef7ed2 -}; +} }; static const u32 s5[256] = { 0x7ec90c04, 0x2c6e74b9, 0x9b0e66df, 0xa6337911, 0xb86a7fff, 0x1dd358f5, 0x44dd9d44, 0x1731167f, 0x08fbf1fa, 0xe7f511cc, 0xd2051b00, 0x735aba00, 0x2ab722d8, 0x386381cb, 0xacf6243a, 0x69befd7a, @@ -331,6 +340,53 @@ static const u32 s8[256] = { }; +#ifdef USE_AMD64_ASM + +/* Assembly implementations of CAST5. */ +extern void _gcry_cast5_amd64_encrypt_block(CAST5_context *c, byte *outbuf, + const byte *inbuf); + +extern void _gcry_cast5_amd64_decrypt_block(CAST5_context *c, byte *outbuf, + const byte *inbuf); + +/* These assembly implementations process four blocks in parallel. */ +extern void _gcry_cast5_amd64_ctr_enc(CAST5_context *ctx, byte *out, + const byte *in, byte *ctr); + +extern void _gcry_cast5_amd64_cbc_dec(CAST5_context *ctx, byte *out, + const byte *in, byte *iv); + +extern void _gcry_cast5_amd64_cfb_dec(CAST5_context *ctx, byte *out, + const byte *in, byte *iv); + +static void +do_encrypt_block (CAST5_context *context, byte *outbuf, const byte *inbuf) +{ + _gcry_cast5_amd64_encrypt_block (context, outbuf, inbuf); +} + +static void +do_decrypt_block (CAST5_context *context, byte *outbuf, const byte *inbuf) +{ + _gcry_cast5_amd64_decrypt_block (context, outbuf, inbuf); +} + +static void encrypt_block (void *context , byte *outbuf, const byte *inbuf) +{ + CAST5_context *c = (CAST5_context *) context; + do_encrypt_block (c, outbuf, inbuf); + _gcry_burn_stack (2*8); +} + +static void decrypt_block (void *context, byte *outbuf, const byte *inbuf) +{ + CAST5_context *c = (CAST5_context *) context; + _gcry_cast5_amd64_decrypt_block (c, outbuf, inbuf); + _gcry_burn_stack (2*8); +} + +#else /*USE_AMD64_ASM*/ + #if defined(__GNUC__) && defined(__i386__) static inline u32 rol(int n, u32 x) @@ -463,6 +519,201 @@ decrypt_block (void *context, byte *outbuf, const byte *inbuf) _gcry_burn_stack (20+4*sizeof(void*)); } +#endif /*!USE_AMD64_ASM*/ + + +/* Bulk encryption of complete blocks in CTR mode. This function is only + intended for the bulk encryption feature of cipher.c. CTR is expected to be + of size CAST5_BLOCKSIZE. */ +void +_gcry_cast5_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg, + const void *inbuf_arg, unsigned int nblocks) +{ + CAST5_context *ctx = context; + unsigned char *outbuf = outbuf_arg; + const unsigned char *inbuf = inbuf_arg; + unsigned char tmpbuf[CAST5_BLOCKSIZE]; + int burn_stack_depth = (20 + 4 * sizeof(void*)) + 2 * CAST5_BLOCKSIZE; + + int i; + +#ifdef USE_AMD64_ASM + { + if (nblocks >= 4) + burn_stack_depth += 8 * sizeof(void*); + + /* Process data in 4 block chunks. */ + while (nblocks >= 4) + { + _gcry_cast5_amd64_ctr_enc(ctx, outbuf, inbuf, ctr); + + nblocks -= 4; + outbuf += 4 * CAST5_BLOCKSIZE; + inbuf += 4 * CAST5_BLOCKSIZE; + } + + /* Use generic code to handle smaller chunks... */ + /* TODO: use caching instead? */ + } +#endif + + for ( ;nblocks; nblocks-- ) + { + /* Encrypt the counter. */ + do_encrypt_block(ctx, tmpbuf, ctr); + /* XOR the input with the encrypted counter and store in output. */ + buf_xor(outbuf, tmpbuf, inbuf, CAST5_BLOCKSIZE); + outbuf += CAST5_BLOCKSIZE; + inbuf += CAST5_BLOCKSIZE; + /* Increment the counter. */ + for (i = CAST5_BLOCKSIZE; i > 0; i--) + { + ctr[i-1]++; + if (ctr[i-1]) + break; + } + } + + wipememory(tmpbuf, sizeof(tmpbuf)); + _gcry_burn_stack(burn_stack_depth); +} + + +/* Bulk decryption of complete blocks in CBC mode. This function is only + intended for the bulk encryption feature of cipher.c. */ +void +_gcry_cast5_cbc_dec(void *context, unsigned char *iv, void *outbuf_arg, + const void *inbuf_arg, unsigned int nblocks) +{ + CAST5_context *ctx = context; + unsigned char *outbuf = outbuf_arg; + const unsigned char *inbuf = inbuf_arg; + unsigned char savebuf[CAST5_BLOCKSIZE]; + int burn_stack_depth = (20 + 4 * sizeof(void*)) + 2 * CAST5_BLOCKSIZE; + +#ifdef USE_AMD64_ASM + { + if (nblocks >= 4) + burn_stack_depth += 8 * sizeof(void*); + + /* Process data in 4 block chunks. */ + while (nblocks >= 4) + { + _gcry_cast5_amd64_cbc_dec(ctx, outbuf, inbuf, iv); + + nblocks -= 4; + outbuf += 4 * CAST5_BLOCKSIZE; + inbuf += 4 * CAST5_BLOCKSIZE; + } + + /* Use generic code to handle smaller chunks... */ + } +#endif + + for ( ;nblocks; nblocks-- ) + { + /* We need to save INBUF away because it may be identical to + OUTBUF. */ + memcpy(savebuf, inbuf, CAST5_BLOCKSIZE); + + do_decrypt_block (ctx, outbuf, inbuf); + + buf_xor(outbuf, outbuf, iv, CAST5_BLOCKSIZE); + memcpy(iv, savebuf, CAST5_BLOCKSIZE); + inbuf += CAST5_BLOCKSIZE; + outbuf += CAST5_BLOCKSIZE; + } + + wipememory(savebuf, sizeof(savebuf)); + _gcry_burn_stack(burn_stack_depth); +} + +/* Bulk decryption of complete blocks in CFB mode. This function is only + intended for the bulk encryption feature of cipher.c. */ +void +_gcry_cast5_cfb_dec(void *context, unsigned char *iv, void *outbuf_arg, + const void *inbuf_arg, unsigned int nblocks) +{ + CAST5_context *ctx = context; + unsigned char *outbuf = outbuf_arg; + const unsigned char *inbuf = inbuf_arg; + int burn_stack_depth = (20 + 4 * sizeof(void*)) + 2 * CAST5_BLOCKSIZE; + +#ifdef USE_AMD64_ASM + { + if (nblocks >= 4) + burn_stack_depth += 8 * sizeof(void*); + + /* Process data in 4 block chunks. */ + while (nblocks >= 4) + { + _gcry_cast5_amd64_cfb_dec(ctx, outbuf, inbuf, iv); + + nblocks -= 4; + outbuf += 4 * CAST5_BLOCKSIZE; + inbuf += 4 * CAST5_BLOCKSIZE; + } + + /* Use generic code to handle smaller chunks... */ + } +#endif + + for ( ;nblocks; nblocks-- ) + { + do_encrypt_block(ctx, iv, iv); + buf_xor_n_copy(outbuf, iv, inbuf, CAST5_BLOCKSIZE); + outbuf += CAST5_BLOCKSIZE; + inbuf += CAST5_BLOCKSIZE; + } + + _gcry_burn_stack(burn_stack_depth); +} + + +/* Run the self-tests for CAST5-CTR, tests IV increment of bulk CTR + encryption. Returns NULL on success. */ +static const char * +selftest_ctr (void) +{ + const int nblocks = 4+1; + const int blocksize = CAST5_BLOCKSIZE; + const int context_size = sizeof(CAST5_context); + + return _gcry_selftest_helper_ctr("CAST5", &cast_setkey, + &encrypt_block, &_gcry_cast5_ctr_enc, nblocks, blocksize, + context_size); +} + + +/* Run the self-tests for CAST5-CBC, tests bulk CBC decryption. + Returns NULL on success. */ +static const char * +selftest_cbc (void) +{ + const int nblocks = 4+2; + const int blocksize = CAST5_BLOCKSIZE; + const int context_size = sizeof(CAST5_context); + + return _gcry_selftest_helper_cbc("CAST5", &cast_setkey, + &encrypt_block, &_gcry_cast5_cbc_dec, nblocks, blocksize, + context_size); +} + + +/* Run the self-tests for CAST5-CFB, tests bulk CBC decryption. + Returns NULL on success. */ +static const char * +selftest_cfb (void) +{ + const int nblocks = 4+2; + const int blocksize = CAST5_BLOCKSIZE; + const int context_size = sizeof(CAST5_context); + + return _gcry_selftest_helper_cfb("CAST5", &cast_setkey, + &encrypt_block, &_gcry_cast5_cfb_dec, nblocks, blocksize, + context_size); +} + static const char* selftest(void) @@ -473,6 +724,7 @@ selftest(void) byte plain[8] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF }; byte cipher[8]= { 0x23, 0x8B, 0x4F, 0xE5, 0x84, 0x7E, 0x44, 0xB2 }; byte buffer[8]; + const char *r; cast_setkey( &c, key, 16 ); encrypt_block( &c, buffer, plain ); @@ -507,6 +759,16 @@ selftest(void) } #endif + + if ( (r = selftest_cbc ()) ) + return r; + + if ( (r = selftest_cfb ()) ) + return r; + + if ( (r = selftest_ctr ()) ) + return r; + return NULL; } diff --git a/cipher/cipher.c b/cipher/cipher.c index 652d795..79ca755 100644 --- a/cipher/cipher.c +++ b/cipher/cipher.c @@ -718,6 +718,13 @@ gcry_cipher_open (gcry_cipher_hd_t *handle, h->bulk.ctr_enc = _gcry_aes_ctr_enc; break; #endif /*USE_AES*/ +#ifdef USE_CAST5 + case GCRY_CIPHER_CAST5: + h->bulk.cfb_dec = _gcry_cast5_cfb_dec; + h->bulk.cbc_dec = _gcry_cast5_cbc_dec; + h->bulk.ctr_enc = _gcry_cast5_ctr_enc; + break; +#endif /*USE_CAMELLIA*/ #ifdef USE_CAMELLIA case GCRY_CIPHER_CAMELLIA128: case GCRY_CIPHER_CAMELLIA192: diff --git a/configure.ac b/configure.ac index 3fec8bc..113c71f 100644 --- a/configure.ac +++ b/configure.ac @@ -1195,6 +1195,13 @@ LIST_MEMBER(cast5, $enabled_ciphers) if test "$found" = "1" ; then GCRYPT_CIPHERS="$GCRYPT_CIPHERS cast5.lo" AC_DEFINE(USE_CAST5, 1, [Defined if this module should be included]) + + case "${host}" in + x86_64-*-*) + # Build with the assembly implementation + GCRYPT_CIPHERS="$GCRYPT_CIPHERS cast5-amd64.lo" + ;; + esac fi LIST_MEMBER(des, $enabled_ciphers) diff --git a/src/cipher.h b/src/cipher.h index 9d6cc01..1742003 100644 --- a/src/cipher.h +++ b/src/cipher.h @@ -95,6 +95,19 @@ void _gcry_aes_ctr_enc (void *context, unsigned char *ctr, void *outbuf_arg, const void *inbuf_arg, unsigned int nblocks); +/*-- cast5.c --*/ +void _gcry_cast5_cfb_dec (void *context, unsigned char *iv, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks); + +void _gcry_cast5_cbc_dec (void *context, unsigned char *iv, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks); + +void _gcry_cast5_ctr_enc (void *context, unsigned char *ctr, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks); + /*-- camellia-glue.c --*/ void _gcry_camellia_ctr_enc (void *context, unsigned char *ctr, void *outbuf_arg, const void *inbuf_arg, commit ab8fc70b5f0c396a5bc941267f59166e860b8c5d Author: Jussi Kivilinna Date: Fri May 24 12:43:24 2013 +0300 cipher-selftest: make selftest work with any block-size * cipher/cipher-selftest.c (_gcry_selftest_helper_cbc_128) (_gcry_selftest_helper_cfb_128, _gcry_selftest_helper_ctr_128): Renamed functions from '_128' to ''. (_gcry_selftest_helper_cbc, _gcry_selftest_helper_cfb) (_gcry_selftest_helper_ctr): Make work with different block sizes. * cipher/cipher-selftest.h (_gcry_selftest_helper_cbc_128) (_gcry_selftest_helper_cfb_128, _gcry_selftest_helper_ctr_128): Renamed prototypes from '_128' to ''. * cipher/camellia-glue.c (selftest_ctr_128, selftest_cfb_128) (selftest_ctr_128): Change to use new function names. * cipher/rijndael.c (selftest_ctr_128, selftest_cfb_128) (selftest_ctr_128): Change to use new function names. * cipher/serpent.c (selftest_ctr_128, selftest_cfb_128) (selftest_ctr_128): Change to use new function names. -- Signed-off-by: Jussi Kivilinna diff --git a/cipher/camellia-glue.c b/cipher/camellia-glue.c index f9bbb33..4163e82 100644 --- a/cipher/camellia-glue.c +++ b/cipher/camellia-glue.c @@ -374,7 +374,7 @@ selftest_ctr_128 (void) const int blocksize = CAMELLIA_BLOCK_SIZE; const int context_size = sizeof(CAMELLIA_context); - return _gcry_selftest_helper_ctr_128("CAMELLIA", &camellia_setkey, + return _gcry_selftest_helper_ctr("CAMELLIA", &camellia_setkey, &camellia_encrypt, &_gcry_camellia_ctr_enc, nblocks, blocksize, context_size); } @@ -388,7 +388,7 @@ selftest_cbc_128 (void) const int blocksize = CAMELLIA_BLOCK_SIZE; const int context_size = sizeof(CAMELLIA_context); - return _gcry_selftest_helper_cbc_128("CAMELLIA", &camellia_setkey, + return _gcry_selftest_helper_cbc("CAMELLIA", &camellia_setkey, &camellia_encrypt, &_gcry_camellia_cbc_dec, nblocks, blocksize, context_size); } @@ -402,7 +402,7 @@ selftest_cfb_128 (void) const int blocksize = CAMELLIA_BLOCK_SIZE; const int context_size = sizeof(CAMELLIA_context); - return _gcry_selftest_helper_cfb_128("CAMELLIA", &camellia_setkey, + return _gcry_selftest_helper_cfb("CAMELLIA", &camellia_setkey, &camellia_encrypt, &_gcry_camellia_cfb_dec, nblocks, blocksize, context_size); } diff --git a/cipher/cipher-selftest.c b/cipher/cipher-selftest.c index 41eb405..17742e3 100644 --- a/cipher/cipher-selftest.c +++ b/cipher/cipher-selftest.c @@ -44,15 +44,14 @@ #endif -/* Run the self-tests for -CBC-128, tests bulk CBC +/* Run the self-tests for -CBC-, tests bulk CBC decryption. Returns NULL on success. */ const char * -_gcry_selftest_helper_cbc_128 (const char *cipher, - gcry_cipher_setkey_t setkey_func, - gcry_cipher_encrypt_t encrypt_one, - gcry_cipher_bulk_cbc_dec_t bulk_cbc_dec, - const int nblocks, const int blocksize, - const int context_size) +_gcry_selftest_helper_cbc (const char *cipher, gcry_cipher_setkey_t setkey_func, + gcry_cipher_encrypt_t encrypt_one, + gcry_cipher_bulk_cbc_dec_t bulk_cbc_dec, + const int nblocks, const int blocksize, + const int context_size) { int i, offs; unsigned char *ctx, *plaintext, *plaintext2, *ciphertext, *iv, *iv2, *mem; @@ -63,7 +62,8 @@ _gcry_selftest_helper_cbc_128 (const char *cipher, 0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x22 }; - /* Allocate buffers, align elements to 16 bytes. */ + /* Allocate buffers, align first two elements to 16 bytes and latter to + block size. */ ctx_aligned_size = context_size + 15; ctx_aligned_size -= ctx_aligned_size & 0xf; @@ -97,24 +97,25 @@ _gcry_selftest_helper_cbc_128 (const char *cipher, /* CBC decrypt. */ bulk_cbc_dec (ctx, iv2, plaintext2, ciphertext, 1); - if (memcmp (plaintext2, plaintext, 16)) + if (memcmp (plaintext2, plaintext, blocksize)) { gcry_free (mem); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " - "%s-128-CBC test failed (plaintext mismatch)", cipher); + "%s-CBC-%d test failed (plaintext mismatch)", cipher, + blocksize * 8); #endif - return "selftest for 128 bit CBC failed - see syslog for details"; + return "selftest for CBC failed - see syslog for details"; } - if (memcmp (iv2, iv, 16)) + if (memcmp (iv2, iv, blocksize)) { gcry_free (mem); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " - "%s-128-CBC test failed (IV mismatch)", cipher); + "%s-CBC-%d test failed (IV mismatch)", cipher, blocksize * 8); #endif - return "selftest for 128 bit CBC failed - see syslog for details"; + return "selftest for CBC failed - see syslog for details"; } /* Test parallelized code paths */ @@ -140,35 +141,34 @@ _gcry_selftest_helper_cbc_128 (const char *cipher, gcry_free (mem); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " - "%s-128-CBC test failed (plaintext mismatch, parallel path)", - cipher); + "%s-CBC-%d test failed (plaintext mismatch, parallel path)", + cipher, blocksize * 8); #endif - return "selftest for 128 bit CBC failed - see syslog for details"; + return "selftest for CBC failed - see syslog for details"; } if (memcmp (iv2, iv, blocksize)) { gcry_free (mem); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " - "%s-128-CBC test failed (IV mismatch, parallel path)", - cipher); + "%s-CBC-%d test failed (IV mismatch, parallel path)", + cipher, blocksize * 8); #endif - return "selftest for 128 bit CBC failed - see syslog for details"; + return "selftest for CBC failed - see syslog for details"; } gcry_free (mem); return NULL; } -/* Run the self-tests for -CFB-128, tests bulk CFB +/* Run the self-tests for -CFB-, tests bulk CFB decryption. Returns NULL on success. */ const char * -_gcry_selftest_helper_cfb_128 (const char *cipher, - gcry_cipher_setkey_t setkey_func, - gcry_cipher_encrypt_t encrypt_one, - gcry_cipher_bulk_cfb_dec_t bulk_cfb_dec, - const int nblocks, const int blocksize, - const int context_size) +_gcry_selftest_helper_cfb (const char *cipher, gcry_cipher_setkey_t setkey_func, + gcry_cipher_encrypt_t encrypt_one, + gcry_cipher_bulk_cfb_dec_t bulk_cfb_dec, + const int nblocks, const int blocksize, + const int context_size) { int i, offs; unsigned char *ctx, *plaintext, *plaintext2, *ciphertext, *iv, *iv2, *mem; @@ -179,7 +179,8 @@ _gcry_selftest_helper_cfb_128 (const char *cipher, 0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x33 }; - /* Allocate buffers, align elements to 16 bytes. */ + /* Allocate buffers, align first two elements to 16 bytes and latter to + block size. */ ctx_aligned_size = context_size + 15; ctx_aligned_size -= ctx_aligned_size & 0xf; @@ -217,9 +218,10 @@ _gcry_selftest_helper_cfb_128 (const char *cipher, gcry_free(mem); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " - "%s-128-CFB test failed (plaintext mismatch)", cipher); + "%s-CFB-%d test failed (plaintext mismatch)", cipher, + blocksize * 8); #endif - return "selftest for 128 bit CFB failed - see syslog for details"; + return "selftest for CFB failed - see syslog for details"; } if (memcmp(iv2, iv, blocksize)) @@ -227,9 +229,9 @@ _gcry_selftest_helper_cfb_128 (const char *cipher, gcry_free(mem); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " - "%s-128-CFB test failed (IV mismatch)", cipher); + "%s-CFB-%d test failed (IV mismatch)", cipher, blocksize * 8); #endif - return "selftest for 128 bit CFB failed - see syslog for details"; + return "selftest for CFB failed - see syslog for details"; } /* Test parallelized code paths */ @@ -254,34 +256,34 @@ _gcry_selftest_helper_cfb_128 (const char *cipher, gcry_free(mem); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " - "%s-128-CFB test failed (plaintext mismatch, parallel path)", - cipher); + "%s-CFB-%d test failed (plaintext mismatch, parallel path)", + cipher, blocksize * 8); #endif - return "selftest for 128 bit CFB failed - see syslog for details"; + return "selftest for CFB failed - see syslog for details"; } if (memcmp(iv2, iv, blocksize)) { gcry_free(mem); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " - "%s-128-CFB test failed (IV mismatch, parallel path)", cipher); + "%s-CFB-%d test failed (IV mismatch, parallel path)", cipher, + blocksize * 8); #endif - return "selftest for 128 bit CFB failed - see syslog for details"; + return "selftest for CFB failed - see syslog for details"; } gcry_free(mem); return NULL; } -/* Run the self-tests for -CTR-128, tests IV increment of bulk CTR - encryption. Returns NULL on success. */ +/* Run the self-tests for -CTR-, tests IV increment + of bulk CTR encryption. Returns NULL on success. */ const char * -_gcry_selftest_helper_ctr_128 (const char *cipher, - gcry_cipher_setkey_t setkey_func, - gcry_cipher_encrypt_t encrypt_one, - gcry_cipher_bulk_ctr_enc_t bulk_ctr_enc, - const int nblocks, const int blocksize, - const int context_size) +_gcry_selftest_helper_ctr (const char *cipher, gcry_cipher_setkey_t setkey_func, + gcry_cipher_encrypt_t encrypt_one, + gcry_cipher_bulk_ctr_enc_t bulk_ctr_enc, + const int nblocks, const int blocksize, + const int context_size) { int i, j, offs, diff; unsigned char *ctx, *plaintext, *plaintext2, *ciphertext, *iv, *iv2, *mem; @@ -292,7 +294,8 @@ _gcry_selftest_helper_ctr_128 (const char *cipher, 0x98,0xBA,0xF9,0x17,0xFE,0xDF,0x95,0x21 }; - /* Allocate buffers, align elements to 16 bytes. */ + /* Allocate buffers, align first two elements to 16 bytes and latter to + block size. */ ctx_aligned_size = context_size + 15; ctx_aligned_size -= ctx_aligned_size & 0xf; @@ -337,9 +340,10 @@ _gcry_selftest_helper_ctr_128 (const char *cipher, gcry_free (mem); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " - "%s-128-CTR test failed (plaintext mismatch)", cipher); + "%s-CTR-%d test failed (plaintext mismatch)", cipher, + blocksize * 8); #endif - return "selftest for 128 bit CTR failed - see syslog for details"; + return "selftest for CTR failed - see syslog for details"; } if (memcmp (iv2, iv, blocksize)) @@ -347,9 +351,10 @@ _gcry_selftest_helper_ctr_128 (const char *cipher, gcry_free (mem); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " - "%s-128-CTR test failed (IV mismatch)", cipher); + "%s-CTR-%d test failed (IV mismatch)", cipher, + blocksize * 8); #endif - return "selftest for 128 bit CTR failed - see syslog for details"; + return "selftest for CTR failed - see syslog for details"; } /* Test parallelized code paths */ @@ -385,19 +390,20 @@ _gcry_selftest_helper_ctr_128 (const char *cipher, gcry_free (mem); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " - "%s-128-CTR test failed (plaintext mismatch, diff: %d)", cipher, - diff); + "%s-CTR-%d test failed (plaintext mismatch, diff: %d)", cipher, + blocksize * 8, diff); #endif - return "selftest for 128 bit CTR failed - see syslog for details"; + return "selftest for CTR failed - see syslog for details"; } if (memcmp(iv2, iv, blocksize)) { gcry_free (mem); #ifdef HAVE_SYSLOG syslog (LOG_USER|LOG_WARNING, "Libgcrypt warning: " - "%s-128-CTR test failed (IV mismatch, diff: %d)", cipher, diff); + "%s-CTR-%d test failed (IV mismatch, diff: %d)", cipher, + blocksize * 8, diff); #endif - return "selftest for 128 bit CTR failed - see syslog for details"; + return "selftest for CTR failed - see syslog for details"; } } diff --git a/cipher/cipher-selftest.h b/cipher/cipher-selftest.h index 30bc251..41d77af 100644 --- a/cipher/cipher-selftest.h +++ b/cipher/cipher-selftest.h @@ -42,26 +42,26 @@ typedef void (*gcry_cipher_bulk_ctr_enc_t)(void *context, unsigned char *iv, /* Helper function for bulk CBC decryption selftest */ const char * -_gcry_selftest_helper_cbc_128 (const char *cipher, gcry_cipher_setkey_t setkey, - gcry_cipher_encrypt_t encrypt_one, - gcry_cipher_bulk_cbc_dec_t bulk_cbc_dec, - const int nblocks, const int blocksize, - const int context_size); +_gcry_selftest_helper_cbc (const char *cipher, gcry_cipher_setkey_t setkey, + gcry_cipher_encrypt_t encrypt_one, + gcry_cipher_bulk_cbc_dec_t bulk_cbc_dec, + const int nblocks, const int blocksize, + const int context_size); /* Helper function for bulk CFB decryption selftest */ const char * -_gcry_selftest_helper_cfb_128 (const char *cipher, gcry_cipher_setkey_t setkey, - gcry_cipher_encrypt_t encrypt_one, - gcry_cipher_bulk_cfb_dec_t bulk_cfb_dec, - const int nblocks, const int blocksize, - const int context_size); +_gcry_selftest_helper_cfb (const char *cipher, gcry_cipher_setkey_t setkey, + gcry_cipher_encrypt_t encrypt_one, + gcry_cipher_bulk_cfb_dec_t bulk_cfb_dec, + const int nblocks, const int blocksize, + const int context_size); /* Helper function for bulk CTR encryption selftest */ const char * -_gcry_selftest_helper_ctr_128 (const char *cipher, gcry_cipher_setkey_t setkey, - gcry_cipher_encrypt_t encrypt_one, - gcry_cipher_bulk_ctr_enc_t bulk_ctr_enc, - const int nblocks, const int blocksize, - const int context_size); +_gcry_selftest_helper_ctr (const char *cipher, gcry_cipher_setkey_t setkey, + gcry_cipher_encrypt_t encrypt_one, + gcry_cipher_bulk_ctr_enc_t bulk_ctr_enc, + const int nblocks, const int blocksize, + const int context_size); #endif /*G10_SELFTEST_HELP_H*/ diff --git a/cipher/rijndael.c b/cipher/rijndael.c index 9f075ff..ac2fcfb 100644 --- a/cipher/rijndael.c +++ b/cipher/rijndael.c @@ -2168,7 +2168,7 @@ selftest_ctr_128 (void) const int blocksize = BLOCKSIZE; const int context_size = sizeof(RIJNDAEL_context); - return _gcry_selftest_helper_ctr_128("AES", &rijndael_setkey, + return _gcry_selftest_helper_ctr("AES", &rijndael_setkey, &rijndael_encrypt, &_gcry_aes_ctr_enc, nblocks, blocksize, context_size); } @@ -2183,7 +2183,7 @@ selftest_cbc_128 (void) const int blocksize = BLOCKSIZE; const int context_size = sizeof(RIJNDAEL_context); - return _gcry_selftest_helper_cbc_128("AES", &rijndael_setkey, + return _gcry_selftest_helper_cbc("AES", &rijndael_setkey, &rijndael_encrypt, &_gcry_aes_cbc_dec, nblocks, blocksize, context_size); } @@ -2198,7 +2198,7 @@ selftest_cfb_128 (void) const int blocksize = BLOCKSIZE; const int context_size = sizeof(RIJNDAEL_context); - return _gcry_selftest_helper_cfb_128("AES", &rijndael_setkey, + return _gcry_selftest_helper_cfb("AES", &rijndael_setkey, &rijndael_encrypt, &_gcry_aes_cfb_dec, nblocks, blocksize, context_size); } diff --git a/cipher/serpent.c b/cipher/serpent.c index 95ac7c1..c72951e 100644 --- a/cipher/serpent.c +++ b/cipher/serpent.c @@ -997,7 +997,7 @@ selftest_ctr_128 (void) const int blocksize = sizeof(serpent_block_t); const int context_size = sizeof(serpent_context_t); - return _gcry_selftest_helper_ctr_128("SERPENT", &serpent_setkey, + return _gcry_selftest_helper_ctr("SERPENT", &serpent_setkey, &serpent_encrypt, &_gcry_serpent_ctr_enc, nblocks, blocksize, context_size); } @@ -1012,7 +1012,7 @@ selftest_cbc_128 (void) const int blocksize = sizeof(serpent_block_t); const int context_size = sizeof(serpent_context_t); - return _gcry_selftest_helper_cbc_128("SERPENT", &serpent_setkey, + return _gcry_selftest_helper_cbc("SERPENT", &serpent_setkey, &serpent_encrypt, &_gcry_serpent_cbc_dec, nblocks, blocksize, context_size); } @@ -1027,7 +1027,7 @@ selftest_cfb_128 (void) const int blocksize = sizeof(serpent_block_t); const int context_size = sizeof(serpent_context_t); - return _gcry_selftest_helper_cfb_128("SERPENT", &serpent_setkey, + return _gcry_selftest_helper_cfb("SERPENT", &serpent_setkey, &serpent_encrypt, &_gcry_serpent_cfb_dec, nblocks, blocksize, context_size); } ----------------------------------------------------------------------- Summary of changes: cipher/Makefile.am | 2 +- cipher/camellia-glue.c | 6 +- cipher/cast5-amd64.S | 587 ++++++++++++++++++++++++++++++++++++++++++++++ cipher/cast5.c | 278 +++++++++++++++++++++- cipher/cipher-selftest.c | 116 +++++----- cipher/cipher-selftest.h | 30 ++-- cipher/cipher.c | 7 + cipher/rijndael.c | 6 +- cipher/serpent.c | 6 +- configure.ac | 7 + src/cipher.h | 13 + 11 files changed, 970 insertions(+), 88 deletions(-) create mode 100644 cipher/cast5-amd64.S hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Fri May 24 17:18:23 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Fri, 24 May 2013 17:18:23 +0200 Subject: [git] GCRYPT - branch, master, updated. libgcrypt-1.5.0-145-g99b18aa Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, master has been updated via 99b18aa536703ef90c9a1f5c8f40bc68b2064593 (commit) via 9711384f75564a71979e3fb971b5f4cadcf1afef (commit) from 0bdf26eea8cdbffefe7e37578f8f896c4f5f5275 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 99b18aa536703ef90c9a1f5c8f40bc68b2064593 Author: Werner Koch Date: Fri May 24 16:54:52 2013 +0200 ecc: Simplify the compliant point generation. * cipher/ecc.c (generate_key): Use point_snatch_set, replaces unneeded variable copies, etc. Signed-off-by: Werner Koch diff --git a/cipher/ecc.c b/cipher/ecc.c index 63ee2d0..e5a925b 100644 --- a/cipher/ecc.c +++ b/cipher/ecc.c @@ -504,7 +504,6 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name, { gpg_err_code_t err; elliptic_curve_t E; - gcry_mpi_t d; mpi_point_struct Q; mpi_ec_t ctx; gcry_random_level_t random_level; @@ -529,12 +528,12 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name, } random_level = transient_key ? GCRY_STRONG_RANDOM : GCRY_VERY_STRONG_RANDOM; - d = _gcry_dsa_gen_k (E.n, random_level); + sk->d = _gcry_dsa_gen_k (E.n, random_level); /* Compute Q. */ point_init (&Q); ctx = _gcry_mpi_ec_p_internal_new (E.p, E.a); - _gcry_mpi_ec_mul_point (&Q, d, &E.G, ctx); + _gcry_mpi_ec_mul_point (&Q, sk->d, &E.G, ctx); /* Copy the stuff to the key structures. */ sk->E.p = mpi_copy (E.p); @@ -553,47 +552,38 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name, * dropped because we know that it's a minimum of the two * possibilities without any loss of security. */ { - gcry_mpi_t x, p_y, y; - const unsigned int nbits = mpi_get_nbits (E.p); + gcry_mpi_t x, y, p_y; + const unsigned int pbits = mpi_get_nbits (E.p); - x = mpi_new (nbits); - p_y = mpi_new (nbits); - y = mpi_new (nbits); + x = mpi_new (pbits); + y = mpi_new (pbits); + p_y = mpi_new (pbits); if (_gcry_mpi_ec_get_affine (x, y, &Q, ctx)) - log_fatal ("ecgen: Failed to get affine coordinates for Q\n"); + log_fatal ("ecgen: Failed to get affine coordinates for %s\n", "Q"); - mpi_sub( p_y, E.p, y ); /* p_y = p-y */ + mpi_sub (p_y, E.p, y); /* p_y = p - y */ - if (mpi_cmp( p_y /*p-y*/, y ) < 0) /* is p-y < p ? */ + if (mpi_cmp (p_y, y) < 0) /* p - y < p */ { - gcry_mpi_t z = mpi_copy (mpi_const (MPI_C_ONE)); - - /* log_mpidump ("ecgen p-y", p_y); */ - /* log_mpidump ("ecgen y ", y); */ - /* log_debug ("ecgen will replace y with p-y\n"); */ - /* log_mpidump ("ecgen d before", d); */ - /* We need to end up with -Q; this assures that new Q's y is the smallest one */ - sk->d = mpi_new (nbits); - mpi_sub (sk->d, E.n, d); /* d = order-d */ - /* log_mpidump ("ecgen d after ", sk->d); */ - gcry_mpi_point_set (&sk->Q, x, p_y/*p-y*/, z); /* Q = -Q */ + mpi_sub (sk->d, E.n, sk->d); /* d = order - d */ + gcry_mpi_point_snatch_set (&sk->Q, x, p_y, mpi_alloc_set_ui (1)); + if (DBG_CIPHER) log_debug ("ecgen converted Q to a compliant point\n"); - mpi_free (z); } - else + else /* p - y >= p */ { /* No change is needed exactly 50% of the time: just copy. */ - sk->d = mpi_copy (d); point_set (&sk->Q, &Q); if (DBG_CIPHER) log_debug ("ecgen didn't need to convert Q to a compliant point\n"); + + mpi_free (p_y); + mpi_free (x); } - mpi_free (x); - mpi_free (p_y); mpi_free (y); } @@ -612,7 +602,6 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name, _gcry_mpi_ec_free (ctx); point_free (&Q); - mpi_free (d); *r_usedcurve = E.name; curve_free (&E); commit 9711384f75564a71979e3fb971b5f4cadcf1afef Author: Werner Koch Date: Fri May 24 15:52:37 2013 +0200 ecc: Fix a minor flaw in the generation of K. * cipher/dsa.c (gen_k): Factor code out to .. * cipher/dsa-common.c (_gcry_dsa_gen_k): new file and function. Add arg security_level and re-indent a bit. * cipher/ecc.c (gen_k): Remove and change callers to _gcry_dsa_gen_k. * cipher/dsa.c: Include pubkey-internal. * cipher/Makefile.am (libcipher_la_SOURCES): Add dsa-common.c -- The ECDSA code used the simple $k = k \bmod p$ method which introduces a small bias. We now use the bias free method we have always used with DSA. Signed-off-by: Werner Koch diff --git a/cipher/Makefile.am b/cipher/Makefile.am index 1e2696f..687c599 100644 --- a/cipher/Makefile.am +++ b/cipher/Makefile.am @@ -49,6 +49,7 @@ bithelp.h \ bufhelp.h \ primegen.c \ hash-common.c hash-common.h \ +dsa-common.c \ rmd.h EXTRA_libcipher_la_SOURCES = \ diff --git a/cipher/dsa-common.c b/cipher/dsa-common.c new file mode 100644 index 0000000..a5854ce --- /dev/null +++ b/cipher/dsa-common.c @@ -0,0 +1,101 @@ +/* dsa-common.c - Common code for DSA + * Copyright (C) 1998, 1999 Free Software Foundation, Inc. + * Copyright (C) 2013 g10 Code GmbH + * + * This file is part of Libgcrypt. + * + * Libgcrypt is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * Libgcrypt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#include +#include +#include +#include + +#include "g10lib.h" +#include "mpi.h" +#include "cipher.h" +#include "pubkey-internal.h" + + +/* + * Generate a random secret exponent K less than Q. + * Note that ECDSA uses this code also to generate D. + */ +gcry_mpi_t +_gcry_dsa_gen_k (gcry_mpi_t q, int security_level) +{ + gcry_mpi_t k = mpi_alloc_secure (mpi_get_nlimbs (q)); + unsigned int nbits = mpi_get_nbits (q); + unsigned int nbytes = (nbits+7)/8; + char *rndbuf = NULL; + + /* To learn why we don't use mpi_mod to get the requested bit size, + read the paper: "The Insecurity of the Digital Signature + Algorithm with Partially Known Nonces" by Nguyen and Shparlinski. + Journal of Cryptology, New York. Vol 15, nr 3 (2003) */ + + if (DBG_CIPHER) + log_debug ("choosing a random k of %u bits at seclevel %d\n", + nbits, security_level); + for (;;) + { + if ( !rndbuf || nbits < 32 ) + { + gcry_free (rndbuf); + rndbuf = gcry_random_bytes_secure (nbytes, security_level); + } + else + { /* Change only some of the higher bits. We could improve + this by directly requesting more memory at the first call + to get_random_bytes() and use these extra bytes here. + However the required management code is more complex and + thus we better use this simple method. */ + char *pp = gcry_random_bytes_secure (4, security_level); + memcpy (rndbuf, pp, 4); + gcry_free (pp); + } + _gcry_mpi_set_buffer (k, rndbuf, nbytes, 0); + + /* Make sure we have the requested number of bits. This code + looks a bit funny but it is easy to understand if you + consider that mpi_set_highbit clears all higher bits. We + don't have a clear_highbit, thus we first set the high bit + and then clear it again. */ + if (mpi_test_bit (k, nbits-1)) + mpi_set_highbit (k, nbits-1); + else + { + mpi_set_highbit (k, nbits-1); + mpi_clear_bit (k, nbits-1); + } + + if (!(mpi_cmp (k, q) < 0)) /* check: k < q */ + { + if (DBG_CIPHER) + log_debug ("\tk too large - again"); + continue; /* no */ + } + if (!(mpi_cmp_ui (k, 0) > 0)) /* check: k > 0 */ + { + if (DBG_CIPHER) + log_debug ("\tk is zero - again"); + continue; /* no */ + } + break; /* okay */ + } + gcry_free (rndbuf); + + return k; +} diff --git a/cipher/dsa.c b/cipher/dsa.c index 883a815..90edeb5 100644 --- a/cipher/dsa.c +++ b/cipher/dsa.c @@ -26,6 +26,8 @@ #include "g10lib.h" #include "mpi.h" #include "cipher.h" +#include "pubkey-internal.h" + typedef struct { @@ -94,7 +96,6 @@ static const char sample_public_key[] = -static gcry_mpi_t gen_k (gcry_mpi_t q); static int test_keys (DSA_secret_key *sk, unsigned int qbits); static int check_secret_key (DSA_secret_key *sk); static gpg_err_code_t generate (DSA_secret_key *sk, @@ -130,81 +131,6 @@ progress (int c) } -/* - * Generate a random secret exponent k less than q. - */ -static gcry_mpi_t -gen_k( gcry_mpi_t q ) -{ - gcry_mpi_t k = mpi_alloc_secure( mpi_get_nlimbs(q) ); - unsigned int nbits = mpi_get_nbits(q); - unsigned int nbytes = (nbits+7)/8; - char *rndbuf = NULL; - - /* To learn why we don't use mpi_mod to get the requested bit size, - read the paper: "The Insecurity of the Digital Signature - Algorithm with Partially Known Nonces" by Nguyen and Shparlinski. - Journal of Cryptology, New York. Vol 15, nr 3 (2003) */ - - if ( DBG_CIPHER ) - log_debug("choosing a random k "); - for (;;) - { - if( DBG_CIPHER ) - progress('.'); - - if ( !rndbuf || nbits < 32 ) - { - gcry_free(rndbuf); - rndbuf = gcry_random_bytes_secure( (nbits+7)/8, GCRY_STRONG_RANDOM ); - } - else - { /* Change only some of the higher bits. We could improve - this by directly requesting more memory at the first call - to get_random_bytes() and use these extra bytes here. - However the required management code is more complex and - thus we better use this simple method. */ - char *pp = gcry_random_bytes_secure( 4, GCRY_STRONG_RANDOM ); - memcpy( rndbuf,pp, 4 ); - gcry_free(pp); - } - _gcry_mpi_set_buffer( k, rndbuf, nbytes, 0 ); - - /* Make sure we have the requested number of bits. This code - looks a bit funny but it is easy to understand if you - consider that mpi_set_highbit clears all higher bits. We - don't have a clear_highbit, thus we first set the high bit - and then clear it again. */ - if ( mpi_test_bit( k, nbits-1 ) ) - mpi_set_highbit( k, nbits-1 ); - else - { - mpi_set_highbit( k, nbits-1 ); - mpi_clear_bit( k, nbits-1 ); - } - - if( !(mpi_cmp( k, q ) < 0) ) /* check: k < q */ - { - if( DBG_CIPHER ) - progress('+'); - continue; /* no */ - } - if( !(mpi_cmp_ui( k, 0 ) > 0) ) /* check: k > 0 */ - { - if( DBG_CIPHER ) - progress('-'); - continue; /* no */ - } - break; /* okay */ - } - gcry_free(rndbuf); - if( DBG_CIPHER ) - progress('\n'); - - return k; -} - - /* Check that a freshly generated key actually works. Returns 0 on success. */ static int test_keys (DSA_secret_key *sk, unsigned int qbits) @@ -333,6 +259,13 @@ generate (DSA_secret_key *sk, unsigned int nbits, unsigned int qbits, /* Select a random number X with the property: * 0 < x < q-1 + * + * FIXME: Why do we use the requirement x < q-1 ? It should be + * sufficient to test for x < q. FIPS-186-3 check x < q-1 but it + * does not check for 0 < x because it makes sure that Q is unsigned + * and finally adds one to the result so that 0 will never be + * returned. We should replace the code below with _gcry_dsa_gen_k. + * * This must be a very good random number because this is the secret * part. The random quality depends on the transient_key flag. */ random_level = transient_key ? GCRY_STRONG_RANDOM : GCRY_VERY_STRONG_RANDOM; @@ -613,7 +546,7 @@ sign(gcry_mpi_t r, gcry_mpi_t s, gcry_mpi_t hash, DSA_secret_key *skey ) gcry_mpi_t tmp; /* Select a random k with 0 < k < q */ - k = gen_k( skey->q ); + k = _gcry_dsa_gen_k (skey->q, GCRY_STRONG_RANDOM); /* r = (a^k mod p) mod q */ gcry_mpi_powm( r, skey->g, k, skey->p ); diff --git a/cipher/ecc.c b/cipher/ecc.c index ea1de3f..63ee2d0 100644 --- a/cipher/ecc.c +++ b/cipher/ecc.c @@ -306,7 +306,6 @@ static void *progress_cb_data; /* Local prototypes. */ -static gcry_mpi_t gen_k (gcry_mpi_t p, int security_level); static void test_keys (ECC_secret_key * sk, unsigned int nbits); static int check_secret_key (ECC_secret_key * sk); static gpg_err_code_t sign (gcry_mpi_t input, ECC_secret_key *skey, @@ -424,30 +423,6 @@ gen_y_2 (gcry_mpi_t x, elliptic_curve_t *base) } -/* Generate a random secret scalar k with an order of p - - At the beginning this was identical to the code is in elgamal.c. - Later imporved by mmr. Further simplified by wk. */ -static gcry_mpi_t -gen_k (gcry_mpi_t p, int security_level) -{ - gcry_mpi_t k; - unsigned int nbits; - - nbits = mpi_get_nbits (p); - k = mpi_snew (nbits); - if (DBG_CIPHER) - log_debug ("choosing a random k of %u bits at seclevel %d\n", - nbits, security_level); - - gcry_mpi_randomize (k, nbits, security_level); - - mpi_mod (k, k, p); /* k = k mod p */ - - return k; -} - - /* Generate the crypto system setup. This function takes the NAME of a curve or the desired number of bits and stores at R_CURVE the parameters of the named curve or those of a suitable curve. If @@ -554,7 +529,7 @@ generate_key (ECC_secret_key *sk, unsigned int nbits, const char *name, } random_level = transient_key ? GCRY_STRONG_RANDOM : GCRY_VERY_STRONG_RANDOM; - d = gen_k (E.n, random_level); + d = _gcry_dsa_gen_k (E.n, random_level); /* Compute Q. */ point_init (&Q); @@ -806,7 +781,7 @@ sign (gcry_mpi_t input, ECC_secret_key *skey, gcry_mpi_t r, gcry_mpi_t s) do_while because we want to keep the value of R even if S has to be recomputed. */ mpi_free (k); - k = gen_k (skey->E.n, GCRY_STRONG_RANDOM); + k = _gcry_dsa_gen_k (skey->E.n, GCRY_STRONG_RANDOM); _gcry_mpi_ec_mul_point (&I, k, &skey->E.G, ctx); if (_gcry_mpi_ec_get_affine (x, NULL, &I, ctx)) { diff --git a/cipher/pubkey-internal.h b/cipher/pubkey-internal.h index 0ca17a5..ae7e77b 100644 --- a/cipher/pubkey-internal.h +++ b/cipher/pubkey-internal.h @@ -20,6 +20,9 @@ #ifndef GCRY_PUBKEY_INTERNAL_H #define GCRY_PUBKEY_INTERNAL_H +/*-- dsa-common.h --*/ +gcry_mpi_t _gcry_dsa_gen_k (gcry_mpi_t q, int security_level); + /*-- ecc.c --*/ gpg_err_code_t _gcry_pk_ecc_get_sexp (gcry_sexp_t *r_sexp, int mode, ----------------------------------------------------------------------- Summary of changes: cipher/Makefile.am | 1 + cipher/dsa-common.c | 101 ++++++++++++++++++++++++++++++++++++++++++++++ cipher/dsa.c | 87 +++++----------------------------------- cipher/ecc.c | 72 ++++++++------------------------ cipher/pubkey-internal.h | 3 + 5 files changed, 133 insertions(+), 131 deletions(-) create mode 100644 cipher/dsa-common.c hooks/post-receive -- The GNU crypto library http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 28 12:37:26 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 28 May 2013 12:37:26 +0200 Subject: [git] GPGME - branch, master, updated. gpgme-1.4.1-16-g009e26a Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via 009e26a989f8a251563303f155c51fe012af52a4 (commit) via 2e8feb6016dede400053f76fc3a418e1dd567bef (commit) via d34e343487c688303a332869fdd7779e3ea7c0e8 (commit) from c29dad2315406bed75b9547103650bef642e6aa7 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 009e26a989f8a251563303f155c51fe012af52a4 Author: Werner Koch Date: Tue May 28 11:05:43 2013 +0200 Release 1.4.2. * configure.ac: Set LT version to C21/A10/R0. diff --git a/NEWS b/NEWS index 971075d..7df3cd2 100644 --- a/NEWS +++ b/NEWS @@ -1,12 +1,15 @@ -Noteworthy changes in version 1.4.2 (unreleased) +Noteworthy changes in version 1.4.2 (2013-05-28) ------------------------------------------------ * Allow symmetric encryption with gpgme_op_encrypt_sign. + * Fixed mismatching off_t definitions on Windows. + * Interface changes relative to the 1.4.1 release: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ gpgme_off_t NEW. gpgme_size_t NEW. + GPGME_PROTOCOL_OPENPGP NEW alias. Noteworthy changes in version 1.4.1 (2013-05-01) diff --git a/README b/README index 59dfdca..e886647 100644 --- a/README +++ b/README @@ -57,6 +57,10 @@ If configure can't find the `gpgsm' binary in your path, you can specify the location with the --with-gpgsm=/path/to/gpgsm argument to configure. +On some platforms GPGME based applications might hang at certain +operations when using GPGME_PROTOCOL_CMS. A workaround for this +problem is to build with the configure option --disable-fd-passing. + For building the GIT version of GPGME please see the file README.GIT for more information. diff --git a/configure.ac b/configure.ac index 015995b..30392b8 100644 --- a/configure.ac +++ b/configure.ac @@ -55,11 +55,11 @@ AC_INIT([gpgme],[mym4_full_version],[http://bugs.gnupg.org]) # (Interfaces added: AGE++) # (Interfaces removed/changed: AGE=0) # -LIBGPGME_LT_CURRENT=20 +LIBGPGME_LT_CURRENT=21 # Subtract 2 from this value if you want to make the LFS transition an # ABI break. [Note to self: Remove this comment with the next regular break.] -LIBGPGME_LT_AGE=9 -LIBGPGME_LT_REVISION=1 +LIBGPGME_LT_AGE=10 +LIBGPGME_LT_REVISION=0 # If the API is changed in an incompatible way: increment the next counter. GPGME_CONFIG_API_VERSION=1 commit 2e8feb6016dede400053f76fc3a418e1dd567bef Author: Werner Koch Date: Tue May 28 10:53:43 2013 +0200 Add convenience macro GPGME_PROTOCOL_OPENPGP. * src/gpgme.h.in (GPGME_PROTOCOL_OPENPGP): New. diff --git a/src/gpgme.h.in b/src/gpgme.h.in index 4186a99..11780d1 100644 --- a/src/gpgme.h.in +++ b/src/gpgme.h.in @@ -342,6 +342,8 @@ typedef enum GPGME_PROTOCOL_UNKNOWN = 255 } gpgme_protocol_t; +/* Convenience macro for the surprisingly mixed spelling. */ +#define GPGME_PROTOCOL_OPENPGP GPGME_PROTOCOL_OpenPGP /* The available keylist mode flags. */ commit d34e343487c688303a332869fdd7779e3ea7c0e8 Author: Hans-Christoph Steiner Date: Fri May 24 11:51:16 2013 -0400 doc: rename gpgme_sub_key_t to gpgme_subkey_t to match gpgme.h -- diff --git a/NEWS b/NEWS index 3a583d3..971075d 100644 --- a/NEWS +++ b/NEWS @@ -1026,7 +1026,7 @@ gpgme_trust_item_release DEPRECATED: Use gpgme_trust_item_unref. gpgme_trust_item_get_string_attr DEPRECATED gpgme_trust_item_get_ulong_attr DEPRECATED gpgme_get_key CHANGED: Removed force_update argument. -gpgme_sub_key_t NEW +gpgme_subkey_t NEW gpgme_key_sig_t NEW gpgme_user_id_t NEW gpgme_key_t CHANGED: Now has user accessible data members. diff --git a/doc/gpgme.texi b/doc/gpgme.texi index 589747d..217dc13 100644 --- a/doc/gpgme.texi +++ b/doc/gpgme.texi @@ -2545,8 +2545,8 @@ signers are specified. This is always done by specifying the respective keys that should be used for the operation. The following section describes how such keys can be selected and manipulated. - at deftp {Data type} gpgme_sub_key_t -The @code{gpgme_sub_key_t} type is a pointer to a subkey structure. + at deftp {Data type} gpgme_subkey_t +The @code{gpgme_subkey_t} type is a pointer to a subkey structure. Sub keys are one component of a @code{gpgme_key_t} object. In fact, subkeys are those parts that contains the real information about the individual cryptographic keys that belong to the same key object. One @@ -2556,7 +2556,7 @@ the linked list is also called the primary key. The subkey structure has the following members: @table @code - at item gpgme_sub_key_t next + at item gpgme_subkey_t next This is a pointer to the next subkey structure in the linked list, or @code{NULL} if this is the last element. @@ -2795,7 +2795,7 @@ chain ID, which can be used to built the certificate chain. If @code{protocol} is @code{GPGME_PROTOCOL_OpenPGP}, then this is the owner trust. - at item gpgme_sub_key_t subkeys + at item gpgme_subkey_t subkeys This is a linked list with the subkeys of the key. The first subkey in the list is the primary key and usually available. ----------------------------------------------------------------------- Summary of changes: NEWS | 7 +++++-- README | 4 ++++ configure.ac | 6 +++--- doc/gpgme.texi | 8 ++++---- src/gpgme.h.in | 2 ++ 5 files changed, 18 insertions(+), 9 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Tue May 28 12:40:17 2013 From: cvs at cvs.gnupg.org (by Werner Koch) Date: Tue, 28 May 2013 12:40:17 +0200 Subject: [git] GPGME - branch, master, updated. gpgme-1.4.1-17-g5df596d Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "GnuPG Made Easy". The branch, master has been updated via 5df596d6ec62c304db9b988b17fcbbed126855b4 (commit) from 009e26a989f8a251563303f155c51fe012af52a4 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 5df596d6ec62c304db9b988b17fcbbed126855b4 Author: Werner Koch Date: Tue May 28 12:05:43 2013 +0200 Post release version bump. -- diff --git a/NEWS b/NEWS index 7df3cd2..3b8fea3 100644 --- a/NEWS +++ b/NEWS @@ -1,3 +1,7 @@ +Noteworthy changes in version 1.4.3 (unreleased) +------------------------------------------------ + + Noteworthy changes in version 1.4.2 (2013-05-28) ------------------------------------------------ diff --git a/configure.ac b/configure.ac index 30392b8..2d26dbb 100644 --- a/configure.ac +++ b/configure.ac @@ -29,7 +29,7 @@ min_automake_version="1.11" # for the LT versions. m4_define(mym4_version_major, [1]) m4_define(mym4_version_minor, [4]) -m4_define(mym4_version_micro, [2]) +m4_define(mym4_version_micro, [3]) # Below is m4 magic to extract and compute the revision number, the # decimalized short revision number, a beta version string, and a flag ----------------------------------------------------------------------- Summary of changes: NEWS | 4 ++++ configure.ac | 2 +- 2 files changed, 5 insertions(+), 1 deletions(-) hooks/post-receive -- GnuPG Made Easy http://git.gnupg.org From cvs at cvs.gnupg.org Wed May 29 20:02:03 2013 From: cvs at cvs.gnupg.org (by Andre Heinecke) Date: Wed, 29 May 2013 20:02:03 +0200 Subject: [git] Pinentry - branch, master, updated. pinentry-0.8.3-3-g0b3a856 Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The standard pinentry collection". The branch, master has been updated via 0b3a8568e14b994a8d1f4c1cb42aed4959dfc811 (commit) via fb38be960e837bb5854aa65bf8cbf9cbf535631e (commit) from cf1404d4e24d85c809434df9330c9e1817e7d4a6 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- commit 0b3a8568e14b994a8d1f4c1cb42aed4959dfc811 Author: Andre Heinecke Date: Wed May 29 17:38:18 2013 +0000 Add pinentry-qt4-clipboard option Enabling this option will make it possible to paste a passphrase into pinentry-qt4. This defeats the secmem mechanism but drastically increases usability for some users. * configure.ac: New option pinentry-qt4-clipboard. * qt4/qsecurelineedit.cpp, qt4/qsecurelineedit.h: Activate clipboard and context menu if PINENTRY_QT4_CLIPBOARD is defined. diff --git a/configure.ac b/configure.ac index 0eb5e74..b4133b0 100644 --- a/configure.ac +++ b/configure.ac @@ -447,6 +447,18 @@ if test "$pinentry_qt4" = "yes"; then AC_DEFINE(PINENTRY_QT4, 1, [The Qt4 version of Pinentry is to be build]) fi +dnl +dnl Option to add insecure clipboard support to pinentry-qt4 +dnl +AC_ARG_ENABLE(pinentry-qt4-clipboard, + AC_HELP_STRING([--enable-pinentry-qt4-clipboard], [Enable clipboard support in + pinentry-qt4]), pinentry_qt4_clipboard=$enableval) + +if test "$pinentry_qt4_clipboard" = "yes" -a "$pinentry_qt4" = "yes"; then + AC_DEFINE(PINENTRY_QT4_CLIPBOARD, 1, [Pinentry-qt4 should have clipboard support]) + pinentry_qt4_clip_msg="(with clipboard support)" +fi + dnl if test "$pinentry_qt4" = "yes"; then dnl Additional checks for Qt4 pinentry. dnl End of additional checks for Qt4 pinentry. @@ -521,7 +533,7 @@ AC_MSG_NOTICE([ GTK+ Pinentry ....: $pinentry_gtk GTK+-2 Pinentry ..: $pinentry_gtk_2 Qt Pinentry ......: $pinentry_qt - Qt4 Pinentry .....: $pinentry_qt4 + Qt4 Pinentry .....: $pinentry_qt4 $pinentry_qt4_clip_msg W32 Pinentry .....: $pinentry_w32 Fallback to Curses: $fallback_curses diff --git a/qt4/qsecurelineedit.cpp b/qt4/qsecurelineedit.cpp index da6bf0c..4384574 100644 --- a/qt4/qsecurelineedit.cpp +++ b/qt4/qsecurelineedit.cpp @@ -1325,6 +1325,16 @@ void QSecureLineEdit::deselect() d->finishChange(); } +#ifndef QT_NO_CLIPBOARD +/* Should only be used if pasting the passphrase is explicitly + * wanted. Defeats the purpose of the secmem implmentation */ +void QSecureLineEdit::insert(const QString &newText) +{ + if (!newText.isEmpty() && newText.at(0).isPrint()) { + insert( secqstring( newText.begin(), newText.end() ) ); + } +} +#endif /*! Deletes any selected text, inserts \a newText, and validates the @@ -1466,6 +1476,7 @@ void QSecureLineEdit::copy() const void QSecureLineEdit::paste() { + Q_D(QSecureLineEdit); if(echoMode() == PasswordEchoOnEdit) { Q_D(QSecureLineEdit); @@ -1479,12 +1490,14 @@ void QSecureLineEdit::paste() void QSecureLineEditPrivate::copy(bool clipboard) const { Q_Q(const QSecureLineEdit); - QString t = q->selectedText(); - if (!t.isEmpty() && echoMode == QSecureLineEdit::Normal) { - q->disconnect(QApplication::clipboard(), SIGNAL(selectionChanged()), q, 0); - QApplication::clipboard()->setText(t, clipboard ? QClipboard::Clipboard : QClipboard::Selection); - q->connect(QApplication::clipboard(), SIGNAL(selectionChanged()), - q, SLOT(_q_clipboardChanged())); + if (echoMode == QSecureLineEdit::Normal) { + QString t = QString(q->selectedText().c_str()); + if (!t.isEmpty()) { + q->disconnect(QApplication::clipboard(), SIGNAL(selectionChanged()), q, 0); + QApplication::clipboard()->setText(t, clipboard ? QClipboard::Clipboard : QClipboard::Selection); + q->connect(QApplication::clipboard(), SIGNAL(selectionChanged()), + q, SLOT(_q_clipboardChanged())); + } } } @@ -2603,16 +2616,17 @@ QMenu *QSecureLineEdit::createStandardContextMenu() d->actions[QSecureLineEditPrivate::UndoAct]->setEnabled(d->isUndoAvailable()); d->actions[QSecureLineEditPrivate::RedoAct]->setEnabled(d->isRedoAvailable()); #ifndef QT_NO_CLIPBOARD - d->actions[QSecureLineEditPrivate::CutAct]->setEnabled(!d->readOnly && d->hasSelectedText()); - d->actions[QSecureLineEditPrivate::CopyAct]->setEnabled(d->hasSelectedText()); + d->actions[QSecureLineEditPrivate::CutAct]->setEnabled(!d->readOnly && d->hasSelectedText() + && d->echoMode == QSecureLineEdit::Normal); + d->actions[QSecureLineEditPrivate::CopyAct]->setEnabled(d->hasSelectedText() && d->echoMode == QSecureLineEdit::Normal); d->actions[QSecureLineEditPrivate::PasteAct]->setEnabled(!d->readOnly && !QApplication::clipboard()->text().isEmpty()); #else d->actions[QSecureLineEditPrivate::CutAct]->setEnabled(false); d->actions[QSecureLineEditPrivate::CopyAct]->setEnabled(false); d->actions[QSecureLineEditPrivate::PasteAct]->setEnabled(false); #endif - d->actions[QSecureLineEditPrivate::ClearAct]->setEnabled(!d->readOnly && !d->text.isEmpty() && d->hasSelectedText()); - d->actions[QSecureLineEditPrivate::SelectAllAct]->setEnabled(!d->text.isEmpty() && !d->allSelected()); + d->actions[QSecureLineEditPrivate::ClearAct]->setEnabled(!d->readOnly && !d->text.empty() && d->hasSelectedText()); + d->actions[QSecureLineEditPrivate::SelectAllAct]->setEnabled(!d->text.empty() && !d->allSelected()); QMenu *popup = new QMenu(this); popup->setObjectName(QLatin1String("qt_edit_menu")); @@ -2640,8 +2654,8 @@ QMenu *QSecureLineEdit::createStandardContextMenu() if (!d->readOnly) { #endif popup->addSeparator(); - QUnicodeControlCharacterMenu *ctrlCharacterMenu = new QUnicodeControlCharacterMenu(this, popup); - popup->addMenu(ctrlCharacterMenu); + //QUnicodeControlCharacterMenu *ctrlCharacterMenu = new QUnicodeControlCharacterMenu(this, popup); + //popup->addMenu(ctrlCharacterMenu); } return popup; } diff --git a/qt4/qsecurelineedit.h b/qt4/qsecurelineedit.h index 963ccc3..4afdbb2 100644 --- a/qt4/qsecurelineedit.h +++ b/qt4/qsecurelineedit.h @@ -50,8 +50,20 @@ #include #include +#include + #include "secstring.h" +#ifndef PINENTRY_QT4_CLIPBOARD +// Sacrifice security for usability by allowing clipboard actions +# ifndef QT_NO_CLIPBOARD +# define QT_NO_CLIPBOARD +# endif +# ifndef QT_NO_CONTEXTMENU +# define QT_NO_CONTEXTMENU +# endif +#endif + // for moc, since qt4_automoc doesn't appear to hand over defines when // running moc. They should't be visible when #including other Qt // headers, since they #ifdef out virtual functions (->BIC). @@ -61,12 +73,6 @@ #ifndef QT_NO_COMPLETER # define QT_NO_COMPLETER #endif -#ifndef QT_NO_CLIPBOARD -# define QT_NO_CLIPBOARD -#endif -#ifndef QT_NO_CONTEXTMENU -# define QT_NO_CONTEXTMENU -#endif #ifndef QT_NO_DRAGANDDROP # define QT_NO_DRAGANDDROP #endif @@ -203,6 +209,9 @@ public Q_SLOTS: public: void deselect(); void insert(const secqstring &); +#ifndef QT_NO_CLIPBOARD + void insert(const QString &); +#endif #ifndef QT_NO_CONTEXTMENU QMenu *createStandardContextMenu(); #endif commit fb38be960e837bb5854aa65bf8cbf9cbf535631e Author: Andre Heinecke Date: Wed May 29 17:32:31 2013 +0000 Remove qt4 moc files and add moc to buildsystem This is neccessary to conditionally enable signals/slots at build time. * qt4/Makefile.am: Moc files automatically. * qt4/pinentryconfirm.moc, qt4/pinentrydialog.moc, qsecurelineedit.moc: Removed. -- While this removes the hard version requirement to Qt 4.8.2 caused by the old generated files it breaks the possibillity to compile pinentry-qt and pinentry-qt4 in one go as the MOC variable is only set once either the qt4 variant or the qt3 variant will be broken. At least there is a decent error message in that case. diff --git a/qt4/Makefile.am b/qt4/Makefile.am index 054427a..6606d71 100644 --- a/qt4/Makefile.am +++ b/qt4/Makefile.am @@ -41,9 +41,17 @@ pinentry_qt4_LDADD = $(QT4_CORE_LIBS) $(QT4_GUI_LIBS) $(libcurses) \ ../pinentry/libpinentry.a $(top_builddir)/assuan/libassuan.a \ $(top_builddir)/secmem/libsecmem.a $(LIBCAP) +$(pinentry_qt4_OBJECTS) : pinentryconfirm.moc qsecurelineedit.moc pinentrydialog.moc + pinentry_qt4_SOURCES = pinentrydialog.h pinentrydialog.cpp \ main.cpp secstring.h secstring.cpp qsecurelineedit.h \ - qsecurelineedit.cpp pinentrydialog.moc qsecurelineedit.moc \ - qrc_pinentry.cpp \ - qsecurelineedit_p.h \ - pinentryconfirm.cpp pinentryconfirm.h pinentryconfirm.moc + qsecurelineedit.cpp qrc_pinentry.cpp \ + qsecurelineedit_p.h pinentryconfirm.cpp pinentryconfirm.h + +clean-moc-extra: + rm -vf *.moc + +clean-am: clean-moc-extra + +%.moc: %.h + $(MOC) $< -o $@ diff --git a/qt4/pinentryconfirm.moc b/qt4/pinentryconfirm.moc deleted file mode 100644 index ae5841e..0000000 --- a/qt4/pinentryconfirm.moc +++ /dev/null @@ -1,94 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'pinentryconfirm.h' -** -** Created: Wed Aug 8 16:09:45 2012 -** by: The Qt Meta Object Compiler version 63 (Qt 4.8.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "pinentryconfirm.h" -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'pinentryconfirm.h' doesn't include ." -#elif Q_MOC_OUTPUT_REVISION != 63 -#error "This file was generated using the moc from 4.8.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -static const uint qt_meta_data_PinentryConfirm[] = { - - // content: - 6, // revision - 0, // classname - 0, 0, // classinfo - 1, 14, // methods - 0, 0, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 0, // signalCount - - // slots: signature, parameters, type, tag, flags - 17, 16, 16, 16, 0x08, - - 0 // eod -}; - -static const char qt_meta_stringdata_PinentryConfirm[] = { - "PinentryConfirm\0\0slotTimeout()\0" -}; - -void PinentryConfirm::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - Q_ASSERT(staticMetaObject.cast(_o)); - PinentryConfirm *_t = static_cast(_o); - switch (_id) { - case 0: _t->slotTimeout(); break; - default: ; - } - } - Q_UNUSED(_a); -} - -const QMetaObjectExtraData PinentryConfirm::staticMetaObjectExtraData = { - 0, qt_static_metacall -}; - -const QMetaObject PinentryConfirm::staticMetaObject = { - { &QMessageBox::staticMetaObject, qt_meta_stringdata_PinentryConfirm, - qt_meta_data_PinentryConfirm, &staticMetaObjectExtraData } -}; - -#ifdef Q_NO_DATA_RELOCATION -const QMetaObject &PinentryConfirm::getStaticMetaObject() { return staticMetaObject; } -#endif //Q_NO_DATA_RELOCATION - -const QMetaObject *PinentryConfirm::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject; -} - -void *PinentryConfirm::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_PinentryConfirm)) - return static_cast(const_cast< PinentryConfirm*>(this)); - return QMessageBox::qt_metacast(_clname); -} - -int PinentryConfirm::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QMessageBox::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 1) - qt_static_metacall(this, _c, _id, _a); - _id -= 1; - } - return _id; -} -QT_END_MOC_NAMESPACE diff --git a/qt4/pinentrydialog.moc b/qt4/pinentrydialog.moc deleted file mode 100644 index 07f39fb..0000000 --- a/qt4/pinentrydialog.moc +++ /dev/null @@ -1,136 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'pinentrydialog.h' -** -** Created: Wed Aug 8 16:09:23 2012 -** by: The Qt Meta Object Compiler version 63 (Qt 4.8.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "pinentrydialog.h" -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'pinentrydialog.h' doesn't include ." -#elif Q_MOC_OUTPUT_REVISION != 63 -#error "This file was generated using the moc from 4.8.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -static const uint qt_meta_data_PinEntryDialog[] = { - - // content: - 6, // revision - 0, // classname - 0, 0, // classinfo - 2, 14, // methods - 4, 24, // properties - 0, 0, // enums/sets - 0, 0, // constructors - 0, // flags - 0, // signalCount - - // slots: signature, parameters, type, tag, flags - 16, 15, 15, 15, 0x0a, - 42, 15, 15, 15, 0x0a, - - // properties: name, type, flags - 64, 56, 0x0a095103, - 76, 56, 0x0a095103, - 93, 82, 0x0009510b, - 97, 56, 0x0a095103, - - 0 // eod -}; - -static const char qt_meta_stringdata_PinEntryDialog[] = { - "PinEntryDialog\0\0updateQuality(secqstring)\0" - "slotTimeout()\0QString\0description\0" - "error\0secqstring\0pin\0prompt\0" -}; - -void PinEntryDialog::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - Q_ASSERT(staticMetaObject.cast(_o)); - PinEntryDialog *_t = static_cast(_o); - switch (_id) { - case 0: _t->updateQuality((*reinterpret_cast< const secqstring(*)>(_a[1]))); break; - case 1: _t->slotTimeout(); break; - default: ; - } - } -} - -const QMetaObjectExtraData PinEntryDialog::staticMetaObjectExtraData = { - 0, qt_static_metacall -}; - -const QMetaObject PinEntryDialog::staticMetaObject = { - { &QDialog::staticMetaObject, qt_meta_stringdata_PinEntryDialog, - qt_meta_data_PinEntryDialog, &staticMetaObjectExtraData } -}; - -#ifdef Q_NO_DATA_RELOCATION -const QMetaObject &PinEntryDialog::getStaticMetaObject() { return staticMetaObject; } -#endif //Q_NO_DATA_RELOCATION - -const QMetaObject *PinEntryDialog::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject; -} - -void *PinEntryDialog::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_PinEntryDialog)) - return static_cast(const_cast< PinEntryDialog*>(this)); - return QDialog::qt_metacast(_clname); -} - -int PinEntryDialog::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QDialog::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 2) - qt_static_metacall(this, _c, _id, _a); - _id -= 2; - } -#ifndef QT_NO_PROPERTIES - else if (_c == QMetaObject::ReadProperty) { - void *_v = _a[0]; - switch (_id) { - case 0: *reinterpret_cast< QString*>(_v) = description(); break; - case 1: *reinterpret_cast< QString*>(_v) = error(); break; - case 2: *reinterpret_cast< secqstring*>(_v) = pin(); break; - case 3: *reinterpret_cast< QString*>(_v) = prompt(); break; - } - _id -= 4; - } else if (_c == QMetaObject::WriteProperty) { - void *_v = _a[0]; - switch (_id) { - case 0: setDescription(*reinterpret_cast< QString*>(_v)); break; - case 1: setError(*reinterpret_cast< QString*>(_v)); break; - case 2: setPin(*reinterpret_cast< secqstring*>(_v)); break; - case 3: setPrompt(*reinterpret_cast< QString*>(_v)); break; - } - _id -= 4; - } else if (_c == QMetaObject::ResetProperty) { - _id -= 4; - } else if (_c == QMetaObject::QueryPropertyDesignable) { - _id -= 4; - } else if (_c == QMetaObject::QueryPropertyScriptable) { - _id -= 4; - } else if (_c == QMetaObject::QueryPropertyStored) { - _id -= 4; - } else if (_c == QMetaObject::QueryPropertyEditable) { - _id -= 4; - } else if (_c == QMetaObject::QueryPropertyUser) { - _id -= 4; - } -#endif // QT_NO_PROPERTIES - return _id; -} -QT_END_MOC_NAMESPACE diff --git a/qt4/qsecurelineedit.moc b/qt4/qsecurelineedit.moc deleted file mode 100644 index cb3eb47..0000000 --- a/qt4/qsecurelineedit.moc +++ /dev/null @@ -1,269 +0,0 @@ -/**************************************************************************** -** Meta object code from reading C++ file 'qsecurelineedit.h' -** -** Created: Wed Aug 8 16:09:59 2012 -** by: The Qt Meta Object Compiler version 63 (Qt 4.8.2) -** -** WARNING! All changes made in this file will be lost! -*****************************************************************************/ - -#include "qsecurelineedit.h" -#if !defined(Q_MOC_OUTPUT_REVISION) -#error "The header file 'qsecurelineedit.h' doesn't include ." -#elif Q_MOC_OUTPUT_REVISION != 63 -#error "This file was generated using the moc from 4.8.2. It" -#error "cannot be used with the include files from this version of Qt." -#error "(The moc has changed too much.)" -#endif - -QT_BEGIN_MOC_NAMESPACE -static const uint qt_meta_data_QSecureLineEdit[] = { - - // content: - 6, // revision - 0, // classname - 0, 0, // classinfo - 14, 14, // methods - 16, 84, // properties - 1, 148, // enums/sets - 0, 0, // constructors - 0, // flags - 6, // signalCount - - // signals: signature, parameters, type, tag, flags - 17, 16, 16, 16, 0x05, - 41, 16, 16, 16, 0x05, - 66, 64, 16, 16, 0x05, - 97, 16, 16, 16, 0x05, - 113, 16, 16, 16, 0x05, - 131, 16, 16, 16, 0x05, - - // slots: signature, parameters, type, tag, flags - 150, 16, 16, 16, 0x0a, - 170, 16, 16, 16, 0x0a, - 178, 16, 16, 16, 0x0a, - 190, 16, 16, 16, 0x0a, - 197, 16, 16, 16, 0x0a, - 204, 16, 16, 16, 0x08, - 226, 16, 16, 16, 0x08, - 252, 16, 16, 16, 0x08, - - // properties: name, type, flags - 280, 272, 0x0a095103, - 301, 290, 0x0059510b, - 310, 306, 0x02095103, - 325, 320, 0x01095103, - 340, 331, 0x00095009, - 349, 290, 0x00095009, - 361, 306, 0x02095103, - 390, 376, 0x0009510b, - 400, 320, 0x01094103, - 409, 320, 0x01095001, - 425, 290, 0x00095009, - 438, 320, 0x01095103, - 450, 320, 0x01095103, - 459, 320, 0x01095001, - 473, 320, 0x01095001, - 487, 320, 0x01095001, - - // properties: notify_signal_id - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - - // enums: name, flags, count, data - 331, 0x0, 4, 152, - - // enum data: key, value - 503, uint(QSecureLineEdit::Normal), - 510, uint(QSecureLineEdit::NoEcho), - 517, uint(QSecureLineEdit::Password), - 526, uint(QSecureLineEdit::PasswordEchoOnEdit), - - 0 // eod -}; - -static const char qt_meta_stringdata_QSecureLineEdit[] = { - "QSecureLineEdit\0\0textChanged(secqstring)\0" - "textEdited(secqstring)\0,\0" - "cursorPositionChanged(int,int)\0" - "returnPressed()\0editingFinished()\0" - "selectionChanged()\0setText(secqstring)\0" - "clear()\0selectAll()\0undo()\0redo()\0" - "_q_clipboardChanged()\0_q_handleWindowActivate()\0" - "_q_deleteSelected()\0QString\0inputMask\0" - "secqstring\0text\0int\0maxLength\0bool\0" - "frame\0EchoMode\0echoMode\0displayText\0" - "cursorPosition\0Qt::Alignment\0alignment\0" - "modified\0hasSelectedText\0selectedText\0" - "dragEnabled\0readOnly\0undoAvailable\0" - "redoAvailable\0acceptableInput\0Normal\0" - "NoEcho\0Password\0PasswordEchoOnEdit\0" -}; - -void QSecureLineEdit::qt_static_metacall(QObject *_o, QMetaObject::Call _c, int _id, void **_a) -{ - if (_c == QMetaObject::InvokeMetaMethod) { - Q_ASSERT(staticMetaObject.cast(_o)); - QSecureLineEdit *_t = static_cast(_o); - switch (_id) { - case 0: _t->textChanged((*reinterpret_cast< const secqstring(*)>(_a[1]))); break; - case 1: _t->textEdited((*reinterpret_cast< const secqstring(*)>(_a[1]))); break; - case 2: _t->cursorPositionChanged((*reinterpret_cast< int(*)>(_a[1])),(*reinterpret_cast< int(*)>(_a[2]))); break; - case 3: _t->returnPressed(); break; - case 4: _t->editingFinished(); break; - case 5: _t->selectionChanged(); break; - case 6: _t->setText((*reinterpret_cast< const secqstring(*)>(_a[1]))); break; - case 7: _t->clear(); break; - case 8: _t->selectAll(); break; - case 9: _t->undo(); break; - case 10: _t->redo(); break; - case 11: _t->d_func()->_q_clipboardChanged(); break; - case 12: _t->d_func()->_q_handleWindowActivate(); break; - case 13: _t->d_func()->_q_deleteSelected(); break; - default: ; - } - } -} - -const QMetaObjectExtraData QSecureLineEdit::staticMetaObjectExtraData = { - 0, qt_static_metacall -}; - -const QMetaObject QSecureLineEdit::staticMetaObject = { - { &QWidget::staticMetaObject, qt_meta_stringdata_QSecureLineEdit, - qt_meta_data_QSecureLineEdit, &staticMetaObjectExtraData } -}; - -#ifdef Q_NO_DATA_RELOCATION -const QMetaObject &QSecureLineEdit::getStaticMetaObject() { return staticMetaObject; } -#endif //Q_NO_DATA_RELOCATION - -const QMetaObject *QSecureLineEdit::metaObject() const -{ - return QObject::d_ptr->metaObject ? QObject::d_ptr->metaObject : &staticMetaObject; -} - -void *QSecureLineEdit::qt_metacast(const char *_clname) -{ - if (!_clname) return 0; - if (!strcmp(_clname, qt_meta_stringdata_QSecureLineEdit)) - return static_cast(const_cast< QSecureLineEdit*>(this)); - return QWidget::qt_metacast(_clname); -} - -int QSecureLineEdit::qt_metacall(QMetaObject::Call _c, int _id, void **_a) -{ - _id = QWidget::qt_metacall(_c, _id, _a); - if (_id < 0) - return _id; - if (_c == QMetaObject::InvokeMetaMethod) { - if (_id < 14) - qt_static_metacall(this, _c, _id, _a); - _id -= 14; - } -#ifndef QT_NO_PROPERTIES - else if (_c == QMetaObject::ReadProperty) { - void *_v = _a[0]; - switch (_id) { - case 0: *reinterpret_cast< QString*>(_v) = inputMask(); break; - case 1: *reinterpret_cast< secqstring*>(_v) = text(); break; - case 2: *reinterpret_cast< int*>(_v) = maxLength(); break; - case 3: *reinterpret_cast< bool*>(_v) = hasFrame(); break; - case 4: *reinterpret_cast< EchoMode*>(_v) = echoMode(); break; - case 5: *reinterpret_cast< secqstring*>(_v) = displayText(); break; - case 6: *reinterpret_cast< int*>(_v) = cursorPosition(); break; - case 7: *reinterpret_cast< Qt::Alignment*>(_v) = alignment(); break; - case 8: *reinterpret_cast< bool*>(_v) = isModified(); break; - case 9: *reinterpret_cast< bool*>(_v) = hasSelectedText(); break; - case 10: *reinterpret_cast< secqstring*>(_v) = selectedText(); break; - case 11: *reinterpret_cast< bool*>(_v) = dragEnabled(); break; - case 12: *reinterpret_cast< bool*>(_v) = isReadOnly(); break; - case 13: *reinterpret_cast< bool*>(_v) = isUndoAvailable(); break; - case 14: *reinterpret_cast< bool*>(_v) = isRedoAvailable(); break; - case 15: *reinterpret_cast< bool*>(_v) = hasAcceptableInput(); break; - } - _id -= 16; - } else if (_c == QMetaObject::WriteProperty) { - void *_v = _a[0]; - switch (_id) { - case 0: setInputMask(*reinterpret_cast< QString*>(_v)); break; - case 1: setText(*reinterpret_cast< secqstring*>(_v)); break; - case 2: setMaxLength(*reinterpret_cast< int*>(_v)); break; - case 3: setFrame(*reinterpret_cast< bool*>(_v)); break; - case 6: setCursorPosition(*reinterpret_cast< int*>(_v)); break; - case 7: setAlignment(*reinterpret_cast< Qt::Alignment*>(_v)); break; - case 8: setModified(*reinterpret_cast< bool*>(_v)); break; - case 11: setDragEnabled(*reinterpret_cast< bool*>(_v)); break; - case 12: setReadOnly(*reinterpret_cast< bool*>(_v)); break; - } - _id -= 16; - } else if (_c == QMetaObject::ResetProperty) { - _id -= 16; - } else if (_c == QMetaObject::QueryPropertyDesignable) { - _id -= 16; - } else if (_c == QMetaObject::QueryPropertyScriptable) { - _id -= 16; - } else if (_c == QMetaObject::QueryPropertyStored) { - _id -= 16; - } else if (_c == QMetaObject::QueryPropertyEditable) { - _id -= 16; - } else if (_c == QMetaObject::QueryPropertyUser) { - _id -= 16; - } -#endif // QT_NO_PROPERTIES - return _id; -} - -// SIGNAL 0 -void QSecureLineEdit::textChanged(const secqstring & _t1) -{ - void *_a[] = { 0, const_cast(reinterpret_cast(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 0, _a); -} - -// SIGNAL 1 -void QSecureLineEdit::textEdited(const secqstring & _t1) -{ - void *_a[] = { 0, const_cast(reinterpret_cast(&_t1)) }; - QMetaObject::activate(this, &staticMetaObject, 1, _a); -} - -// SIGNAL 2 -void QSecureLineEdit::cursorPositionChanged(int _t1, int _t2) -{ - void *_a[] = { 0, const_cast(reinterpret_cast(&_t1)), const_cast(reinterpret_cast(&_t2)) }; - QMetaObject::activate(this, &staticMetaObject, 2, _a); -} - -// SIGNAL 3 -void QSecureLineEdit::returnPressed() -{ - QMetaObject::activate(this, &staticMetaObject, 3, 0); -} - -// SIGNAL 4 -void QSecureLineEdit::editingFinished() -{ - QMetaObject::activate(this, &staticMetaObject, 4, 0); -} - -// SIGNAL 5 -void QSecureLineEdit::selectionChanged() -{ - QMetaObject::activate(this, &staticMetaObject, 5, 0); -} -QT_END_MOC_NAMESPACE ----------------------------------------------------------------------- Summary of changes: configure.ac | 14 +++- qt4/Makefile.am | 16 ++- qt4/pinentryconfirm.moc | 94 ---------------- qt4/pinentrydialog.moc | 136 ------------------------ qt4/qsecurelineedit.cpp | 38 +++++-- qt4/qsecurelineedit.h | 21 +++- qt4/qsecurelineedit.moc | 269 ----------------------------------------------- 7 files changed, 66 insertions(+), 522 deletions(-) delete mode 100644 qt4/pinentryconfirm.moc delete mode 100644 qt4/pinentrydialog.moc delete mode 100644 qt4/qsecurelineedit.moc hooks/post-receive -- The standard pinentry collection http://git.gnupg.org From cvs at cvs.gnupg.org Thu May 30 09:28:41 2013 From: cvs at cvs.gnupg.org (by Jussi Kivilinna) Date: Thu, 30 May 2013 09:28:41 +0200 Subject: [git] GCRYPT - branch, cipher-amd64-optimizations, created. libgcrypt-1.5.0-147-g7317fcf Message-ID: This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project "The GNU crypto library". The branch, cipher-amd64-optimizations has been created at 7317fcfadf00789df140e51c0d16b60f6b144b59 (commit) - Log ----------------------------------------------------------------- commit 7317fcfadf00789df140e51c0d16b60f6b144b59 Author: Jussi Kivilinna Date: Wed May 29 16:40:27 2013 +0300 rinjdael: add amd64 assembly implementation * cipher/Makefile.am: Add 'rijndael-amd64.S'. * cipher/rijndael-amd64.S: New file. * cipher/rijndael.c (USE_AMD64_ASM): New macro. [USE_AMD64_ASM] (_gcry_aes_amd64_encrypt_block) (_gcry_aes_amd64_decrypt_block): New prototypes. (do_encrypt_aligned) [USE_AMD64_ASM]: Use amd64 assembly function. (do_encrypt): Disable input/output alignment when USE_AMD64_ASM is set. (do_decrypt_aligned) [USE_AMD64_ASM]: Use amd64 assembly function. (do_decrypt): Disable input/output alignment when USE_AMD64_AES is set. * configure.ac (aes) [x86-64]: Add 'rijndael-amd64.lo'. -- Add optimized amd64 assembly implementation for AES. Old vs new, on AMD Phenom II: ECB/Stream CBC CFB OFB CTR --------------- --------------- --------------- --------------- --------------- AES 1.74x 1.72x 1.81x 1.85x 1.82x 1.76x 1.67x 1.64x 1.79x 1.81x AES192 1.77x 1.77x 1.79x 1.88x 1.90x 1.80x 1.69x 1.69x 1.85x 1.81x AES256 1.79x 1.81x 1.83x 1.89x 1.88x 1.82x 1.72x 1.70x 1.87x 1.89x Old vs new, on Intel Core2: ECB/Stream CBC CFB OFB CTR --------------- --------------- --------------- --------------- --------------- AES 1.77x 1.75x 1.78x 1.76x 1.76x 1.77x 1.75x 1.76x 1.76x 1.82x AES192 1.80x 1.73x 1.81x 1.76x 1.79x 1.85x 1.77x 1.76x 1.80x 1.85x AES256 1.81x 1.77x 1.81x 1.77x 1.80x 1.79x 1.78x 1.77x 1.81x 1.85x Signed-off-by: Jussi Kivilinna diff --git a/cipher/Makefile.am b/cipher/Makefile.am index c0a7593..7439cc9 100644 --- a/cipher/Makefile.am +++ b/cipher/Makefile.am @@ -64,7 +64,7 @@ ecc.c \ idea.c \ md4.c \ md5.c \ -rijndael.c rijndael-tables.h \ +rijndael.c rijndael-tables.h rijndael-amd64.S \ rmd160.c \ rsa.c \ scrypt.c \ diff --git a/cipher/rijndael-amd64.S b/cipher/rijndael-amd64.S new file mode 100644 index 0000000..6921f31 --- /dev/null +++ b/cipher/rijndael-amd64.S @@ -0,0 +1,1416 @@ +/* rinjdael-amd64.S - AMD64 assembly implementation of AES cipher + * + * Copyright ? 2013 Jussi Kivilinna + * + * This file is part of Libgcrypt. + * + * Libgcrypt is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * Libgcrypt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifdef __x86_64 +#include +#if defined(USE_AES) + +#ifdef __PIC__ +# define RIP %rip +#else +# define RIP +#endif + +.text + +/* table macros */ +#define E0 (.LtableE0-.LtableE0) +#define E1 (.LtableE1-.LtableE0) +#define E2 (.LtableE2-.LtableE0) +#define E3 (.LtableE3-.LtableE0) +#define Es0 (.LtableEs0-.LtableE0) +#define Es1 (.LtableEs1-.LtableE0) +#define Es2 (.LtableEs2-.LtableE0) +#define Es3 (.LtableEs3-.LtableE0) +#define Esize 8 + +#define D0 (.LtableD0-.LtableD0) +#define D1 (.LtableD1-.LtableD0) +#define D2 (.LtableD2-.LtableD0) +#define D3 (.LtableD3-.LtableD0) +#define Ds0 (.LtableDs0-.LtableD0) +#define Ds1 (.LtableDs1-.LtableD0) +#define Ds2 (.LtableDs2-.LtableD0) +#define Ds3 (.LtableDs3-.LtableD0) +#define Dsize 8 + +/* register macros */ +#define CTX %rdi +#define RTAB %r12 + +#define RA %rax +#define RB %rbx +#define RC %rcx +#define RD %rdx + +#define RAd %eax +#define RBd %ebx +#define RCd %ecx +#define RDd %edx + +#define RAbl %al +#define RBbl %bl +#define RCbl %cl +#define RDbl %dl + +#define RAbh %ah +#define RBbh %bh +#define RCbh %ch +#define RDbh %dh + +#define RNA %r8 +#define RNB %r9 +#define RNC %r10 +#define RND %r11 + +#define RNAd %r8d +#define RNBd %r9d +#define RNCd %r10d +#define RNDd %r11d + +#define RT0 %rbp +#define RT1 %rsi + +#define RT0d %ebp +#define RT1d %esi + +/* helper macros */ +#define do16bit(op, source, tablemul, table1, dest1, table2, dest2, t0, t1) \ + movzbl source ## bh, t1 ## d; \ + movzbl source ## bl, t0 ## d; \ + op ## l table1(RTAB,t0,tablemul), dest1 ## d; \ + op ## l table2(RTAB,t1,tablemul), dest2 ## d; + +#define do16bit_shr(shf, op, source, tablemul, table1, dest1, table2, dest2, t0, t1) \ + movzbl source ## bl, t0 ## d; \ + movzbl source ## bh, t1 ## d; \ + shrq $(shf), source; \ + op ## l table1(RTAB,t0,tablemul), dest1 ## d; \ + op ## l table2(RTAB,t1,tablemul), dest2 ## d; + +/*********************************************************************** + * AMD64 assembly implementation of the AES cipher + ***********************************************************************/ +#define addroundkey(round, ra, rb, rc, rd) \ + xorl (((round) * 16) + 0 * 4)(CTX), ra ## d; \ + xorl (((round) * 16) + 1 * 4)(CTX), rb ## d; \ + xorl (((round) * 16) + 2 * 4)(CTX), rc ## d; \ + xorl (((round) * 16) + 3 * 4)(CTX), rd ## d; + +#define do_encround(next_r) \ + do16bit_shr(16, mov, RA, Esize, E0, RNA, E1, RND, RT0, RT1); \ + do16bit( mov, RA, Esize, E2, RNC, E3, RNB, RT0, RT1); \ + movl (((next_r) * 16) + 0 * 4)(CTX), RAd; \ + xorl RNAd, RAd; \ + \ + do16bit_shr(16, xor, RD, Esize, E0, RND, E1, RNC, RT0, RT1); \ + do16bit( xor, RD, Esize, E2, RNB, E3, RA, RT0, RT1); \ + movl (((next_r) * 16) + 3 * 4)(CTX), RDd; \ + xorl RNDd, RDd; \ + \ + do16bit_shr(16, xor, RC, Esize, E0, RNC, E1, RNB, RT0, RT1); \ + do16bit( xor, RC, Esize, E2, RA, E3, RD, RT0, RT1); \ + movl (((next_r) * 16) + 2 * 4)(CTX), RCd; \ + xorl RNCd, RCd; \ + \ + do16bit_shr(16, xor, RB, Esize, E0, RNB, E1, RA, RT0, RT1); \ + do16bit( xor, RB, Esize, E2, RD, E3, RC, RT0, RT1); \ + movl (((next_r) * 16) + 1 * 4)(CTX), RBd; \ + xorl RNBd, RBd; + +#define do_lastencround(next_r) \ + do16bit_shr(16, mov, RA, Esize, Es0, RNA, Es1, RND, RT0, RT1); \ + do16bit( mov, RA, Esize, Es2, RNC, Es3, RNB, RT0, RT1); \ + \ + do16bit_shr(16, or, RB, Esize, Es0, RNB, Es1, RNA, RT0, RT1); \ + do16bit( or, RB, Esize, Es2, RND, Es3, RNC, RT0, RT1); \ + \ + do16bit_shr(16, or, RC, Esize, Es0, RNC, Es1, RNB, RT0, RT1); \ + do16bit( or, RC, Esize, Es2, RNA, Es3, RND, RT0, RT1); \ + \ + do16bit_shr(16, or, RD, Esize, Es0, RND, Es1, RNC, RT0, RT1); \ + do16bit( or, RD, Esize, Es2, RNB, Es3, RNA, RT0, RT1); + +#define firstencround(round) \ + addroundkey(round, RA, RB, RC, RD); \ + do_encround((round) + 1); + +#define encround(round) \ + do_encround((round) + 1); + +#define lastencround(round) \ + do_lastencround(); \ + addroundkey((round) + 1, RNA, RNB, RNC, RND); + +.align 8 +.global _gcry_aes_amd64_encrypt_block +.type _gcry_aes_amd64_encrypt_block, at function; + +_gcry_aes_amd64_encrypt_block: + /* input: + * %rdi: keysched, CTX + * %rsi: dst + * %rdx: src + * %ecx: number of rounds.. 10, 12 or 14 + */ + subq $(5 * 8), %rsp; + movq %rsi, (0 * 8)(%rsp); + movl %ecx, (1 * 8)(%rsp); + movq %rbp, (2 * 8)(%rsp); + movq %rbx, (3 * 8)(%rsp); + movq %r12, (4 * 8)(%rsp); + + leaq .LtableE0(RIP), RTAB; + + /* read input block */ + movl 0 * 4(%rdx), RAd; + movl 1 * 4(%rdx), RBd; + movl 2 * 4(%rdx), RCd; + movl 3 * 4(%rdx), RDd; + + firstencround(0); + encround(1); + encround(2); + encround(3); + encround(4); + encround(5); + encround(6); + encround(7); + encround(8); + cmpl $12, (1 * 8)(%rsp); + jnb .Lenc_not_128; + lastencround(9); + +.align 4 +.Lenc_done: + /* write output block */ + movq (0 * 8)(%rsp), %rsi; + movl RNAd, 0 * 4(%rsi); + movl RNBd, 1 * 4(%rsi); + movl RNCd, 2 * 4(%rsi); + movl RNDd, 3 * 4(%rsi); + + movq (4 * 8)(%rsp), %r12; + movq (3 * 8)(%rsp), %rbx; + movq (2 * 8)(%rsp), %rbp; + addq $(5 * 8), %rsp; + + ret; + +.align 4 +.Lenc_not_128: + je .Lenc_192 + + encround(9); + encround(10); + encround(11); + encround(12); + lastencround(13); + + jmp .Lenc_done; + +.align 4 +.Lenc_192: + encround(9); + encround(10); + lastencround(11); + + jmp .Lenc_done; +.size _gcry_aes_amd64_encrypt_block,.-_gcry_aes_amd64_encrypt_block; + +#define do_decround(next_r) \ + do16bit_shr(16, mov, RA, Dsize, D0, RNA, D1, RNB, RT0, RT1); \ + do16bit( mov, RA, Dsize, D2, RNC, D3, RND, RT0, RT1); \ + movl (((next_r) * 16) + 0 * 4)(CTX), RAd; \ + xorl RNAd, RAd; \ + \ + do16bit_shr(16, xor, RB, Dsize, D0, RNB, D1, RNC, RT0, RT1); \ + do16bit( xor, RB, Dsize, D2, RND, D3, RA, RT0, RT1); \ + movl (((next_r) * 16) + 1 * 4)(CTX), RBd; \ + xorl RNBd, RBd; \ + \ + do16bit_shr(16, xor, RC, Dsize, D0, RNC, D1, RND, RT0, RT1); \ + do16bit( xor, RC, Dsize, D2, RA, D3, RB, RT0, RT1); \ + movl (((next_r) * 16) + 2 * 4)(CTX), RCd; \ + xorl RNCd, RCd; \ + \ + do16bit_shr(16, xor, RD, Dsize, D0, RND, D1, RA, RT0, RT1); \ + do16bit( xor, RD, Dsize, D2, RB, D3, RC, RT0, RT1); \ + movl (((next_r) * 16) + 3 * 4)(CTX), RDd; \ + xorl RNDd, RDd; \ + +#define do_lastdecround() \ + do16bit_shr(16, mov, RA, Dsize, Ds0, RNA, Ds1, RNB, RT0, RT1); \ + do16bit( mov, RA, Dsize, Ds2, RNC, Ds3, RND, RT0, RT1); \ + \ + do16bit_shr(16, or, RB, Dsize, Ds0, RNB, Ds1, RNC, RT0, RT1); \ + do16bit( or, RB, Dsize, Ds2, RND, Ds3, RNA, RT0, RT1); \ + \ + do16bit_shr(16, or, RC, Dsize, Ds0, RNC, Ds1, RND, RT0, RT1); \ + do16bit( or, RC, Dsize, Ds2, RNA, Ds3, RNB, RT0, RT1); \ + \ + do16bit_shr(16, or, RD, Dsize, Ds0, RND, Ds1, RNA, RT0, RT1); \ + do16bit( or, RD, Dsize, Ds2, RNB, Ds3, RNC, RT0, RT1); + +#define firstdecround(round) \ + addroundkey((round + 1), RA, RB, RC, RD); \ + do_decround(round); + +#define decround(round) \ + do_decround(round); + +#define lastdecround(round) \ + do_lastdecround(); \ + addroundkey(round, RNA, RNB, RNC, RND); + +.align 8 +.global _gcry_aes_amd64_decrypt_block +.type _gcry_aes_amd64_decrypt_block, at function; + +_gcry_aes_amd64_decrypt_block: + /* input: + * %rdi: keysched, CTX + * %rsi: dst + * %rdx: src + * %ecx: number of rounds.. 10, 12 or 14 + */ + subq $(5 * 8), %rsp; + movq %rsi, (0 * 8)(%rsp); + movl %ecx, (1 * 8)(%rsp); + movq %rbp, (2 * 8)(%rsp); + movq %rbx, (3 * 8)(%rsp); + movq %r12, (4 * 8)(%rsp); + + leaq .LtableD0(RIP), RTAB; + + /* read input block */ + movl 0 * 4(%rdx), RAd; + movl 1 * 4(%rdx), RBd; + movl 2 * 4(%rdx), RCd; + movl 3 * 4(%rdx), RDd; + + cmpl $12, (1 * 8)(%rsp); + jnb .Ldec_256; + + firstdecround(9); +.align 4 +.Ldec_tail: + decround(8); + decround(7); + decround(6); + decround(5); + decround(4); + decround(3); + decround(2); + decround(1); + lastdecround(0); + + /* write output block */ + movq (0 * 8)(%rsp), %rsi; + movl RNAd, 0 * 4(%rsi); + movl RNBd, 1 * 4(%rsi); + movl RNCd, 2 * 4(%rsi); + movl RNDd, 3 * 4(%rsi); + + movq (4 * 8)(%rsp), %r12; + movq (3 * 8)(%rsp), %rbx; + movq (2 * 8)(%rsp), %rbp; + addq $(5 * 8), %rsp; + + ret; + +.align 4 +.Ldec_256: + je .Ldec_192; + + firstdecround(13); + decround(12); + decround(11); + decround(10); + decround(9); + + jmp .Ldec_tail; + +.align 4 +.Ldec_192: + firstdecround(11); + decround(10); + decround(9); + + jmp .Ldec_tail; +.size _gcry_aes_amd64_encrypt_block,.-_gcry_aes_amd64_encrypt_block; + +.data +.align 16 + +/* Encryption tables */ +.LtableE0: +.long 0xa56363c6 +.LtableEs0: +.long 0x00000063, 0x847c7cf8, 0x0000007c +.long 0x997777ee, 0x00000077, 0x8d7b7bf6, 0x0000007b +.long 0x0df2f2ff, 0x000000f2, 0xbd6b6bd6, 0x0000006b +.long 0xb16f6fde, 0x0000006f, 0x54c5c591, 0x000000c5 +.long 0x50303060, 0x00000030, 0x03010102, 0x00000001 +.long 0xa96767ce, 0x00000067, 0x7d2b2b56, 0x0000002b +.long 0x19fefee7, 0x000000fe, 0x62d7d7b5, 0x000000d7 +.long 0xe6abab4d, 0x000000ab, 0x9a7676ec, 0x00000076 +.long 0x45caca8f, 0x000000ca, 0x9d82821f, 0x00000082 +.long 0x40c9c989, 0x000000c9, 0x877d7dfa, 0x0000007d +.long 0x15fafaef, 0x000000fa, 0xeb5959b2, 0x00000059 +.long 0xc947478e, 0x00000047, 0x0bf0f0fb, 0x000000f0 +.long 0xecadad41, 0x000000ad, 0x67d4d4b3, 0x000000d4 +.long 0xfda2a25f, 0x000000a2, 0xeaafaf45, 0x000000af +.long 0xbf9c9c23, 0x0000009c, 0xf7a4a453, 0x000000a4 +.long 0x967272e4, 0x00000072, 0x5bc0c09b, 0x000000c0 +.long 0xc2b7b775, 0x000000b7, 0x1cfdfde1, 0x000000fd +.long 0xae93933d, 0x00000093, 0x6a26264c, 0x00000026 +.long 0x5a36366c, 0x00000036, 0x413f3f7e, 0x0000003f +.long 0x02f7f7f5, 0x000000f7, 0x4fcccc83, 0x000000cc +.long 0x5c343468, 0x00000034, 0xf4a5a551, 0x000000a5 +.long 0x34e5e5d1, 0x000000e5, 0x08f1f1f9, 0x000000f1 +.long 0x937171e2, 0x00000071, 0x73d8d8ab, 0x000000d8 +.long 0x53313162, 0x00000031, 0x3f15152a, 0x00000015 +.long 0x0c040408, 0x00000004, 0x52c7c795, 0x000000c7 +.long 0x65232346, 0x00000023, 0x5ec3c39d, 0x000000c3 +.long 0x28181830, 0x00000018, 0xa1969637, 0x00000096 +.long 0x0f05050a, 0x00000005, 0xb59a9a2f, 0x0000009a +.long 0x0907070e, 0x00000007, 0x36121224, 0x00000012 +.long 0x9b80801b, 0x00000080, 0x3de2e2df, 0x000000e2 +.long 0x26ebebcd, 0x000000eb, 0x6927274e, 0x00000027 +.long 0xcdb2b27f, 0x000000b2, 0x9f7575ea, 0x00000075 +.long 0x1b090912, 0x00000009, 0x9e83831d, 0x00000083 +.long 0x742c2c58, 0x0000002c, 0x2e1a1a34, 0x0000001a +.long 0x2d1b1b36, 0x0000001b, 0xb26e6edc, 0x0000006e +.long 0xee5a5ab4, 0x0000005a, 0xfba0a05b, 0x000000a0 +.long 0xf65252a4, 0x00000052, 0x4d3b3b76, 0x0000003b +.long 0x61d6d6b7, 0x000000d6, 0xceb3b37d, 0x000000b3 +.long 0x7b292952, 0x00000029, 0x3ee3e3dd, 0x000000e3 +.long 0x712f2f5e, 0x0000002f, 0x97848413, 0x00000084 +.long 0xf55353a6, 0x00000053, 0x68d1d1b9, 0x000000d1 +.long 0x00000000, 0x00000000, 0x2cededc1, 0x000000ed +.long 0x60202040, 0x00000020, 0x1ffcfce3, 0x000000fc +.long 0xc8b1b179, 0x000000b1, 0xed5b5bb6, 0x0000005b +.long 0xbe6a6ad4, 0x0000006a, 0x46cbcb8d, 0x000000cb +.long 0xd9bebe67, 0x000000be, 0x4b393972, 0x00000039 +.long 0xde4a4a94, 0x0000004a, 0xd44c4c98, 0x0000004c +.long 0xe85858b0, 0x00000058, 0x4acfcf85, 0x000000cf +.long 0x6bd0d0bb, 0x000000d0, 0x2aefefc5, 0x000000ef +.long 0xe5aaaa4f, 0x000000aa, 0x16fbfbed, 0x000000fb +.long 0xc5434386, 0x00000043, 0xd74d4d9a, 0x0000004d +.long 0x55333366, 0x00000033, 0x94858511, 0x00000085 +.long 0xcf45458a, 0x00000045, 0x10f9f9e9, 0x000000f9 +.long 0x06020204, 0x00000002, 0x817f7ffe, 0x0000007f +.long 0xf05050a0, 0x00000050, 0x443c3c78, 0x0000003c +.long 0xba9f9f25, 0x0000009f, 0xe3a8a84b, 0x000000a8 +.long 0xf35151a2, 0x00000051, 0xfea3a35d, 0x000000a3 +.long 0xc0404080, 0x00000040, 0x8a8f8f05, 0x0000008f +.long 0xad92923f, 0x00000092, 0xbc9d9d21, 0x0000009d +.long 0x48383870, 0x00000038, 0x04f5f5f1, 0x000000f5 +.long 0xdfbcbc63, 0x000000bc, 0xc1b6b677, 0x000000b6 +.long 0x75dadaaf, 0x000000da, 0x63212142, 0x00000021 +.long 0x30101020, 0x00000010, 0x1affffe5, 0x000000ff +.long 0x0ef3f3fd, 0x000000f3, 0x6dd2d2bf, 0x000000d2 +.long 0x4ccdcd81, 0x000000cd, 0x140c0c18, 0x0000000c +.long 0x35131326, 0x00000013, 0x2fececc3, 0x000000ec +.long 0xe15f5fbe, 0x0000005f, 0xa2979735, 0x00000097 +.long 0xcc444488, 0x00000044, 0x3917172e, 0x00000017 +.long 0x57c4c493, 0x000000c4, 0xf2a7a755, 0x000000a7 +.long 0x827e7efc, 0x0000007e, 0x473d3d7a, 0x0000003d +.long 0xac6464c8, 0x00000064, 0xe75d5dba, 0x0000005d +.long 0x2b191932, 0x00000019, 0x957373e6, 0x00000073 +.long 0xa06060c0, 0x00000060, 0x98818119, 0x00000081 +.long 0xd14f4f9e, 0x0000004f, 0x7fdcdca3, 0x000000dc +.long 0x66222244, 0x00000022, 0x7e2a2a54, 0x0000002a +.long 0xab90903b, 0x00000090, 0x8388880b, 0x00000088 +.long 0xca46468c, 0x00000046, 0x29eeeec7, 0x000000ee +.long 0xd3b8b86b, 0x000000b8, 0x3c141428, 0x00000014 +.long 0x79dedea7, 0x000000de, 0xe25e5ebc, 0x0000005e +.long 0x1d0b0b16, 0x0000000b, 0x76dbdbad, 0x000000db +.long 0x3be0e0db, 0x000000e0, 0x56323264, 0x00000032 +.long 0x4e3a3a74, 0x0000003a, 0x1e0a0a14, 0x0000000a +.long 0xdb494992, 0x00000049, 0x0a06060c, 0x00000006 +.long 0x6c242448, 0x00000024, 0xe45c5cb8, 0x0000005c +.long 0x5dc2c29f, 0x000000c2, 0x6ed3d3bd, 0x000000d3 +.long 0xefacac43, 0x000000ac, 0xa66262c4, 0x00000062 +.long 0xa8919139, 0x00000091, 0xa4959531, 0x00000095 +.long 0x37e4e4d3, 0x000000e4, 0x8b7979f2, 0x00000079 +.long 0x32e7e7d5, 0x000000e7, 0x43c8c88b, 0x000000c8 +.long 0x5937376e, 0x00000037, 0xb76d6dda, 0x0000006d +.long 0x8c8d8d01, 0x0000008d, 0x64d5d5b1, 0x000000d5 +.long 0xd24e4e9c, 0x0000004e, 0xe0a9a949, 0x000000a9 +.long 0xb46c6cd8, 0x0000006c, 0xfa5656ac, 0x00000056 +.long 0x07f4f4f3, 0x000000f4, 0x25eaeacf, 0x000000ea +.long 0xaf6565ca, 0x00000065, 0x8e7a7af4, 0x0000007a +.long 0xe9aeae47, 0x000000ae, 0x18080810, 0x00000008 +.long 0xd5baba6f, 0x000000ba, 0x887878f0, 0x00000078 +.long 0x6f25254a, 0x00000025, 0x722e2e5c, 0x0000002e +.long 0x241c1c38, 0x0000001c, 0xf1a6a657, 0x000000a6 +.long 0xc7b4b473, 0x000000b4, 0x51c6c697, 0x000000c6 +.long 0x23e8e8cb, 0x000000e8, 0x7cdddda1, 0x000000dd +.long 0x9c7474e8, 0x00000074, 0x211f1f3e, 0x0000001f +.long 0xdd4b4b96, 0x0000004b, 0xdcbdbd61, 0x000000bd +.long 0x868b8b0d, 0x0000008b, 0x858a8a0f, 0x0000008a +.long 0x907070e0, 0x00000070, 0x423e3e7c, 0x0000003e +.long 0xc4b5b571, 0x000000b5, 0xaa6666cc, 0x00000066 +.long 0xd8484890, 0x00000048, 0x05030306, 0x00000003 +.long 0x01f6f6f7, 0x000000f6, 0x120e0e1c, 0x0000000e +.long 0xa36161c2, 0x00000061, 0x5f35356a, 0x00000035 +.long 0xf95757ae, 0x00000057, 0xd0b9b969, 0x000000b9 +.long 0x91868617, 0x00000086, 0x58c1c199, 0x000000c1 +.long 0x271d1d3a, 0x0000001d, 0xb99e9e27, 0x0000009e +.long 0x38e1e1d9, 0x000000e1, 0x13f8f8eb, 0x000000f8 +.long 0xb398982b, 0x00000098, 0x33111122, 0x00000011 +.long 0xbb6969d2, 0x00000069, 0x70d9d9a9, 0x000000d9 +.long 0x898e8e07, 0x0000008e, 0xa7949433, 0x00000094 +.long 0xb69b9b2d, 0x0000009b, 0x221e1e3c, 0x0000001e +.long 0x92878715, 0x00000087, 0x20e9e9c9, 0x000000e9 +.long 0x49cece87, 0x000000ce, 0xff5555aa, 0x00000055 +.long 0x78282850, 0x00000028, 0x7adfdfa5, 0x000000df +.long 0x8f8c8c03, 0x0000008c, 0xf8a1a159, 0x000000a1 +.long 0x80898909, 0x00000089, 0x170d0d1a, 0x0000000d +.long 0xdabfbf65, 0x000000bf, 0x31e6e6d7, 0x000000e6 +.long 0xc6424284, 0x00000042, 0xb86868d0, 0x00000068 +.long 0xc3414182, 0x00000041, 0xb0999929, 0x00000099 +.long 0x772d2d5a, 0x0000002d, 0x110f0f1e, 0x0000000f +.long 0xcbb0b07b, 0x000000b0, 0xfc5454a8, 0x00000054 +.long 0xd6bbbb6d, 0x000000bb, 0x3a16162c, 0x00000016 +.LtableE1: +.long 0x6363c6a5 +.LtableEs1: +.long 0x00006300, 0x7c7cf884, 0x00007c00 +.long 0x7777ee99, 0x00007700, 0x7b7bf68d, 0x00007b00 +.long 0xf2f2ff0d, 0x0000f200, 0x6b6bd6bd, 0x00006b00 +.long 0x6f6fdeb1, 0x00006f00, 0xc5c59154, 0x0000c500 +.long 0x30306050, 0x00003000, 0x01010203, 0x00000100 +.long 0x6767cea9, 0x00006700, 0x2b2b567d, 0x00002b00 +.long 0xfefee719, 0x0000fe00, 0xd7d7b562, 0x0000d700 +.long 0xabab4de6, 0x0000ab00, 0x7676ec9a, 0x00007600 +.long 0xcaca8f45, 0x0000ca00, 0x82821f9d, 0x00008200 +.long 0xc9c98940, 0x0000c900, 0x7d7dfa87, 0x00007d00 +.long 0xfafaef15, 0x0000fa00, 0x5959b2eb, 0x00005900 +.long 0x47478ec9, 0x00004700, 0xf0f0fb0b, 0x0000f000 +.long 0xadad41ec, 0x0000ad00, 0xd4d4b367, 0x0000d400 +.long 0xa2a25ffd, 0x0000a200, 0xafaf45ea, 0x0000af00 +.long 0x9c9c23bf, 0x00009c00, 0xa4a453f7, 0x0000a400 +.long 0x7272e496, 0x00007200, 0xc0c09b5b, 0x0000c000 +.long 0xb7b775c2, 0x0000b700, 0xfdfde11c, 0x0000fd00 +.long 0x93933dae, 0x00009300, 0x26264c6a, 0x00002600 +.long 0x36366c5a, 0x00003600, 0x3f3f7e41, 0x00003f00 +.long 0xf7f7f502, 0x0000f700, 0xcccc834f, 0x0000cc00 +.long 0x3434685c, 0x00003400, 0xa5a551f4, 0x0000a500 +.long 0xe5e5d134, 0x0000e500, 0xf1f1f908, 0x0000f100 +.long 0x7171e293, 0x00007100, 0xd8d8ab73, 0x0000d800 +.long 0x31316253, 0x00003100, 0x15152a3f, 0x00001500 +.long 0x0404080c, 0x00000400, 0xc7c79552, 0x0000c700 +.long 0x23234665, 0x00002300, 0xc3c39d5e, 0x0000c300 +.long 0x18183028, 0x00001800, 0x969637a1, 0x00009600 +.long 0x05050a0f, 0x00000500, 0x9a9a2fb5, 0x00009a00 +.long 0x07070e09, 0x00000700, 0x12122436, 0x00001200 +.long 0x80801b9b, 0x00008000, 0xe2e2df3d, 0x0000e200 +.long 0xebebcd26, 0x0000eb00, 0x27274e69, 0x00002700 +.long 0xb2b27fcd, 0x0000b200, 0x7575ea9f, 0x00007500 +.long 0x0909121b, 0x00000900, 0x83831d9e, 0x00008300 +.long 0x2c2c5874, 0x00002c00, 0x1a1a342e, 0x00001a00 +.long 0x1b1b362d, 0x00001b00, 0x6e6edcb2, 0x00006e00 +.long 0x5a5ab4ee, 0x00005a00, 0xa0a05bfb, 0x0000a000 +.long 0x5252a4f6, 0x00005200, 0x3b3b764d, 0x00003b00 +.long 0xd6d6b761, 0x0000d600, 0xb3b37dce, 0x0000b300 +.long 0x2929527b, 0x00002900, 0xe3e3dd3e, 0x0000e300 +.long 0x2f2f5e71, 0x00002f00, 0x84841397, 0x00008400 +.long 0x5353a6f5, 0x00005300, 0xd1d1b968, 0x0000d100 +.long 0x00000000, 0x00000000, 0xededc12c, 0x0000ed00 +.long 0x20204060, 0x00002000, 0xfcfce31f, 0x0000fc00 +.long 0xb1b179c8, 0x0000b100, 0x5b5bb6ed, 0x00005b00 +.long 0x6a6ad4be, 0x00006a00, 0xcbcb8d46, 0x0000cb00 +.long 0xbebe67d9, 0x0000be00, 0x3939724b, 0x00003900 +.long 0x4a4a94de, 0x00004a00, 0x4c4c98d4, 0x00004c00 +.long 0x5858b0e8, 0x00005800, 0xcfcf854a, 0x0000cf00 +.long 0xd0d0bb6b, 0x0000d000, 0xefefc52a, 0x0000ef00 +.long 0xaaaa4fe5, 0x0000aa00, 0xfbfbed16, 0x0000fb00 +.long 0x434386c5, 0x00004300, 0x4d4d9ad7, 0x00004d00 +.long 0x33336655, 0x00003300, 0x85851194, 0x00008500 +.long 0x45458acf, 0x00004500, 0xf9f9e910, 0x0000f900 +.long 0x02020406, 0x00000200, 0x7f7ffe81, 0x00007f00 +.long 0x5050a0f0, 0x00005000, 0x3c3c7844, 0x00003c00 +.long 0x9f9f25ba, 0x00009f00, 0xa8a84be3, 0x0000a800 +.long 0x5151a2f3, 0x00005100, 0xa3a35dfe, 0x0000a300 +.long 0x404080c0, 0x00004000, 0x8f8f058a, 0x00008f00 +.long 0x92923fad, 0x00009200, 0x9d9d21bc, 0x00009d00 +.long 0x38387048, 0x00003800, 0xf5f5f104, 0x0000f500 +.long 0xbcbc63df, 0x0000bc00, 0xb6b677c1, 0x0000b600 +.long 0xdadaaf75, 0x0000da00, 0x21214263, 0x00002100 +.long 0x10102030, 0x00001000, 0xffffe51a, 0x0000ff00 +.long 0xf3f3fd0e, 0x0000f300, 0xd2d2bf6d, 0x0000d200 +.long 0xcdcd814c, 0x0000cd00, 0x0c0c1814, 0x00000c00 +.long 0x13132635, 0x00001300, 0xececc32f, 0x0000ec00 +.long 0x5f5fbee1, 0x00005f00, 0x979735a2, 0x00009700 +.long 0x444488cc, 0x00004400, 0x17172e39, 0x00001700 +.long 0xc4c49357, 0x0000c400, 0xa7a755f2, 0x0000a700 +.long 0x7e7efc82, 0x00007e00, 0x3d3d7a47, 0x00003d00 +.long 0x6464c8ac, 0x00006400, 0x5d5dbae7, 0x00005d00 +.long 0x1919322b, 0x00001900, 0x7373e695, 0x00007300 +.long 0x6060c0a0, 0x00006000, 0x81811998, 0x00008100 +.long 0x4f4f9ed1, 0x00004f00, 0xdcdca37f, 0x0000dc00 +.long 0x22224466, 0x00002200, 0x2a2a547e, 0x00002a00 +.long 0x90903bab, 0x00009000, 0x88880b83, 0x00008800 +.long 0x46468cca, 0x00004600, 0xeeeec729, 0x0000ee00 +.long 0xb8b86bd3, 0x0000b800, 0x1414283c, 0x00001400 +.long 0xdedea779, 0x0000de00, 0x5e5ebce2, 0x00005e00 +.long 0x0b0b161d, 0x00000b00, 0xdbdbad76, 0x0000db00 +.long 0xe0e0db3b, 0x0000e000, 0x32326456, 0x00003200 +.long 0x3a3a744e, 0x00003a00, 0x0a0a141e, 0x00000a00 +.long 0x494992db, 0x00004900, 0x06060c0a, 0x00000600 +.long 0x2424486c, 0x00002400, 0x5c5cb8e4, 0x00005c00 +.long 0xc2c29f5d, 0x0000c200, 0xd3d3bd6e, 0x0000d300 +.long 0xacac43ef, 0x0000ac00, 0x6262c4a6, 0x00006200 +.long 0x919139a8, 0x00009100, 0x959531a4, 0x00009500 +.long 0xe4e4d337, 0x0000e400, 0x7979f28b, 0x00007900 +.long 0xe7e7d532, 0x0000e700, 0xc8c88b43, 0x0000c800 +.long 0x37376e59, 0x00003700, 0x6d6ddab7, 0x00006d00 +.long 0x8d8d018c, 0x00008d00, 0xd5d5b164, 0x0000d500 +.long 0x4e4e9cd2, 0x00004e00, 0xa9a949e0, 0x0000a900 +.long 0x6c6cd8b4, 0x00006c00, 0x5656acfa, 0x00005600 +.long 0xf4f4f307, 0x0000f400, 0xeaeacf25, 0x0000ea00 +.long 0x6565caaf, 0x00006500, 0x7a7af48e, 0x00007a00 +.long 0xaeae47e9, 0x0000ae00, 0x08081018, 0x00000800 +.long 0xbaba6fd5, 0x0000ba00, 0x7878f088, 0x00007800 +.long 0x25254a6f, 0x00002500, 0x2e2e5c72, 0x00002e00 +.long 0x1c1c3824, 0x00001c00, 0xa6a657f1, 0x0000a600 +.long 0xb4b473c7, 0x0000b400, 0xc6c69751, 0x0000c600 +.long 0xe8e8cb23, 0x0000e800, 0xdddda17c, 0x0000dd00 +.long 0x7474e89c, 0x00007400, 0x1f1f3e21, 0x00001f00 +.long 0x4b4b96dd, 0x00004b00, 0xbdbd61dc, 0x0000bd00 +.long 0x8b8b0d86, 0x00008b00, 0x8a8a0f85, 0x00008a00 +.long 0x7070e090, 0x00007000, 0x3e3e7c42, 0x00003e00 +.long 0xb5b571c4, 0x0000b500, 0x6666ccaa, 0x00006600 +.long 0x484890d8, 0x00004800, 0x03030605, 0x00000300 +.long 0xf6f6f701, 0x0000f600, 0x0e0e1c12, 0x00000e00 +.long 0x6161c2a3, 0x00006100, 0x35356a5f, 0x00003500 +.long 0x5757aef9, 0x00005700, 0xb9b969d0, 0x0000b900 +.long 0x86861791, 0x00008600, 0xc1c19958, 0x0000c100 +.long 0x1d1d3a27, 0x00001d00, 0x9e9e27b9, 0x00009e00 +.long 0xe1e1d938, 0x0000e100, 0xf8f8eb13, 0x0000f800 +.long 0x98982bb3, 0x00009800, 0x11112233, 0x00001100 +.long 0x6969d2bb, 0x00006900, 0xd9d9a970, 0x0000d900 +.long 0x8e8e0789, 0x00008e00, 0x949433a7, 0x00009400 +.long 0x9b9b2db6, 0x00009b00, 0x1e1e3c22, 0x00001e00 +.long 0x87871592, 0x00008700, 0xe9e9c920, 0x0000e900 +.long 0xcece8749, 0x0000ce00, 0x5555aaff, 0x00005500 +.long 0x28285078, 0x00002800, 0xdfdfa57a, 0x0000df00 +.long 0x8c8c038f, 0x00008c00, 0xa1a159f8, 0x0000a100 +.long 0x89890980, 0x00008900, 0x0d0d1a17, 0x00000d00 +.long 0xbfbf65da, 0x0000bf00, 0xe6e6d731, 0x0000e600 +.long 0x424284c6, 0x00004200, 0x6868d0b8, 0x00006800 +.long 0x414182c3, 0x00004100, 0x999929b0, 0x00009900 +.long 0x2d2d5a77, 0x00002d00, 0x0f0f1e11, 0x00000f00 +.long 0xb0b07bcb, 0x0000b000, 0x5454a8fc, 0x00005400 +.long 0xbbbb6dd6, 0x0000bb00, 0x16162c3a, 0x00001600 +.LtableE2: +.long 0x63c6a563 +.LtableEs2: +.long 0x00630000, 0x7cf8847c, 0x007c0000 +.long 0x77ee9977, 0x00770000, 0x7bf68d7b, 0x007b0000 +.long 0xf2ff0df2, 0x00f20000, 0x6bd6bd6b, 0x006b0000 +.long 0x6fdeb16f, 0x006f0000, 0xc59154c5, 0x00c50000 +.long 0x30605030, 0x00300000, 0x01020301, 0x00010000 +.long 0x67cea967, 0x00670000, 0x2b567d2b, 0x002b0000 +.long 0xfee719fe, 0x00fe0000, 0xd7b562d7, 0x00d70000 +.long 0xab4de6ab, 0x00ab0000, 0x76ec9a76, 0x00760000 +.long 0xca8f45ca, 0x00ca0000, 0x821f9d82, 0x00820000 +.long 0xc98940c9, 0x00c90000, 0x7dfa877d, 0x007d0000 +.long 0xfaef15fa, 0x00fa0000, 0x59b2eb59, 0x00590000 +.long 0x478ec947, 0x00470000, 0xf0fb0bf0, 0x00f00000 +.long 0xad41ecad, 0x00ad0000, 0xd4b367d4, 0x00d40000 +.long 0xa25ffda2, 0x00a20000, 0xaf45eaaf, 0x00af0000 +.long 0x9c23bf9c, 0x009c0000, 0xa453f7a4, 0x00a40000 +.long 0x72e49672, 0x00720000, 0xc09b5bc0, 0x00c00000 +.long 0xb775c2b7, 0x00b70000, 0xfde11cfd, 0x00fd0000 +.long 0x933dae93, 0x00930000, 0x264c6a26, 0x00260000 +.long 0x366c5a36, 0x00360000, 0x3f7e413f, 0x003f0000 +.long 0xf7f502f7, 0x00f70000, 0xcc834fcc, 0x00cc0000 +.long 0x34685c34, 0x00340000, 0xa551f4a5, 0x00a50000 +.long 0xe5d134e5, 0x00e50000, 0xf1f908f1, 0x00f10000 +.long 0x71e29371, 0x00710000, 0xd8ab73d8, 0x00d80000 +.long 0x31625331, 0x00310000, 0x152a3f15, 0x00150000 +.long 0x04080c04, 0x00040000, 0xc79552c7, 0x00c70000 +.long 0x23466523, 0x00230000, 0xc39d5ec3, 0x00c30000 +.long 0x18302818, 0x00180000, 0x9637a196, 0x00960000 +.long 0x050a0f05, 0x00050000, 0x9a2fb59a, 0x009a0000 +.long 0x070e0907, 0x00070000, 0x12243612, 0x00120000 +.long 0x801b9b80, 0x00800000, 0xe2df3de2, 0x00e20000 +.long 0xebcd26eb, 0x00eb0000, 0x274e6927, 0x00270000 +.long 0xb27fcdb2, 0x00b20000, 0x75ea9f75, 0x00750000 +.long 0x09121b09, 0x00090000, 0x831d9e83, 0x00830000 +.long 0x2c58742c, 0x002c0000, 0x1a342e1a, 0x001a0000 +.long 0x1b362d1b, 0x001b0000, 0x6edcb26e, 0x006e0000 +.long 0x5ab4ee5a, 0x005a0000, 0xa05bfba0, 0x00a00000 +.long 0x52a4f652, 0x00520000, 0x3b764d3b, 0x003b0000 +.long 0xd6b761d6, 0x00d60000, 0xb37dceb3, 0x00b30000 +.long 0x29527b29, 0x00290000, 0xe3dd3ee3, 0x00e30000 +.long 0x2f5e712f, 0x002f0000, 0x84139784, 0x00840000 +.long 0x53a6f553, 0x00530000, 0xd1b968d1, 0x00d10000 +.long 0x00000000, 0x00000000, 0xedc12ced, 0x00ed0000 +.long 0x20406020, 0x00200000, 0xfce31ffc, 0x00fc0000 +.long 0xb179c8b1, 0x00b10000, 0x5bb6ed5b, 0x005b0000 +.long 0x6ad4be6a, 0x006a0000, 0xcb8d46cb, 0x00cb0000 +.long 0xbe67d9be, 0x00be0000, 0x39724b39, 0x00390000 +.long 0x4a94de4a, 0x004a0000, 0x4c98d44c, 0x004c0000 +.long 0x58b0e858, 0x00580000, 0xcf854acf, 0x00cf0000 +.long 0xd0bb6bd0, 0x00d00000, 0xefc52aef, 0x00ef0000 +.long 0xaa4fe5aa, 0x00aa0000, 0xfbed16fb, 0x00fb0000 +.long 0x4386c543, 0x00430000, 0x4d9ad74d, 0x004d0000 +.long 0x33665533, 0x00330000, 0x85119485, 0x00850000 +.long 0x458acf45, 0x00450000, 0xf9e910f9, 0x00f90000 +.long 0x02040602, 0x00020000, 0x7ffe817f, 0x007f0000 +.long 0x50a0f050, 0x00500000, 0x3c78443c, 0x003c0000 +.long 0x9f25ba9f, 0x009f0000, 0xa84be3a8, 0x00a80000 +.long 0x51a2f351, 0x00510000, 0xa35dfea3, 0x00a30000 +.long 0x4080c040, 0x00400000, 0x8f058a8f, 0x008f0000 +.long 0x923fad92, 0x00920000, 0x9d21bc9d, 0x009d0000 +.long 0x38704838, 0x00380000, 0xf5f104f5, 0x00f50000 +.long 0xbc63dfbc, 0x00bc0000, 0xb677c1b6, 0x00b60000 +.long 0xdaaf75da, 0x00da0000, 0x21426321, 0x00210000 +.long 0x10203010, 0x00100000, 0xffe51aff, 0x00ff0000 +.long 0xf3fd0ef3, 0x00f30000, 0xd2bf6dd2, 0x00d20000 +.long 0xcd814ccd, 0x00cd0000, 0x0c18140c, 0x000c0000 +.long 0x13263513, 0x00130000, 0xecc32fec, 0x00ec0000 +.long 0x5fbee15f, 0x005f0000, 0x9735a297, 0x00970000 +.long 0x4488cc44, 0x00440000, 0x172e3917, 0x00170000 +.long 0xc49357c4, 0x00c40000, 0xa755f2a7, 0x00a70000 +.long 0x7efc827e, 0x007e0000, 0x3d7a473d, 0x003d0000 +.long 0x64c8ac64, 0x00640000, 0x5dbae75d, 0x005d0000 +.long 0x19322b19, 0x00190000, 0x73e69573, 0x00730000 +.long 0x60c0a060, 0x00600000, 0x81199881, 0x00810000 +.long 0x4f9ed14f, 0x004f0000, 0xdca37fdc, 0x00dc0000 +.long 0x22446622, 0x00220000, 0x2a547e2a, 0x002a0000 +.long 0x903bab90, 0x00900000, 0x880b8388, 0x00880000 +.long 0x468cca46, 0x00460000, 0xeec729ee, 0x00ee0000 +.long 0xb86bd3b8, 0x00b80000, 0x14283c14, 0x00140000 +.long 0xdea779de, 0x00de0000, 0x5ebce25e, 0x005e0000 +.long 0x0b161d0b, 0x000b0000, 0xdbad76db, 0x00db0000 +.long 0xe0db3be0, 0x00e00000, 0x32645632, 0x00320000 +.long 0x3a744e3a, 0x003a0000, 0x0a141e0a, 0x000a0000 +.long 0x4992db49, 0x00490000, 0x060c0a06, 0x00060000 +.long 0x24486c24, 0x00240000, 0x5cb8e45c, 0x005c0000 +.long 0xc29f5dc2, 0x00c20000, 0xd3bd6ed3, 0x00d30000 +.long 0xac43efac, 0x00ac0000, 0x62c4a662, 0x00620000 +.long 0x9139a891, 0x00910000, 0x9531a495, 0x00950000 +.long 0xe4d337e4, 0x00e40000, 0x79f28b79, 0x00790000 +.long 0xe7d532e7, 0x00e70000, 0xc88b43c8, 0x00c80000 +.long 0x376e5937, 0x00370000, 0x6ddab76d, 0x006d0000 +.long 0x8d018c8d, 0x008d0000, 0xd5b164d5, 0x00d50000 +.long 0x4e9cd24e, 0x004e0000, 0xa949e0a9, 0x00a90000 +.long 0x6cd8b46c, 0x006c0000, 0x56acfa56, 0x00560000 +.long 0xf4f307f4, 0x00f40000, 0xeacf25ea, 0x00ea0000 +.long 0x65caaf65, 0x00650000, 0x7af48e7a, 0x007a0000 +.long 0xae47e9ae, 0x00ae0000, 0x08101808, 0x00080000 +.long 0xba6fd5ba, 0x00ba0000, 0x78f08878, 0x00780000 +.long 0x254a6f25, 0x00250000, 0x2e5c722e, 0x002e0000 +.long 0x1c38241c, 0x001c0000, 0xa657f1a6, 0x00a60000 +.long 0xb473c7b4, 0x00b40000, 0xc69751c6, 0x00c60000 +.long 0xe8cb23e8, 0x00e80000, 0xdda17cdd, 0x00dd0000 +.long 0x74e89c74, 0x00740000, 0x1f3e211f, 0x001f0000 +.long 0x4b96dd4b, 0x004b0000, 0xbd61dcbd, 0x00bd0000 +.long 0x8b0d868b, 0x008b0000, 0x8a0f858a, 0x008a0000 +.long 0x70e09070, 0x00700000, 0x3e7c423e, 0x003e0000 +.long 0xb571c4b5, 0x00b50000, 0x66ccaa66, 0x00660000 +.long 0x4890d848, 0x00480000, 0x03060503, 0x00030000 +.long 0xf6f701f6, 0x00f60000, 0x0e1c120e, 0x000e0000 +.long 0x61c2a361, 0x00610000, 0x356a5f35, 0x00350000 +.long 0x57aef957, 0x00570000, 0xb969d0b9, 0x00b90000 +.long 0x86179186, 0x00860000, 0xc19958c1, 0x00c10000 +.long 0x1d3a271d, 0x001d0000, 0x9e27b99e, 0x009e0000 +.long 0xe1d938e1, 0x00e10000, 0xf8eb13f8, 0x00f80000 +.long 0x982bb398, 0x00980000, 0x11223311, 0x00110000 +.long 0x69d2bb69, 0x00690000, 0xd9a970d9, 0x00d90000 +.long 0x8e07898e, 0x008e0000, 0x9433a794, 0x00940000 +.long 0x9b2db69b, 0x009b0000, 0x1e3c221e, 0x001e0000 +.long 0x87159287, 0x00870000, 0xe9c920e9, 0x00e90000 +.long 0xce8749ce, 0x00ce0000, 0x55aaff55, 0x00550000 +.long 0x28507828, 0x00280000, 0xdfa57adf, 0x00df0000 +.long 0x8c038f8c, 0x008c0000, 0xa159f8a1, 0x00a10000 +.long 0x89098089, 0x00890000, 0x0d1a170d, 0x000d0000 +.long 0xbf65dabf, 0x00bf0000, 0xe6d731e6, 0x00e60000 +.long 0x4284c642, 0x00420000, 0x68d0b868, 0x00680000 +.long 0x4182c341, 0x00410000, 0x9929b099, 0x00990000 +.long 0x2d5a772d, 0x002d0000, 0x0f1e110f, 0x000f0000 +.long 0xb07bcbb0, 0x00b00000, 0x54a8fc54, 0x00540000 +.long 0xbb6dd6bb, 0x00bb0000, 0x162c3a16, 0x00160000 +.LtableE3: +.long 0xc6a56363 +.LtableEs3: +.long 0x63000000, 0xf8847c7c, 0x7c000000 +.long 0xee997777, 0x77000000, 0xf68d7b7b, 0x7b000000 +.long 0xff0df2f2, 0xf2000000, 0xd6bd6b6b, 0x6b000000 +.long 0xdeb16f6f, 0x6f000000, 0x9154c5c5, 0xc5000000 +.long 0x60503030, 0x30000000, 0x02030101, 0x01000000 +.long 0xcea96767, 0x67000000, 0x567d2b2b, 0x2b000000 +.long 0xe719fefe, 0xfe000000, 0xb562d7d7, 0xd7000000 +.long 0x4de6abab, 0xab000000, 0xec9a7676, 0x76000000 +.long 0x8f45caca, 0xca000000, 0x1f9d8282, 0x82000000 +.long 0x8940c9c9, 0xc9000000, 0xfa877d7d, 0x7d000000 +.long 0xef15fafa, 0xfa000000, 0xb2eb5959, 0x59000000 +.long 0x8ec94747, 0x47000000, 0xfb0bf0f0, 0xf0000000 +.long 0x41ecadad, 0xad000000, 0xb367d4d4, 0xd4000000 +.long 0x5ffda2a2, 0xa2000000, 0x45eaafaf, 0xaf000000 +.long 0x23bf9c9c, 0x9c000000, 0x53f7a4a4, 0xa4000000 +.long 0xe4967272, 0x72000000, 0x9b5bc0c0, 0xc0000000 +.long 0x75c2b7b7, 0xb7000000, 0xe11cfdfd, 0xfd000000 +.long 0x3dae9393, 0x93000000, 0x4c6a2626, 0x26000000 +.long 0x6c5a3636, 0x36000000, 0x7e413f3f, 0x3f000000 +.long 0xf502f7f7, 0xf7000000, 0x834fcccc, 0xcc000000 +.long 0x685c3434, 0x34000000, 0x51f4a5a5, 0xa5000000 +.long 0xd134e5e5, 0xe5000000, 0xf908f1f1, 0xf1000000 +.long 0xe2937171, 0x71000000, 0xab73d8d8, 0xd8000000 +.long 0x62533131, 0x31000000, 0x2a3f1515, 0x15000000 +.long 0x080c0404, 0x04000000, 0x9552c7c7, 0xc7000000 +.long 0x46652323, 0x23000000, 0x9d5ec3c3, 0xc3000000 +.long 0x30281818, 0x18000000, 0x37a19696, 0x96000000 +.long 0x0a0f0505, 0x05000000, 0x2fb59a9a, 0x9a000000 +.long 0x0e090707, 0x07000000, 0x24361212, 0x12000000 +.long 0x1b9b8080, 0x80000000, 0xdf3de2e2, 0xe2000000 +.long 0xcd26ebeb, 0xeb000000, 0x4e692727, 0x27000000 +.long 0x7fcdb2b2, 0xb2000000, 0xea9f7575, 0x75000000 +.long 0x121b0909, 0x09000000, 0x1d9e8383, 0x83000000 +.long 0x58742c2c, 0x2c000000, 0x342e1a1a, 0x1a000000 +.long 0x362d1b1b, 0x1b000000, 0xdcb26e6e, 0x6e000000 +.long 0xb4ee5a5a, 0x5a000000, 0x5bfba0a0, 0xa0000000 +.long 0xa4f65252, 0x52000000, 0x764d3b3b, 0x3b000000 +.long 0xb761d6d6, 0xd6000000, 0x7dceb3b3, 0xb3000000 +.long 0x527b2929, 0x29000000, 0xdd3ee3e3, 0xe3000000 +.long 0x5e712f2f, 0x2f000000, 0x13978484, 0x84000000 +.long 0xa6f55353, 0x53000000, 0xb968d1d1, 0xd1000000 +.long 0x00000000, 0x00000000, 0xc12ceded, 0xed000000 +.long 0x40602020, 0x20000000, 0xe31ffcfc, 0xfc000000 +.long 0x79c8b1b1, 0xb1000000, 0xb6ed5b5b, 0x5b000000 +.long 0xd4be6a6a, 0x6a000000, 0x8d46cbcb, 0xcb000000 +.long 0x67d9bebe, 0xbe000000, 0x724b3939, 0x39000000 +.long 0x94de4a4a, 0x4a000000, 0x98d44c4c, 0x4c000000 +.long 0xb0e85858, 0x58000000, 0x854acfcf, 0xcf000000 +.long 0xbb6bd0d0, 0xd0000000, 0xc52aefef, 0xef000000 +.long 0x4fe5aaaa, 0xaa000000, 0xed16fbfb, 0xfb000000 +.long 0x86c54343, 0x43000000, 0x9ad74d4d, 0x4d000000 +.long 0x66553333, 0x33000000, 0x11948585, 0x85000000 +.long 0x8acf4545, 0x45000000, 0xe910f9f9, 0xf9000000 +.long 0x04060202, 0x02000000, 0xfe817f7f, 0x7f000000 +.long 0xa0f05050, 0x50000000, 0x78443c3c, 0x3c000000 +.long 0x25ba9f9f, 0x9f000000, 0x4be3a8a8, 0xa8000000 +.long 0xa2f35151, 0x51000000, 0x5dfea3a3, 0xa3000000 +.long 0x80c04040, 0x40000000, 0x058a8f8f, 0x8f000000 +.long 0x3fad9292, 0x92000000, 0x21bc9d9d, 0x9d000000 +.long 0x70483838, 0x38000000, 0xf104f5f5, 0xf5000000 +.long 0x63dfbcbc, 0xbc000000, 0x77c1b6b6, 0xb6000000 +.long 0xaf75dada, 0xda000000, 0x42632121, 0x21000000 +.long 0x20301010, 0x10000000, 0xe51affff, 0xff000000 +.long 0xfd0ef3f3, 0xf3000000, 0xbf6dd2d2, 0xd2000000 +.long 0x814ccdcd, 0xcd000000, 0x18140c0c, 0x0c000000 +.long 0x26351313, 0x13000000, 0xc32fecec, 0xec000000 +.long 0xbee15f5f, 0x5f000000, 0x35a29797, 0x97000000 +.long 0x88cc4444, 0x44000000, 0x2e391717, 0x17000000 +.long 0x9357c4c4, 0xc4000000, 0x55f2a7a7, 0xa7000000 +.long 0xfc827e7e, 0x7e000000, 0x7a473d3d, 0x3d000000 +.long 0xc8ac6464, 0x64000000, 0xbae75d5d, 0x5d000000 +.long 0x322b1919, 0x19000000, 0xe6957373, 0x73000000 +.long 0xc0a06060, 0x60000000, 0x19988181, 0x81000000 +.long 0x9ed14f4f, 0x4f000000, 0xa37fdcdc, 0xdc000000 +.long 0x44662222, 0x22000000, 0x547e2a2a, 0x2a000000 +.long 0x3bab9090, 0x90000000, 0x0b838888, 0x88000000 +.long 0x8cca4646, 0x46000000, 0xc729eeee, 0xee000000 +.long 0x6bd3b8b8, 0xb8000000, 0x283c1414, 0x14000000 +.long 0xa779dede, 0xde000000, 0xbce25e5e, 0x5e000000 +.long 0x161d0b0b, 0x0b000000, 0xad76dbdb, 0xdb000000 +.long 0xdb3be0e0, 0xe0000000, 0x64563232, 0x32000000 +.long 0x744e3a3a, 0x3a000000, 0x141e0a0a, 0x0a000000 +.long 0x92db4949, 0x49000000, 0x0c0a0606, 0x06000000 +.long 0x486c2424, 0x24000000, 0xb8e45c5c, 0x5c000000 +.long 0x9f5dc2c2, 0xc2000000, 0xbd6ed3d3, 0xd3000000 +.long 0x43efacac, 0xac000000, 0xc4a66262, 0x62000000 +.long 0x39a89191, 0x91000000, 0x31a49595, 0x95000000 +.long 0xd337e4e4, 0xe4000000, 0xf28b7979, 0x79000000 +.long 0xd532e7e7, 0xe7000000, 0x8b43c8c8, 0xc8000000 +.long 0x6e593737, 0x37000000, 0xdab76d6d, 0x6d000000 +.long 0x018c8d8d, 0x8d000000, 0xb164d5d5, 0xd5000000 +.long 0x9cd24e4e, 0x4e000000, 0x49e0a9a9, 0xa9000000 +.long 0xd8b46c6c, 0x6c000000, 0xacfa5656, 0x56000000 +.long 0xf307f4f4, 0xf4000000, 0xcf25eaea, 0xea000000 +.long 0xcaaf6565, 0x65000000, 0xf48e7a7a, 0x7a000000 +.long 0x47e9aeae, 0xae000000, 0x10180808, 0x08000000 +.long 0x6fd5baba, 0xba000000, 0xf0887878, 0x78000000 +.long 0x4a6f2525, 0x25000000, 0x5c722e2e, 0x2e000000 +.long 0x38241c1c, 0x1c000000, 0x57f1a6a6, 0xa6000000 +.long 0x73c7b4b4, 0xb4000000, 0x9751c6c6, 0xc6000000 +.long 0xcb23e8e8, 0xe8000000, 0xa17cdddd, 0xdd000000 +.long 0xe89c7474, 0x74000000, 0x3e211f1f, 0x1f000000 +.long 0x96dd4b4b, 0x4b000000, 0x61dcbdbd, 0xbd000000 +.long 0x0d868b8b, 0x8b000000, 0x0f858a8a, 0x8a000000 +.long 0xe0907070, 0x70000000, 0x7c423e3e, 0x3e000000 +.long 0x71c4b5b5, 0xb5000000, 0xccaa6666, 0x66000000 +.long 0x90d84848, 0x48000000, 0x06050303, 0x03000000 +.long 0xf701f6f6, 0xf6000000, 0x1c120e0e, 0x0e000000 +.long 0xc2a36161, 0x61000000, 0x6a5f3535, 0x35000000 +.long 0xaef95757, 0x57000000, 0x69d0b9b9, 0xb9000000 +.long 0x17918686, 0x86000000, 0x9958c1c1, 0xc1000000 +.long 0x3a271d1d, 0x1d000000, 0x27b99e9e, 0x9e000000 +.long 0xd938e1e1, 0xe1000000, 0xeb13f8f8, 0xf8000000 +.long 0x2bb39898, 0x98000000, 0x22331111, 0x11000000 +.long 0xd2bb6969, 0x69000000, 0xa970d9d9, 0xd9000000 +.long 0x07898e8e, 0x8e000000, 0x33a79494, 0x94000000 +.long 0x2db69b9b, 0x9b000000, 0x3c221e1e, 0x1e000000 +.long 0x15928787, 0x87000000, 0xc920e9e9, 0xe9000000 +.long 0x8749cece, 0xce000000, 0xaaff5555, 0x55000000 +.long 0x50782828, 0x28000000, 0xa57adfdf, 0xdf000000 +.long 0x038f8c8c, 0x8c000000, 0x59f8a1a1, 0xa1000000 +.long 0x09808989, 0x89000000, 0x1a170d0d, 0x0d000000 +.long 0x65dabfbf, 0xbf000000, 0xd731e6e6, 0xe6000000 +.long 0x84c64242, 0x42000000, 0xd0b86868, 0x68000000 +.long 0x82c34141, 0x41000000, 0x29b09999, 0x99000000 +.long 0x5a772d2d, 0x2d000000, 0x1e110f0f, 0x0f000000 +.long 0x7bcbb0b0, 0xb0000000, 0xa8fc5454, 0x54000000 +.long 0x6dd6bbbb, 0xbb000000, 0x2c3a1616, 0x16000000 + +/* Decryption tables */ +.LtableD0: +.long 0x50a7f451 +.LtableDs0: +.long 0x00000052, 0x5365417e, 0x00000009 +.long 0xc3a4171a, 0x0000006a, 0x965e273a, 0x000000d5 +.long 0xcb6bab3b, 0x00000030, 0xf1459d1f, 0x00000036 +.long 0xab58faac, 0x000000a5, 0x9303e34b, 0x00000038 +.long 0x55fa3020, 0x000000bf, 0xf66d76ad, 0x00000040 +.long 0x9176cc88, 0x000000a3, 0x254c02f5, 0x0000009e +.long 0xfcd7e54f, 0x00000081, 0xd7cb2ac5, 0x000000f3 +.long 0x80443526, 0x000000d7, 0x8fa362b5, 0x000000fb +.long 0x495ab1de, 0x0000007c, 0x671bba25, 0x000000e3 +.long 0x980eea45, 0x00000039, 0xe1c0fe5d, 0x00000082 +.long 0x02752fc3, 0x0000009b, 0x12f04c81, 0x0000002f +.long 0xa397468d, 0x000000ff, 0xc6f9d36b, 0x00000087 +.long 0xe75f8f03, 0x00000034, 0x959c9215, 0x0000008e +.long 0xeb7a6dbf, 0x00000043, 0xda595295, 0x00000044 +.long 0x2d83bed4, 0x000000c4, 0xd3217458, 0x000000de +.long 0x2969e049, 0x000000e9, 0x44c8c98e, 0x000000cb +.long 0x6a89c275, 0x00000054, 0x78798ef4, 0x0000007b +.long 0x6b3e5899, 0x00000094, 0xdd71b927, 0x00000032 +.long 0xb64fe1be, 0x000000a6, 0x17ad88f0, 0x000000c2 +.long 0x66ac20c9, 0x00000023, 0xb43ace7d, 0x0000003d +.long 0x184adf63, 0x000000ee, 0x82311ae5, 0x0000004c +.long 0x60335197, 0x00000095, 0x457f5362, 0x0000000b +.long 0xe07764b1, 0x00000042, 0x84ae6bbb, 0x000000fa +.long 0x1ca081fe, 0x000000c3, 0x942b08f9, 0x0000004e +.long 0x58684870, 0x00000008, 0x19fd458f, 0x0000002e +.long 0x876cde94, 0x000000a1, 0xb7f87b52, 0x00000066 +.long 0x23d373ab, 0x00000028, 0xe2024b72, 0x000000d9 +.long 0x578f1fe3, 0x00000024, 0x2aab5566, 0x000000b2 +.long 0x0728ebb2, 0x00000076, 0x03c2b52f, 0x0000005b +.long 0x9a7bc586, 0x000000a2, 0xa50837d3, 0x00000049 +.long 0xf2872830, 0x0000006d, 0xb2a5bf23, 0x0000008b +.long 0xba6a0302, 0x000000d1, 0x5c8216ed, 0x00000025 +.long 0x2b1ccf8a, 0x00000072, 0x92b479a7, 0x000000f8 +.long 0xf0f207f3, 0x000000f6, 0xa1e2694e, 0x00000064 +.long 0xcdf4da65, 0x00000086, 0xd5be0506, 0x00000068 +.long 0x1f6234d1, 0x00000098, 0x8afea6c4, 0x00000016 +.long 0x9d532e34, 0x000000d4, 0xa055f3a2, 0x000000a4 +.long 0x32e18a05, 0x0000005c, 0x75ebf6a4, 0x000000cc +.long 0x39ec830b, 0x0000005d, 0xaaef6040, 0x00000065 +.long 0x069f715e, 0x000000b6, 0x51106ebd, 0x00000092 +.long 0xf98a213e, 0x0000006c, 0x3d06dd96, 0x00000070 +.long 0xae053edd, 0x00000048, 0x46bde64d, 0x00000050 +.long 0xb58d5491, 0x000000fd, 0x055dc471, 0x000000ed +.long 0x6fd40604, 0x000000b9, 0xff155060, 0x000000da +.long 0x24fb9819, 0x0000005e, 0x97e9bdd6, 0x00000015 +.long 0xcc434089, 0x00000046, 0x779ed967, 0x00000057 +.long 0xbd42e8b0, 0x000000a7, 0x888b8907, 0x0000008d +.long 0x385b19e7, 0x0000009d, 0xdbeec879, 0x00000084 +.long 0x470a7ca1, 0x00000090, 0xe90f427c, 0x000000d8 +.long 0xc91e84f8, 0x000000ab, 0x00000000, 0x00000000 +.long 0x83868009, 0x0000008c, 0x48ed2b32, 0x000000bc +.long 0xac70111e, 0x000000d3, 0x4e725a6c, 0x0000000a +.long 0xfbff0efd, 0x000000f7, 0x5638850f, 0x000000e4 +.long 0x1ed5ae3d, 0x00000058, 0x27392d36, 0x00000005 +.long 0x64d90f0a, 0x000000b8, 0x21a65c68, 0x000000b3 +.long 0xd1545b9b, 0x00000045, 0x3a2e3624, 0x00000006 +.long 0xb1670a0c, 0x000000d0, 0x0fe75793, 0x0000002c +.long 0xd296eeb4, 0x0000001e, 0x9e919b1b, 0x0000008f +.long 0x4fc5c080, 0x000000ca, 0xa220dc61, 0x0000003f +.long 0x694b775a, 0x0000000f, 0x161a121c, 0x00000002 +.long 0x0aba93e2, 0x000000c1, 0xe52aa0c0, 0x000000af +.long 0x43e0223c, 0x000000bd, 0x1d171b12, 0x00000003 +.long 0x0b0d090e, 0x00000001, 0xadc78bf2, 0x00000013 +.long 0xb9a8b62d, 0x0000008a, 0xc8a91e14, 0x0000006b +.long 0x8519f157, 0x0000003a, 0x4c0775af, 0x00000091 +.long 0xbbdd99ee, 0x00000011, 0xfd607fa3, 0x00000041 +.long 0x9f2601f7, 0x0000004f, 0xbcf5725c, 0x00000067 +.long 0xc53b6644, 0x000000dc, 0x347efb5b, 0x000000ea +.long 0x7629438b, 0x00000097, 0xdcc623cb, 0x000000f2 +.long 0x68fcedb6, 0x000000cf, 0x63f1e4b8, 0x000000ce +.long 0xcadc31d7, 0x000000f0, 0x10856342, 0x000000b4 +.long 0x40229713, 0x000000e6, 0x2011c684, 0x00000073 +.long 0x7d244a85, 0x00000096, 0xf83dbbd2, 0x000000ac +.long 0x1132f9ae, 0x00000074, 0x6da129c7, 0x00000022 +.long 0x4b2f9e1d, 0x000000e7, 0xf330b2dc, 0x000000ad +.long 0xec52860d, 0x00000035, 0xd0e3c177, 0x00000085 +.long 0x6c16b32b, 0x000000e2, 0x99b970a9, 0x000000f9 +.long 0xfa489411, 0x00000037, 0x2264e947, 0x000000e8 +.long 0xc48cfca8, 0x0000001c, 0x1a3ff0a0, 0x00000075 +.long 0xd82c7d56, 0x000000df, 0xef903322, 0x0000006e +.long 0xc74e4987, 0x00000047, 0xc1d138d9, 0x000000f1 +.long 0xfea2ca8c, 0x0000001a, 0x360bd498, 0x00000071 +.long 0xcf81f5a6, 0x0000001d, 0x28de7aa5, 0x00000029 +.long 0x268eb7da, 0x000000c5, 0xa4bfad3f, 0x00000089 +.long 0xe49d3a2c, 0x0000006f, 0x0d927850, 0x000000b7 +.long 0x9bcc5f6a, 0x00000062, 0x62467e54, 0x0000000e +.long 0xc2138df6, 0x000000aa, 0xe8b8d890, 0x00000018 +.long 0x5ef7392e, 0x000000be, 0xf5afc382, 0x0000001b +.long 0xbe805d9f, 0x000000fc, 0x7c93d069, 0x00000056 +.long 0xa92dd56f, 0x0000003e, 0xb31225cf, 0x0000004b +.long 0x3b99acc8, 0x000000c6, 0xa77d1810, 0x000000d2 +.long 0x6e639ce8, 0x00000079, 0x7bbb3bdb, 0x00000020 +.long 0x097826cd, 0x0000009a, 0xf418596e, 0x000000db +.long 0x01b79aec, 0x000000c0, 0xa89a4f83, 0x000000fe +.long 0x656e95e6, 0x00000078, 0x7ee6ffaa, 0x000000cd +.long 0x08cfbc21, 0x0000005a, 0xe6e815ef, 0x000000f4 +.long 0xd99be7ba, 0x0000001f, 0xce366f4a, 0x000000dd +.long 0xd4099fea, 0x000000a8, 0xd67cb029, 0x00000033 +.long 0xafb2a431, 0x00000088, 0x31233f2a, 0x00000007 +.long 0x3094a5c6, 0x000000c7, 0xc066a235, 0x00000031 +.long 0x37bc4e74, 0x000000b1, 0xa6ca82fc, 0x00000012 +.long 0xb0d090e0, 0x00000010, 0x15d8a733, 0x00000059 +.long 0x4a9804f1, 0x00000027, 0xf7daec41, 0x00000080 +.long 0x0e50cd7f, 0x000000ec, 0x2ff69117, 0x0000005f +.long 0x8dd64d76, 0x00000060, 0x4db0ef43, 0x00000051 +.long 0x544daacc, 0x0000007f, 0xdf0496e4, 0x000000a9 +.long 0xe3b5d19e, 0x00000019, 0x1b886a4c, 0x000000b5 +.long 0xb81f2cc1, 0x0000004a, 0x7f516546, 0x0000000d +.long 0x04ea5e9d, 0x0000002d, 0x5d358c01, 0x000000e5 +.long 0x737487fa, 0x0000007a, 0x2e410bfb, 0x0000009f +.long 0x5a1d67b3, 0x00000093, 0x52d2db92, 0x000000c9 +.long 0x335610e9, 0x0000009c, 0x1347d66d, 0x000000ef +.long 0x8c61d79a, 0x000000a0, 0x7a0ca137, 0x000000e0 +.long 0x8e14f859, 0x0000003b, 0x893c13eb, 0x0000004d +.long 0xee27a9ce, 0x000000ae, 0x35c961b7, 0x0000002a +.long 0xede51ce1, 0x000000f5, 0x3cb1477a, 0x000000b0 +.long 0x59dfd29c, 0x000000c8, 0x3f73f255, 0x000000eb +.long 0x79ce1418, 0x000000bb, 0xbf37c773, 0x0000003c +.long 0xeacdf753, 0x00000083, 0x5baafd5f, 0x00000053 +.long 0x146f3ddf, 0x00000099, 0x86db4478, 0x00000061 +.long 0x81f3afca, 0x00000017, 0x3ec468b9, 0x0000002b +.long 0x2c342438, 0x00000004, 0x5f40a3c2, 0x0000007e +.long 0x72c31d16, 0x000000ba, 0x0c25e2bc, 0x00000077 +.long 0x8b493c28, 0x000000d6, 0x41950dff, 0x00000026 +.long 0x7101a839, 0x000000e1, 0xdeb30c08, 0x00000069 +.long 0x9ce4b4d8, 0x00000014, 0x90c15664, 0x00000063 +.long 0x6184cb7b, 0x00000055, 0x70b632d5, 0x00000021 +.long 0x745c6c48, 0x0000000c, 0x4257b8d0, 0x0000007d +.LtableD1: +.long 0xa7f45150 +.LtableDs1: +.long 0x00005200, 0x65417e53, 0x00000900 +.long 0xa4171ac3, 0x00006a00, 0x5e273a96, 0x0000d500 +.long 0x6bab3bcb, 0x00003000, 0x459d1ff1, 0x00003600 +.long 0x58faacab, 0x0000a500, 0x03e34b93, 0x00003800 +.long 0xfa302055, 0x0000bf00, 0x6d76adf6, 0x00004000 +.long 0x76cc8891, 0x0000a300, 0x4c02f525, 0x00009e00 +.long 0xd7e54ffc, 0x00008100, 0xcb2ac5d7, 0x0000f300 +.long 0x44352680, 0x0000d700, 0xa362b58f, 0x0000fb00 +.long 0x5ab1de49, 0x00007c00, 0x1bba2567, 0x0000e300 +.long 0x0eea4598, 0x00003900, 0xc0fe5de1, 0x00008200 +.long 0x752fc302, 0x00009b00, 0xf04c8112, 0x00002f00 +.long 0x97468da3, 0x0000ff00, 0xf9d36bc6, 0x00008700 +.long 0x5f8f03e7, 0x00003400, 0x9c921595, 0x00008e00 +.long 0x7a6dbfeb, 0x00004300, 0x595295da, 0x00004400 +.long 0x83bed42d, 0x0000c400, 0x217458d3, 0x0000de00 +.long 0x69e04929, 0x0000e900, 0xc8c98e44, 0x0000cb00 +.long 0x89c2756a, 0x00005400, 0x798ef478, 0x00007b00 +.long 0x3e58996b, 0x00009400, 0x71b927dd, 0x00003200 +.long 0x4fe1beb6, 0x0000a600, 0xad88f017, 0x0000c200 +.long 0xac20c966, 0x00002300, 0x3ace7db4, 0x00003d00 +.long 0x4adf6318, 0x0000ee00, 0x311ae582, 0x00004c00 +.long 0x33519760, 0x00009500, 0x7f536245, 0x00000b00 +.long 0x7764b1e0, 0x00004200, 0xae6bbb84, 0x0000fa00 +.long 0xa081fe1c, 0x0000c300, 0x2b08f994, 0x00004e00 +.long 0x68487058, 0x00000800, 0xfd458f19, 0x00002e00 +.long 0x6cde9487, 0x0000a100, 0xf87b52b7, 0x00006600 +.long 0xd373ab23, 0x00002800, 0x024b72e2, 0x0000d900 +.long 0x8f1fe357, 0x00002400, 0xab55662a, 0x0000b200 +.long 0x28ebb207, 0x00007600, 0xc2b52f03, 0x00005b00 +.long 0x7bc5869a, 0x0000a200, 0x0837d3a5, 0x00004900 +.long 0x872830f2, 0x00006d00, 0xa5bf23b2, 0x00008b00 +.long 0x6a0302ba, 0x0000d100, 0x8216ed5c, 0x00002500 +.long 0x1ccf8a2b, 0x00007200, 0xb479a792, 0x0000f800 +.long 0xf207f3f0, 0x0000f600, 0xe2694ea1, 0x00006400 +.long 0xf4da65cd, 0x00008600, 0xbe0506d5, 0x00006800 +.long 0x6234d11f, 0x00009800, 0xfea6c48a, 0x00001600 +.long 0x532e349d, 0x0000d400, 0x55f3a2a0, 0x0000a400 +.long 0xe18a0532, 0x00005c00, 0xebf6a475, 0x0000cc00 +.long 0xec830b39, 0x00005d00, 0xef6040aa, 0x00006500 +.long 0x9f715e06, 0x0000b600, 0x106ebd51, 0x00009200 +.long 0x8a213ef9, 0x00006c00, 0x06dd963d, 0x00007000 +.long 0x053eddae, 0x00004800, 0xbde64d46, 0x00005000 +.long 0x8d5491b5, 0x0000fd00, 0x5dc47105, 0x0000ed00 +.long 0xd406046f, 0x0000b900, 0x155060ff, 0x0000da00 +.long 0xfb981924, 0x00005e00, 0xe9bdd697, 0x00001500 +.long 0x434089cc, 0x00004600, 0x9ed96777, 0x00005700 +.long 0x42e8b0bd, 0x0000a700, 0x8b890788, 0x00008d00 +.long 0x5b19e738, 0x00009d00, 0xeec879db, 0x00008400 +.long 0x0a7ca147, 0x00009000, 0x0f427ce9, 0x0000d800 +.long 0x1e84f8c9, 0x0000ab00, 0x00000000, 0x00000000 +.long 0x86800983, 0x00008c00, 0xed2b3248, 0x0000bc00 +.long 0x70111eac, 0x0000d300, 0x725a6c4e, 0x00000a00 +.long 0xff0efdfb, 0x0000f700, 0x38850f56, 0x0000e400 +.long 0xd5ae3d1e, 0x00005800, 0x392d3627, 0x00000500 +.long 0xd90f0a64, 0x0000b800, 0xa65c6821, 0x0000b300 +.long 0x545b9bd1, 0x00004500, 0x2e36243a, 0x00000600 +.long 0x670a0cb1, 0x0000d000, 0xe757930f, 0x00002c00 +.long 0x96eeb4d2, 0x00001e00, 0x919b1b9e, 0x00008f00 +.long 0xc5c0804f, 0x0000ca00, 0x20dc61a2, 0x00003f00 +.long 0x4b775a69, 0x00000f00, 0x1a121c16, 0x00000200 +.long 0xba93e20a, 0x0000c100, 0x2aa0c0e5, 0x0000af00 +.long 0xe0223c43, 0x0000bd00, 0x171b121d, 0x00000300 +.long 0x0d090e0b, 0x00000100, 0xc78bf2ad, 0x00001300 +.long 0xa8b62db9, 0x00008a00, 0xa91e14c8, 0x00006b00 +.long 0x19f15785, 0x00003a00, 0x0775af4c, 0x00009100 +.long 0xdd99eebb, 0x00001100, 0x607fa3fd, 0x00004100 +.long 0x2601f79f, 0x00004f00, 0xf5725cbc, 0x00006700 +.long 0x3b6644c5, 0x0000dc00, 0x7efb5b34, 0x0000ea00 +.long 0x29438b76, 0x00009700, 0xc623cbdc, 0x0000f200 +.long 0xfcedb668, 0x0000cf00, 0xf1e4b863, 0x0000ce00 +.long 0xdc31d7ca, 0x0000f000, 0x85634210, 0x0000b400 +.long 0x22971340, 0x0000e600, 0x11c68420, 0x00007300 +.long 0x244a857d, 0x00009600, 0x3dbbd2f8, 0x0000ac00 +.long 0x32f9ae11, 0x00007400, 0xa129c76d, 0x00002200 +.long 0x2f9e1d4b, 0x0000e700, 0x30b2dcf3, 0x0000ad00 +.long 0x52860dec, 0x00003500, 0xe3c177d0, 0x00008500 +.long 0x16b32b6c, 0x0000e200, 0xb970a999, 0x0000f900 +.long 0x489411fa, 0x00003700, 0x64e94722, 0x0000e800 +.long 0x8cfca8c4, 0x00001c00, 0x3ff0a01a, 0x00007500 +.long 0x2c7d56d8, 0x0000df00, 0x903322ef, 0x00006e00 +.long 0x4e4987c7, 0x00004700, 0xd138d9c1, 0x0000f100 +.long 0xa2ca8cfe, 0x00001a00, 0x0bd49836, 0x00007100 +.long 0x81f5a6cf, 0x00001d00, 0xde7aa528, 0x00002900 +.long 0x8eb7da26, 0x0000c500, 0xbfad3fa4, 0x00008900 +.long 0x9d3a2ce4, 0x00006f00, 0x9278500d, 0x0000b700 +.long 0xcc5f6a9b, 0x00006200, 0x467e5462, 0x00000e00 +.long 0x138df6c2, 0x0000aa00, 0xb8d890e8, 0x00001800 +.long 0xf7392e5e, 0x0000be00, 0xafc382f5, 0x00001b00 +.long 0x805d9fbe, 0x0000fc00, 0x93d0697c, 0x00005600 +.long 0x2dd56fa9, 0x00003e00, 0x1225cfb3, 0x00004b00 +.long 0x99acc83b, 0x0000c600, 0x7d1810a7, 0x0000d200 +.long 0x639ce86e, 0x00007900, 0xbb3bdb7b, 0x00002000 +.long 0x7826cd09, 0x00009a00, 0x18596ef4, 0x0000db00 +.long 0xb79aec01, 0x0000c000, 0x9a4f83a8, 0x0000fe00 +.long 0x6e95e665, 0x00007800, 0xe6ffaa7e, 0x0000cd00 +.long 0xcfbc2108, 0x00005a00, 0xe815efe6, 0x0000f400 +.long 0x9be7bad9, 0x00001f00, 0x366f4ace, 0x0000dd00 +.long 0x099fead4, 0x0000a800, 0x7cb029d6, 0x00003300 +.long 0xb2a431af, 0x00008800, 0x233f2a31, 0x00000700 +.long 0x94a5c630, 0x0000c700, 0x66a235c0, 0x00003100 +.long 0xbc4e7437, 0x0000b100, 0xca82fca6, 0x00001200 +.long 0xd090e0b0, 0x00001000, 0xd8a73315, 0x00005900 +.long 0x9804f14a, 0x00002700, 0xdaec41f7, 0x00008000 +.long 0x50cd7f0e, 0x0000ec00, 0xf691172f, 0x00005f00 +.long 0xd64d768d, 0x00006000, 0xb0ef434d, 0x00005100 +.long 0x4daacc54, 0x00007f00, 0x0496e4df, 0x0000a900 +.long 0xb5d19ee3, 0x00001900, 0x886a4c1b, 0x0000b500 +.long 0x1f2cc1b8, 0x00004a00, 0x5165467f, 0x00000d00 +.long 0xea5e9d04, 0x00002d00, 0x358c015d, 0x0000e500 +.long 0x7487fa73, 0x00007a00, 0x410bfb2e, 0x00009f00 +.long 0x1d67b35a, 0x00009300, 0xd2db9252, 0x0000c900 +.long 0x5610e933, 0x00009c00, 0x47d66d13, 0x0000ef00 +.long 0x61d79a8c, 0x0000a000, 0x0ca1377a, 0x0000e000 +.long 0x14f8598e, 0x00003b00, 0x3c13eb89, 0x00004d00 +.long 0x27a9ceee, 0x0000ae00, 0xc961b735, 0x00002a00 +.long 0xe51ce1ed, 0x0000f500, 0xb1477a3c, 0x0000b000 +.long 0xdfd29c59, 0x0000c800, 0x73f2553f, 0x0000eb00 +.long 0xce141879, 0x0000bb00, 0x37c773bf, 0x00003c00 +.long 0xcdf753ea, 0x00008300, 0xaafd5f5b, 0x00005300 +.long 0x6f3ddf14, 0x00009900, 0xdb447886, 0x00006100 +.long 0xf3afca81, 0x00001700, 0xc468b93e, 0x00002b00 +.long 0x3424382c, 0x00000400, 0x40a3c25f, 0x00007e00 +.long 0xc31d1672, 0x0000ba00, 0x25e2bc0c, 0x00007700 +.long 0x493c288b, 0x0000d600, 0x950dff41, 0x00002600 +.long 0x01a83971, 0x0000e100, 0xb30c08de, 0x00006900 +.long 0xe4b4d89c, 0x00001400, 0xc1566490, 0x00006300 +.long 0x84cb7b61, 0x00005500, 0xb632d570, 0x00002100 +.long 0x5c6c4874, 0x00000c00, 0x57b8d042, 0x00007d00 +.LtableD2: +.long 0xf45150a7 +.LtableDs2: +.long 0x00520000, 0x417e5365, 0x00090000 +.long 0x171ac3a4, 0x006a0000, 0x273a965e, 0x00d50000 +.long 0xab3bcb6b, 0x00300000, 0x9d1ff145, 0x00360000 +.long 0xfaacab58, 0x00a50000, 0xe34b9303, 0x00380000 +.long 0x302055fa, 0x00bf0000, 0x76adf66d, 0x00400000 +.long 0xcc889176, 0x00a30000, 0x02f5254c, 0x009e0000 +.long 0xe54ffcd7, 0x00810000, 0x2ac5d7cb, 0x00f30000 +.long 0x35268044, 0x00d70000, 0x62b58fa3, 0x00fb0000 +.long 0xb1de495a, 0x007c0000, 0xba25671b, 0x00e30000 +.long 0xea45980e, 0x00390000, 0xfe5de1c0, 0x00820000 +.long 0x2fc30275, 0x009b0000, 0x4c8112f0, 0x002f0000 +.long 0x468da397, 0x00ff0000, 0xd36bc6f9, 0x00870000 +.long 0x8f03e75f, 0x00340000, 0x9215959c, 0x008e0000 +.long 0x6dbfeb7a, 0x00430000, 0x5295da59, 0x00440000 +.long 0xbed42d83, 0x00c40000, 0x7458d321, 0x00de0000 +.long 0xe0492969, 0x00e90000, 0xc98e44c8, 0x00cb0000 +.long 0xc2756a89, 0x00540000, 0x8ef47879, 0x007b0000 +.long 0x58996b3e, 0x00940000, 0xb927dd71, 0x00320000 +.long 0xe1beb64f, 0x00a60000, 0x88f017ad, 0x00c20000 +.long 0x20c966ac, 0x00230000, 0xce7db43a, 0x003d0000 +.long 0xdf63184a, 0x00ee0000, 0x1ae58231, 0x004c0000 +.long 0x51976033, 0x00950000, 0x5362457f, 0x000b0000 +.long 0x64b1e077, 0x00420000, 0x6bbb84ae, 0x00fa0000 +.long 0x81fe1ca0, 0x00c30000, 0x08f9942b, 0x004e0000 +.long 0x48705868, 0x00080000, 0x458f19fd, 0x002e0000 +.long 0xde94876c, 0x00a10000, 0x7b52b7f8, 0x00660000 +.long 0x73ab23d3, 0x00280000, 0x4b72e202, 0x00d90000 +.long 0x1fe3578f, 0x00240000, 0x55662aab, 0x00b20000 +.long 0xebb20728, 0x00760000, 0xb52f03c2, 0x005b0000 +.long 0xc5869a7b, 0x00a20000, 0x37d3a508, 0x00490000 +.long 0x2830f287, 0x006d0000, 0xbf23b2a5, 0x008b0000 +.long 0x0302ba6a, 0x00d10000, 0x16ed5c82, 0x00250000 +.long 0xcf8a2b1c, 0x00720000, 0x79a792b4, 0x00f80000 +.long 0x07f3f0f2, 0x00f60000, 0x694ea1e2, 0x00640000 +.long 0xda65cdf4, 0x00860000, 0x0506d5be, 0x00680000 +.long 0x34d11f62, 0x00980000, 0xa6c48afe, 0x00160000 +.long 0x2e349d53, 0x00d40000, 0xf3a2a055, 0x00a40000 +.long 0x8a0532e1, 0x005c0000, 0xf6a475eb, 0x00cc0000 +.long 0x830b39ec, 0x005d0000, 0x6040aaef, 0x00650000 +.long 0x715e069f, 0x00b60000, 0x6ebd5110, 0x00920000 +.long 0x213ef98a, 0x006c0000, 0xdd963d06, 0x00700000 +.long 0x3eddae05, 0x00480000, 0xe64d46bd, 0x00500000 +.long 0x5491b58d, 0x00fd0000, 0xc471055d, 0x00ed0000 +.long 0x06046fd4, 0x00b90000, 0x5060ff15, 0x00da0000 +.long 0x981924fb, 0x005e0000, 0xbdd697e9, 0x00150000 +.long 0x4089cc43, 0x00460000, 0xd967779e, 0x00570000 +.long 0xe8b0bd42, 0x00a70000, 0x8907888b, 0x008d0000 +.long 0x19e7385b, 0x009d0000, 0xc879dbee, 0x00840000 +.long 0x7ca1470a, 0x00900000, 0x427ce90f, 0x00d80000 +.long 0x84f8c91e, 0x00ab0000, 0x00000000, 0x00000000 +.long 0x80098386, 0x008c0000, 0x2b3248ed, 0x00bc0000 +.long 0x111eac70, 0x00d30000, 0x5a6c4e72, 0x000a0000 +.long 0x0efdfbff, 0x00f70000, 0x850f5638, 0x00e40000 +.long 0xae3d1ed5, 0x00580000, 0x2d362739, 0x00050000 +.long 0x0f0a64d9, 0x00b80000, 0x5c6821a6, 0x00b30000 +.long 0x5b9bd154, 0x00450000, 0x36243a2e, 0x00060000 +.long 0x0a0cb167, 0x00d00000, 0x57930fe7, 0x002c0000 +.long 0xeeb4d296, 0x001e0000, 0x9b1b9e91, 0x008f0000 +.long 0xc0804fc5, 0x00ca0000, 0xdc61a220, 0x003f0000 +.long 0x775a694b, 0x000f0000, 0x121c161a, 0x00020000 +.long 0x93e20aba, 0x00c10000, 0xa0c0e52a, 0x00af0000 +.long 0x223c43e0, 0x00bd0000, 0x1b121d17, 0x00030000 +.long 0x090e0b0d, 0x00010000, 0x8bf2adc7, 0x00130000 +.long 0xb62db9a8, 0x008a0000, 0x1e14c8a9, 0x006b0000 +.long 0xf1578519, 0x003a0000, 0x75af4c07, 0x00910000 +.long 0x99eebbdd, 0x00110000, 0x7fa3fd60, 0x00410000 +.long 0x01f79f26, 0x004f0000, 0x725cbcf5, 0x00670000 +.long 0x6644c53b, 0x00dc0000, 0xfb5b347e, 0x00ea0000 +.long 0x438b7629, 0x00970000, 0x23cbdcc6, 0x00f20000 +.long 0xedb668fc, 0x00cf0000, 0xe4b863f1, 0x00ce0000 +.long 0x31d7cadc, 0x00f00000, 0x63421085, 0x00b40000 +.long 0x97134022, 0x00e60000, 0xc6842011, 0x00730000 +.long 0x4a857d24, 0x00960000, 0xbbd2f83d, 0x00ac0000 +.long 0xf9ae1132, 0x00740000, 0x29c76da1, 0x00220000 +.long 0x9e1d4b2f, 0x00e70000, 0xb2dcf330, 0x00ad0000 +.long 0x860dec52, 0x00350000, 0xc177d0e3, 0x00850000 +.long 0xb32b6c16, 0x00e20000, 0x70a999b9, 0x00f90000 +.long 0x9411fa48, 0x00370000, 0xe9472264, 0x00e80000 +.long 0xfca8c48c, 0x001c0000, 0xf0a01a3f, 0x00750000 +.long 0x7d56d82c, 0x00df0000, 0x3322ef90, 0x006e0000 +.long 0x4987c74e, 0x00470000, 0x38d9c1d1, 0x00f10000 +.long 0xca8cfea2, 0x001a0000, 0xd498360b, 0x00710000 +.long 0xf5a6cf81, 0x001d0000, 0x7aa528de, 0x00290000 +.long 0xb7da268e, 0x00c50000, 0xad3fa4bf, 0x00890000 +.long 0x3a2ce49d, 0x006f0000, 0x78500d92, 0x00b70000 +.long 0x5f6a9bcc, 0x00620000, 0x7e546246, 0x000e0000 +.long 0x8df6c213, 0x00aa0000, 0xd890e8b8, 0x00180000 +.long 0x392e5ef7, 0x00be0000, 0xc382f5af, 0x001b0000 +.long 0x5d9fbe80, 0x00fc0000, 0xd0697c93, 0x00560000 +.long 0xd56fa92d, 0x003e0000, 0x25cfb312, 0x004b0000 +.long 0xacc83b99, 0x00c60000, 0x1810a77d, 0x00d20000 +.long 0x9ce86e63, 0x00790000, 0x3bdb7bbb, 0x00200000 +.long 0x26cd0978, 0x009a0000, 0x596ef418, 0x00db0000 +.long 0x9aec01b7, 0x00c00000, 0x4f83a89a, 0x00fe0000 +.long 0x95e6656e, 0x00780000, 0xffaa7ee6, 0x00cd0000 +.long 0xbc2108cf, 0x005a0000, 0x15efe6e8, 0x00f40000 +.long 0xe7bad99b, 0x001f0000, 0x6f4ace36, 0x00dd0000 +.long 0x9fead409, 0x00a80000, 0xb029d67c, 0x00330000 +.long 0xa431afb2, 0x00880000, 0x3f2a3123, 0x00070000 +.long 0xa5c63094, 0x00c70000, 0xa235c066, 0x00310000 +.long 0x4e7437bc, 0x00b10000, 0x82fca6ca, 0x00120000 +.long 0x90e0b0d0, 0x00100000, 0xa73315d8, 0x00590000 +.long 0x04f14a98, 0x00270000, 0xec41f7da, 0x00800000 +.long 0xcd7f0e50, 0x00ec0000, 0x91172ff6, 0x005f0000 +.long 0x4d768dd6, 0x00600000, 0xef434db0, 0x00510000 +.long 0xaacc544d, 0x007f0000, 0x96e4df04, 0x00a90000 +.long 0xd19ee3b5, 0x00190000, 0x6a4c1b88, 0x00b50000 +.long 0x2cc1b81f, 0x004a0000, 0x65467f51, 0x000d0000 +.long 0x5e9d04ea, 0x002d0000, 0x8c015d35, 0x00e50000 +.long 0x87fa7374, 0x007a0000, 0x0bfb2e41, 0x009f0000 +.long 0x67b35a1d, 0x00930000, 0xdb9252d2, 0x00c90000 +.long 0x10e93356, 0x009c0000, 0xd66d1347, 0x00ef0000 +.long 0xd79a8c61, 0x00a00000, 0xa1377a0c, 0x00e00000 +.long 0xf8598e14, 0x003b0000, 0x13eb893c, 0x004d0000 +.long 0xa9ceee27, 0x00ae0000, 0x61b735c9, 0x002a0000 +.long 0x1ce1ede5, 0x00f50000, 0x477a3cb1, 0x00b00000 +.long 0xd29c59df, 0x00c80000, 0xf2553f73, 0x00eb0000 +.long 0x141879ce, 0x00bb0000, 0xc773bf37, 0x003c0000 +.long 0xf753eacd, 0x00830000, 0xfd5f5baa, 0x00530000 +.long 0x3ddf146f, 0x00990000, 0x447886db, 0x00610000 +.long 0xafca81f3, 0x00170000, 0x68b93ec4, 0x002b0000 +.long 0x24382c34, 0x00040000, 0xa3c25f40, 0x007e0000 +.long 0x1d1672c3, 0x00ba0000, 0xe2bc0c25, 0x00770000 +.long 0x3c288b49, 0x00d60000, 0x0dff4195, 0x00260000 +.long 0xa8397101, 0x00e10000, 0x0c08deb3, 0x00690000 +.long 0xb4d89ce4, 0x00140000, 0x566490c1, 0x00630000 +.long 0xcb7b6184, 0x00550000, 0x32d570b6, 0x00210000 +.long 0x6c48745c, 0x000c0000, 0xb8d04257, 0x007d0000 +.LtableD3: +.long 0x5150a7f4 +.LtableDs3: +.long 0x52000000, 0x7e536541, 0x09000000 +.long 0x1ac3a417, 0x6a000000, 0x3a965e27, 0xd5000000 +.long 0x3bcb6bab, 0x30000000, 0x1ff1459d, 0x36000000 +.long 0xacab58fa, 0xa5000000, 0x4b9303e3, 0x38000000 +.long 0x2055fa30, 0xbf000000, 0xadf66d76, 0x40000000 +.long 0x889176cc, 0xa3000000, 0xf5254c02, 0x9e000000 +.long 0x4ffcd7e5, 0x81000000, 0xc5d7cb2a, 0xf3000000 +.long 0x26804435, 0xd7000000, 0xb58fa362, 0xfb000000 +.long 0xde495ab1, 0x7c000000, 0x25671bba, 0xe3000000 +.long 0x45980eea, 0x39000000, 0x5de1c0fe, 0x82000000 +.long 0xc302752f, 0x9b000000, 0x8112f04c, 0x2f000000 +.long 0x8da39746, 0xff000000, 0x6bc6f9d3, 0x87000000 +.long 0x03e75f8f, 0x34000000, 0x15959c92, 0x8e000000 +.long 0xbfeb7a6d, 0x43000000, 0x95da5952, 0x44000000 +.long 0xd42d83be, 0xc4000000, 0x58d32174, 0xde000000 +.long 0x492969e0, 0xe9000000, 0x8e44c8c9, 0xcb000000 +.long 0x756a89c2, 0x54000000, 0xf478798e, 0x7b000000 +.long 0x996b3e58, 0x94000000, 0x27dd71b9, 0x32000000 +.long 0xbeb64fe1, 0xa6000000, 0xf017ad88, 0xc2000000 +.long 0xc966ac20, 0x23000000, 0x7db43ace, 0x3d000000 +.long 0x63184adf, 0xee000000, 0xe582311a, 0x4c000000 +.long 0x97603351, 0x95000000, 0x62457f53, 0x0b000000 +.long 0xb1e07764, 0x42000000, 0xbb84ae6b, 0xfa000000 +.long 0xfe1ca081, 0xc3000000, 0xf9942b08, 0x4e000000 +.long 0x70586848, 0x08000000, 0x8f19fd45, 0x2e000000 +.long 0x94876cde, 0xa1000000, 0x52b7f87b, 0x66000000 +.long 0xab23d373, 0x28000000, 0x72e2024b, 0xd9000000 +.long 0xe3578f1f, 0x24000000, 0x662aab55, 0xb2000000 +.long 0xb20728eb, 0x76000000, 0x2f03c2b5, 0x5b000000 +.long 0x869a7bc5, 0xa2000000, 0xd3a50837, 0x49000000 +.long 0x30f28728, 0x6d000000, 0x23b2a5bf, 0x8b000000 +.long 0x02ba6a03, 0xd1000000, 0xed5c8216, 0x25000000 +.long 0x8a2b1ccf, 0x72000000, 0xa792b479, 0xf8000000 +.long 0xf3f0f207, 0xf6000000, 0x4ea1e269, 0x64000000 +.long 0x65cdf4da, 0x86000000, 0x06d5be05, 0x68000000 +.long 0xd11f6234, 0x98000000, 0xc48afea6, 0x16000000 +.long 0x349d532e, 0xd4000000, 0xa2a055f3, 0xa4000000 +.long 0x0532e18a, 0x5c000000, 0xa475ebf6, 0xcc000000 +.long 0x0b39ec83, 0x5d000000, 0x40aaef60, 0x65000000 +.long 0x5e069f71, 0xb6000000, 0xbd51106e, 0x92000000 +.long 0x3ef98a21, 0x6c000000, 0x963d06dd, 0x70000000 +.long 0xddae053e, 0x48000000, 0x4d46bde6, 0x50000000 +.long 0x91b58d54, 0xfd000000, 0x71055dc4, 0xed000000 +.long 0x046fd406, 0xb9000000, 0x60ff1550, 0xda000000 +.long 0x1924fb98, 0x5e000000, 0xd697e9bd, 0x15000000 +.long 0x89cc4340, 0x46000000, 0x67779ed9, 0x57000000 +.long 0xb0bd42e8, 0xa7000000, 0x07888b89, 0x8d000000 +.long 0xe7385b19, 0x9d000000, 0x79dbeec8, 0x84000000 +.long 0xa1470a7c, 0x90000000, 0x7ce90f42, 0xd8000000 +.long 0xf8c91e84, 0xab000000, 0x00000000, 0x00000000 +.long 0x09838680, 0x8c000000, 0x3248ed2b, 0xbc000000 +.long 0x1eac7011, 0xd3000000, 0x6c4e725a, 0x0a000000 +.long 0xfdfbff0e, 0xf7000000, 0x0f563885, 0xe4000000 +.long 0x3d1ed5ae, 0x58000000, 0x3627392d, 0x05000000 +.long 0x0a64d90f, 0xb8000000, 0x6821a65c, 0xb3000000 +.long 0x9bd1545b, 0x45000000, 0x243a2e36, 0x06000000 +.long 0x0cb1670a, 0xd0000000, 0x930fe757, 0x2c000000 +.long 0xb4d296ee, 0x1e000000, 0x1b9e919b, 0x8f000000 +.long 0x804fc5c0, 0xca000000, 0x61a220dc, 0x3f000000 +.long 0x5a694b77, 0x0f000000, 0x1c161a12, 0x02000000 +.long 0xe20aba93, 0xc1000000, 0xc0e52aa0, 0xaf000000 +.long 0x3c43e022, 0xbd000000, 0x121d171b, 0x03000000 +.long 0x0e0b0d09, 0x01000000, 0xf2adc78b, 0x13000000 +.long 0x2db9a8b6, 0x8a000000, 0x14c8a91e, 0x6b000000 +.long 0x578519f1, 0x3a000000, 0xaf4c0775, 0x91000000 +.long 0xeebbdd99, 0x11000000, 0xa3fd607f, 0x41000000 +.long 0xf79f2601, 0x4f000000, 0x5cbcf572, 0x67000000 +.long 0x44c53b66, 0xdc000000, 0x5b347efb, 0xea000000 +.long 0x8b762943, 0x97000000, 0xcbdcc623, 0xf2000000 +.long 0xb668fced, 0xcf000000, 0xb863f1e4, 0xce000000 +.long 0xd7cadc31, 0xf0000000, 0x42108563, 0xb4000000 +.long 0x13402297, 0xe6000000, 0x842011c6, 0x73000000 +.long 0x857d244a, 0x96000000, 0xd2f83dbb, 0xac000000 +.long 0xae1132f9, 0x74000000, 0xc76da129, 0x22000000 +.long 0x1d4b2f9e, 0xe7000000, 0xdcf330b2, 0xad000000 +.long 0x0dec5286, 0x35000000, 0x77d0e3c1, 0x85000000 +.long 0x2b6c16b3, 0xe2000000, 0xa999b970, 0xf9000000 +.long 0x11fa4894, 0x37000000, 0x472264e9, 0xe8000000 +.long 0xa8c48cfc, 0x1c000000, 0xa01a3ff0, 0x75000000 +.long 0x56d82c7d, 0xdf000000, 0x22ef9033, 0x6e000000 +.long 0x87c74e49, 0x47000000, 0xd9c1d138, 0xf1000000 +.long 0x8cfea2ca, 0x1a000000, 0x98360bd4, 0x71000000 +.long 0xa6cf81f5, 0x1d000000, 0xa528de7a, 0x29000000 +.long 0xda268eb7, 0xc5000000, 0x3fa4bfad, 0x89000000 +.long 0x2ce49d3a, 0x6f000000, 0x500d9278, 0xb7000000 +.long 0x6a9bcc5f, 0x62000000, 0x5462467e, 0x0e000000 +.long 0xf6c2138d, 0xaa000000, 0x90e8b8d8, 0x18000000 +.long 0x2e5ef739, 0xbe000000, 0x82f5afc3, 0x1b000000 +.long 0x9fbe805d, 0xfc000000, 0x697c93d0, 0x56000000 +.long 0x6fa92dd5, 0x3e000000, 0xcfb31225, 0x4b000000 +.long 0xc83b99ac, 0xc6000000, 0x10a77d18, 0xd2000000 +.long 0xe86e639c, 0x79000000, 0xdb7bbb3b, 0x20000000 +.long 0xcd097826, 0x9a000000, 0x6ef41859, 0xdb000000 +.long 0xec01b79a, 0xc0000000, 0x83a89a4f, 0xfe000000 +.long 0xe6656e95, 0x78000000, 0xaa7ee6ff, 0xcd000000 +.long 0x2108cfbc, 0x5a000000, 0xefe6e815, 0xf4000000 +.long 0xbad99be7, 0x1f000000, 0x4ace366f, 0xdd000000 +.long 0xead4099f, 0xa8000000, 0x29d67cb0, 0x33000000 +.long 0x31afb2a4, 0x88000000, 0x2a31233f, 0x07000000 +.long 0xc63094a5, 0xc7000000, 0x35c066a2, 0x31000000 +.long 0x7437bc4e, 0xb1000000, 0xfca6ca82, 0x12000000 +.long 0xe0b0d090, 0x10000000, 0x3315d8a7, 0x59000000 +.long 0xf14a9804, 0x27000000, 0x41f7daec, 0x80000000 +.long 0x7f0e50cd, 0xec000000, 0x172ff691, 0x5f000000 +.long 0x768dd64d, 0x60000000, 0x434db0ef, 0x51000000 +.long 0xcc544daa, 0x7f000000, 0xe4df0496, 0xa9000000 +.long 0x9ee3b5d1, 0x19000000, 0x4c1b886a, 0xb5000000 +.long 0xc1b81f2c, 0x4a000000, 0x467f5165, 0x0d000000 +.long 0x9d04ea5e, 0x2d000000, 0x015d358c, 0xe5000000 +.long 0xfa737487, 0x7a000000, 0xfb2e410b, 0x9f000000 +.long 0xb35a1d67, 0x93000000, 0x9252d2db, 0xc9000000 +.long 0xe9335610, 0x9c000000, 0x6d1347d6, 0xef000000 +.long 0x9a8c61d7, 0xa0000000, 0x377a0ca1, 0xe0000000 +.long 0x598e14f8, 0x3b000000, 0xeb893c13, 0x4d000000 +.long 0xceee27a9, 0xae000000, 0xb735c961, 0x2a000000 +.long 0xe1ede51c, 0xf5000000, 0x7a3cb147, 0xb0000000 +.long 0x9c59dfd2, 0xc8000000, 0x553f73f2, 0xeb000000 +.long 0x1879ce14, 0xbb000000, 0x73bf37c7, 0x3c000000 +.long 0x53eacdf7, 0x83000000, 0x5f5baafd, 0x53000000 +.long 0xdf146f3d, 0x99000000, 0x7886db44, 0x61000000 +.long 0xca81f3af, 0x17000000, 0xb93ec468, 0x2b000000 +.long 0x382c3424, 0x04000000, 0xc25f40a3, 0x7e000000 +.long 0x1672c31d, 0xba000000, 0xbc0c25e2, 0x77000000 +.long 0x288b493c, 0xd6000000, 0xff41950d, 0x26000000 +.long 0x397101a8, 0xe1000000, 0x08deb30c, 0x69000000 +.long 0xd89ce4b4, 0x14000000, 0x6490c156, 0x63000000 +.long 0x7b6184cb, 0x55000000, 0xd570b632, 0x21000000 +.long 0x48745c6c, 0x0c000000, 0xd04257b8, 0x7d000000 + +#endif /*USE_AES*/ +#endif /*__x86_64*/ diff --git a/cipher/rijndael.c b/cipher/rijndael.c index ac2fcfb..4a89e32 100644 --- a/cipher/rijndael.c +++ b/cipher/rijndael.c @@ -61,6 +61,12 @@ #endif +/* USE_AMD64_ASM indicates whether to use AMD64 assembly code. */ +#undef USE_AMD64_ASM +#if defined(__x86_64__) +# define USE_AMD64_ASM 1 +#endif + /* USE_PADLOCK indicates whether to compile the padlock specific code. */ #undef USE_PADLOCK @@ -96,6 +102,20 @@ typedef u32 u32_a_t; #endif +#ifdef USE_AMD64_ASM +/* AMD64 assembly implementations of AES */ +extern void _gcry_aes_amd64_encrypt_block(const void *keysched_enc, + unsigned char *out, + const unsigned char *in, + int rounds); + +extern void _gcry_aes_amd64_decrypt_block(const void *keysched_dec, + unsigned char *out, + const unsigned char *in, + int rounds); +#endif /*USE_AMD64_ASM*/ + + /* Our context object. */ typedef struct @@ -524,6 +544,9 @@ static void do_encrypt_aligned (const RIJNDAEL_context *ctx, unsigned char *b, const unsigned char *a) { +#ifdef USE_AMD64_ASM + _gcry_aes_amd64_encrypt_block(ctx->keyschenc, b, a, ctx->rounds); +#else /*!USE_AMD64_ASM*/ #define rk (ctx->keyschenc) int rounds = ctx->rounds; int r; @@ -605,6 +628,7 @@ do_encrypt_aligned (const RIJNDAEL_context *ctx, *((u32_a_t*)(b+ 8)) ^= *((u32_a_t*)rk[rounds][2]); *((u32_a_t*)(b+12)) ^= *((u32_a_t*)rk[rounds][3]); #undef rk +#endif /*!USE_AMD64_ASM*/ } @@ -612,6 +636,7 @@ static void do_encrypt (const RIJNDAEL_context *ctx, unsigned char *bx, const unsigned char *ax) { +#ifndef USE_AMD64_ASM /* BX and AX are not necessary correctly aligned. Thus we might need to copy them here. We try to align to a 16 bytes. */ if (((size_t)ax & 0x0f) || ((size_t)bx & 0x0f)) @@ -632,6 +657,7 @@ do_encrypt (const RIJNDAEL_context *ctx, memcpy (bx, b.b, 16); } else +#endif /*!USE_AMD64_ASM*/ { do_encrypt_aligned (ctx, bx, ax); } @@ -1639,6 +1665,9 @@ static void do_decrypt_aligned (RIJNDAEL_context *ctx, unsigned char *b, const unsigned char *a) { +#ifdef USE_AMD64_ASM + _gcry_aes_amd64_decrypt_block(ctx->keyschdec, b, a, ctx->rounds); +#else /*!USE_AMD64_ASM*/ #define rk (ctx->keyschdec) int rounds = ctx->rounds; int r; @@ -1721,6 +1750,7 @@ do_decrypt_aligned (RIJNDAEL_context *ctx, *((u32_a_t*)(b+ 8)) ^= *((u32_a_t*)rk[0][2]); *((u32_a_t*)(b+12)) ^= *((u32_a_t*)rk[0][3]); #undef rk +#endif /*!USE_AMD64_ASM*/ } @@ -1735,6 +1765,7 @@ do_decrypt (RIJNDAEL_context *ctx, byte *bx, const byte *ax) ctx->decryption_prepared = 1; } +#ifndef USE_AMD64_ASM /* BX and AX are not necessary correctly aligned. Thus we might need to copy them here. We try to align to a 16 bytes. */ if (((size_t)ax & 0x0f) || ((size_t)bx & 0x0f)) @@ -1755,6 +1786,7 @@ do_decrypt (RIJNDAEL_context *ctx, byte *bx, const byte *ax) memcpy (bx, b.b, 16); } else +#endif /*!USE_AMD64_ASM*/ { do_decrypt_aligned (ctx, bx, ax); } diff --git a/configure.ac b/configure.ac index f13a91b..c33c950 100644 --- a/configure.ac +++ b/configure.ac @@ -1221,6 +1221,13 @@ LIST_MEMBER(aes, $enabled_ciphers) if test "$found" = "1" ; then GCRYPT_CIPHERS="$GCRYPT_CIPHERS rijndael.lo" AC_DEFINE(USE_AES, 1, [Defined if this module should be included]) + + case "${host}" in + x86_64-*-*) + # Build with the assembly implementation + GCRYPT_CIPHERS="$GCRYPT_CIPHERS rijndael-amd64.lo" + ;; + esac fi LIST_MEMBER(twofish, $enabled_ciphers) commit 9a61edd1f00cefe8ffa3ad54a53eed163883053c Author: Jussi Kivilinna Date: Wed May 29 16:40:27 2013 +0300 blowfish: add amd64 assembly implementation * cipher/Makefile.am: Add 'blowfish-amd64.S'. * cipher/blowfish-amd64.S: New file. * cipher/blowfish.c (USE_AMD64_ASM): New macro. [USE_AMD64_ASM] (_gcry_blowfish_amd64_do_encrypt) (_gcry_blowfish_amd64_encrypt_block) (_gcry_blowfish_amd64_decrypt_block, _gcry_blowfish_amd64_ctr_enc) (_gcry_blowfish_amd64_cbc_dec, _gcry_blowfish_amd64_cfb_dec): New prototypes. [USE_AMD64_ASM] (do_encrypt, do_encrypt_block, do_decrypt_block) (encrypt_block, decrypt_block): New functions. (_gcry_blowfish_ctr_enc, _gcry_blowfish_cbc_dec) (_gcry_blowfish_cfb_dec, selftest_ctr, selftest_cbc, selftest_cfb): New functions. (selftest): Call new bulk selftests. * cipher/cipher.c (gcry_cipher_open) [USE_BLOWFISH]: Register Blowfish bulk functions for ctr-enc, cbc-dec and cfb-dec. * configure.ac (blowfish) [x86_64]: Add 'blowfish-amd64.lo'. * src/cipher.h (_gcry_blowfish_ctr_enc, _gcry_blowfish_cbc_dec) (gcry_blowfish_cfb_dec): New prototypes. -- Add non-parallel functions for small speed-up and 4-way parallel functions for modes of operation that support parallel processing. Speed old vs. new on AMD Phenom II X6 1055T: ECB/Stream CBC CFB OFB CTR --------------- --------------- --------------- --------------- --------------- BLOWFISH 1.21x 1.12x 1.17x 3.52x 1.18x 3.34x 1.16x 1.15x 3.38x 3.47x Speed old vs. new on Intel Core i5-2450M (Sandy-Bridge): ECB/Stream CBC CFB OFB CTR --------------- --------------- --------------- --------------- --------------- BLOWFISH 1.16x 1.10x 1.17x 2.98x 1.18x 2.88x 1.16x 1.15x 3.00x 3.02x Signed-off-by: Jussi Kivilinna diff --git a/cipher/Makefile.am b/cipher/Makefile.am index 687c599..c0a7593 100644 --- a/cipher/Makefile.am +++ b/cipher/Makefile.am @@ -54,7 +54,7 @@ rmd.h EXTRA_libcipher_la_SOURCES = \ arcfour.c \ -blowfish.c \ +blowfish.c blowfish-amd64.S \ cast5.c cast5-amd64.S \ crc.c \ des.c \ diff --git a/cipher/blowfish-amd64.S b/cipher/blowfish-amd64.S new file mode 100644 index 0000000..1008387 --- /dev/null +++ b/cipher/blowfish-amd64.S @@ -0,0 +1,533 @@ +/* blowfish-amd64.S - AMD64 assembly implementation of Blowfish cipher + * + * Copyright ? 2013 Jussi Kivilinna + * + * This file is part of Libgcrypt. + * + * Libgcrypt is free software; you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2.1 of + * the License, or (at your option) any later version. + * + * Libgcrypt is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this program; if not, see . + */ + +#ifdef __x86_64 +#include +#if defined(USE_BLOWFISH) + +.text + +/* structure of BLOWFISH_context: */ +#define s0 0 +#define s1 ((s0) + 256 * 4) +#define s2 ((s1) + 256 * 4) +#define s3 ((s2) + 256 * 4) +#define p ((s3) + 256 * 4) + +/* register macros */ +#define CTX %rdi +#define RIO %rsi + +#define RX0 %rax +#define RX1 %rbx +#define RX2 %rcx +#define RX3 %rdx + +#define RX0d %eax +#define RX1d %ebx +#define RX2d %ecx +#define RX3d %edx + +#define RX0bl %al +#define RX1bl %bl +#define RX2bl %cl +#define RX3bl %dl + +#define RX0bh %ah +#define RX1bh %bh +#define RX2bh %ch +#define RX3bh %dh + +#define RT0 %rbp +#define RT1 %rsi +#define RT2 %r8 +#define RT3 %r9 + +#define RT0d %ebp +#define RT1d %esi +#define RT2d %r8d +#define RT3d %r9d + +#define RKEY %r10 + +/*********************************************************************** + * 1-way blowfish + ***********************************************************************/ +#define F() \ + movzbl RX0bh, RT1d; \ + movzbl RX0bl, RT3d; \ + rorq $16, RX0; \ + movzbl RX0bh, RT0d; \ + movzbl RX0bl, RT2d; \ + rorq $16, RX0; \ + movl s0(CTX,RT0,4), RT0d; \ + addl s1(CTX,RT2,4), RT0d; \ + xorl s2(CTX,RT1,4), RT0d; \ + addl s3(CTX,RT3,4), RT0d; \ + xorq RT0, RX0; + +#define load_roundkey_enc(n) \ + movq p+4*(n)(CTX), RX3; + +#define add_roundkey_enc() \ + xorq RX3, RX0; + +#define round_enc(n) \ + add_roundkey_enc(); \ + load_roundkey_enc(n); \ + \ + F(); \ + F(); + +#define load_roundkey_dec(n) \ + movq p+4*(n-1)(CTX), RX3; \ + rorq $32, RX3; + +#define add_roundkey_dec() \ + xorq RX3, RX0; + +#define round_dec(n) \ + add_roundkey_dec(); \ + load_roundkey_dec(n); \ + \ + F(); \ + F(); + +#define read_block() \ + movq (RIO), RX0; \ + rorq $32, RX0; \ + bswapq RX0; + +#define write_block() \ + bswapq RX0; \ + movq RX0, (RIO); + +.align 8 +.type __blowfish_enc_blk1, at function; + +__blowfish_enc_blk1: + /* input: + * %rdi: ctx, CTX + * RX0: input plaintext block + * output: + * RX0: output plaintext block + */ + movq %rbp, %r11; + + load_roundkey_enc(0); + round_enc(2); + round_enc(4); + round_enc(6); + round_enc(8); + round_enc(10); + round_enc(12); + round_enc(14); + round_enc(16); + add_roundkey_enc(); + + movq %r11, %rbp; + + ret; +.size __blowfish_enc_blk1,.-__blowfish_enc_blk1; + +.align 8 +.globl _gcry_blowfish_amd64_do_encrypt +.type _gcry_blowfish_amd64_do_encrypt, at function; + +_gcry_blowfish_amd64_do_encrypt: + /* input: + * %rdi: ctx, CTX + * %rsi: u32 *ret_xl + * %rdx: u32 *ret_xr + */ + movl (%rdx), RX0d; + shlq $32, RX0; + movl (%rsi), RT3d; + movq %rdx, %r10; + orq RT3, RX0; + movq %rsi, RX2; + + call __blowfish_enc_blk1; + + movl RX0d, (%r10); + shrq $32, RX0; + movl RX0d, (RX2); + + ret; +.size _gcry_blowfish_amd64_do_encrypt,.-_gcry_blowfish_amd64_do_encrypt; + +.align 8 +.globl _gcry_blowfish_amd64_encrypt_block +.type _gcry_blowfish_amd64_encrypt_block, at function; + +_gcry_blowfish_amd64_encrypt_block: + /* input: + * %rdi: ctx, CTX + * %rsi: dst + * %rdx: src + */ + + movq %rsi, %r10; + + movq %rdx, RIO; + read_block(); + + call __blowfish_enc_blk1; + + movq %r10, RIO; + write_block(); + + ret; +.size _gcry_blowfish_amd64_encrypt_block,.-_gcry_blowfish_amd64_encrypt_block; + +.align 8 +.globl _gcry_blowfish_amd64_decrypt_block +.type _gcry_blowfish_amd64_decrypt_block, at function; + +_gcry_blowfish_amd64_decrypt_block: + /* input: + * %rdi: ctx, CTX + * %rsi: dst + * %rdx: src + */ + movq %rbp, %r11; + + movq %rsi, %r10; + movq %rdx, RIO; + + read_block(); + + load_roundkey_dec(17); + round_dec(15); + round_dec(13); + round_dec(11); + round_dec(9); + round_dec(7); + round_dec(5); + round_dec(3); + round_dec(1); + add_roundkey_dec(); + + movq %r10, RIO; + write_block(); + + movq %r11, %rbp; + + ret; +.size _gcry_blowfish_amd64_decrypt_block,.-_gcry_blowfish_amd64_decrypt_block; + +/********************************************************************** + 4-way blowfish, four blocks parallel + **********************************************************************/ +#define F4(x) \ + movzbl x ## bh, RT1d; \ + movzbl x ## bl, RT3d; \ + rorq $16, x; \ + movzbl x ## bh, RT0d; \ + movzbl x ## bl, RT2d; \ + rorq $16, x; \ + movl s0(CTX,RT0,4), RT0d; \ + addl s1(CTX,RT2,4), RT0d; \ + xorl s2(CTX,RT1,4), RT0d; \ + addl s3(CTX,RT3,4), RT0d; \ + xorq RT0, x; + +#define add_preloaded_roundkey4() \ + xorq RKEY, RX0; \ + xorq RKEY, RX1; \ + xorq RKEY, RX2; \ + xorq RKEY, RX3; + +#define preload_roundkey_enc(n) \ + movq p+4*(n)(CTX), RKEY; + +#define add_roundkey_enc4(n) \ + add_preloaded_roundkey4(); \ + preload_roundkey_enc(n + 2); + +#define round_enc4(n) \ + add_roundkey_enc4(n); \ + \ + F4(RX0); \ + F4(RX1); \ + F4(RX2); \ + F4(RX3); \ + \ + F4(RX0); \ + F4(RX1); \ + F4(RX2); \ + F4(RX3); + +#define preload_roundkey_dec(n) \ + movq p+4*((n)-1)(CTX), RKEY; \ + rorq $32, RKEY; + +#define add_roundkey_dec4(n) \ + add_preloaded_roundkey4(); \ + preload_roundkey_dec(n - 2); + +#define round_dec4(n) \ + add_roundkey_dec4(n); \ + \ + F4(RX0); \ + F4(RX1); \ + F4(RX2); \ + F4(RX3); \ + \ + F4(RX0); \ + F4(RX1); \ + F4(RX2); \ + F4(RX3); + +#define inbswap_block4() \ + rorq $32, RX0; \ + bswapq RX0; \ + rorq $32, RX1; \ + bswapq RX1; \ + rorq $32, RX2; \ + bswapq RX2; \ + rorq $32, RX3; \ + bswapq RX3; + +#define inctrswap_block4() \ + rorq $32, RX0; \ + rorq $32, RX1; \ + rorq $32, RX2; \ + rorq $32, RX3; + +#define outbswap_block4() \ + bswapq RX0; \ + bswapq RX1; \ + bswapq RX2; \ + bswapq RX3; + +.align 8 +.type __blowfish_enc_blk4, at function; + +__blowfish_enc_blk4: + /* input: + * %rdi: ctx, CTX + * RX0,RX1,RX2,RX3: four input inbswapped plaintext blocks + * output: + * RX0,RX1,RX2,RX3: four output ciphertext blocks + */ + preload_roundkey_enc(0); + + round_enc4(0); + round_enc4(2); + round_enc4(4); + round_enc4(6); + round_enc4(8); + round_enc4(10); + round_enc4(12); + round_enc4(14); + add_preloaded_roundkey4(); + + outbswap_block4(); + + ret; +.size __blowfish_enc_blk4,.-__blowfish_enc_blk4; + +.align 8 +.type __blowfish_dec_blk4, at function; + +__blowfish_dec_blk4: + /* input: + * %rdi: ctx, CTX + * RX0,RX1,RX2,RX3: four input ciphertext blocks + * output: + * RX0,RX1,RX2,RX3: four output plaintext blocks + */ + preload_roundkey_dec(17); + + inbswap_block4(); + + round_dec4(17); + round_dec4(15); + round_dec4(13); + round_dec4(11); + round_dec4(9); + round_dec4(7); + round_dec4(5); + round_dec4(3); + add_preloaded_roundkey4(); + + outbswap_block4(); + + ret; +.size __blowfish_dec_blk4,.-__blowfish_dec_blk4; + +.align 8 +.globl _gcry_blowfish_amd64_ctr_enc +.type _gcry_blowfish_amd64_ctr_enc, at function; +_gcry_blowfish_amd64_ctr_enc: + /* input: + * %rdi: ctx, CTX + * %rsi: dst (4 blocks) + * %rdx: src (4 blocks) + * %rcx: iv (big endian, 64bit) + */ + pushq %rbp; + pushq %rbx; + pushq %r12; + pushq %r13; + + /* %r11-%r13 are not used by __blowfish_enc_blk4 */ + movq %rcx, %r13; /*iv*/ + movq %rdx, %r12; /*src*/ + movq %rsi, %r11; /*dst*/ + + /* load IV and byteswap */ + movq (%r13), RT0; + bswapq RT0; + movq RT0, RX0; + + /* construct IVs */ + leaq 1(RT0), RX1; + leaq 2(RT0), RX2; + leaq 3(RT0), RX3; + leaq 4(RT0), RT0; + bswapq RT0; + + inctrswap_block4(); + + /* store new IV */ + movq RT0, (%r13); + + call __blowfish_enc_blk4; + + /* XOR key-stream with plaintext */ + xorq 0 * 8(%r12), RX0; + xorq 1 * 8(%r12), RX1; + xorq 2 * 8(%r12), RX2; + xorq 3 * 8(%r12), RX3; + movq RX0, 0 * 8(%r11); + movq RX1, 1 * 8(%r11); + movq RX2, 2 * 8(%r11); + movq RX3, 3 * 8(%r11); + + popq %r13; + popq %r12; + popq %rbx; + popq %rbp; + + ret; +.size _gcry_blowfish_amd64_ctr_enc,.-_gcry_blowfish_amd64_ctr_enc; + +.align 8 +.globl _gcry_blowfish_amd64_cbc_dec +.type _gcry_blowfish_amd64_cbc_dec, at function; +_gcry_blowfish_amd64_cbc_dec: + /* input: + * %rdi: ctx, CTX + * %rsi: dst (4 blocks) + * %rdx: src (4 blocks) + * %rcx: iv (64bit) + */ + pushq %rbp; + pushq %rbx; + pushq %r12; + pushq %r13; + + /* %r11-%r13 are not used by __blowfish_dec_blk4 */ + movq %rsi, %r11; /*dst*/ + movq %rdx, %r12; /*src*/ + movq %rcx, %r13; /*iv*/ + + /* load input */ + movq 0 * 8(%r12), RX0; + movq 1 * 8(%r12), RX1; + movq 2 * 8(%r12), RX2; + movq 3 * 8(%r12), RX3; + + call __blowfish_dec_blk4; + + movq 3 * 8(%r12), RT0; + xorq (%r13), RX0; + xorq 0 * 8(%r12), RX1; + xorq 1 * 8(%r12), RX2; + xorq 2 * 8(%r12), RX3; + movq RT0, (%r13); /* store new IV */ + + movq RX0, 0 * 8(%r11); + movq RX1, 1 * 8(%r11); + movq RX2, 2 * 8(%r11); + movq RX3, 3 * 8(%r11); + + popq %r13; + popq %r12; + popq %rbx; + popq %rbp; + + ret; +.size _gcry_blowfish_amd64_cbc_dec,.-_gcry_blowfish_amd64_cbc_dec; + +.align 8 +.globl _gcry_blowfish_amd64_cfb_dec +.type _gcry_blowfish_amd64_cfb_dec, at function; +_gcry_blowfish_amd64_cfb_dec: + /* input: + * %rdi: ctx, CTX + * %rsi: dst (4 blocks) + * %rdx: src (4 blocks) + * %rcx: iv (64bit) + */ + pushq %rbp; + pushq %rbx; + pushq %r12; + pushq %r13; + + /* %r11-%r13 are not used by __blowfish_enc_blk4 */ + movq %rcx, %r13; /*iv*/ + movq %rdx, %r12; /*src*/ + movq %rsi, %r11; /*dst*/ + + /* Load input */ + movq (%r13), RX0; + movq 0 * 8(%r12), RX1; + movq 1 * 8(%r12), RX2; + movq 2 * 8(%r12), RX3; + + inbswap_block4(); + + /* Update IV */ + movq 3 * 8(%r12), RT0; + movq RT0, (%r13); + + call __blowfish_enc_blk4; + + xorq 0 * 8(%r12), RX0; + xorq 1 * 8(%r12), RX1; + xorq 2 * 8(%r12), RX2; + xorq 3 * 8(%r12), RX3; + movq RX0, 0 * 8(%r11); + movq RX1, 1 * 8(%r11); + movq RX2, 2 * 8(%r11); + movq RX3, 3 * 8(%r11); + + popq %r13; + popq %r12; + popq %rbx; + popq %rbp; + ret; +.size _gcry_blowfish_amd64_cfb_dec,.-_gcry_blowfish_amd64_cfb_dec; + +#endif /*defined(USE_BLOWFISH)*/ +#endif /*__x86_64*/ diff --git a/cipher/blowfish.c b/cipher/blowfish.c index b4d2b9c..39d4051 100644 --- a/cipher/blowfish.c +++ b/cipher/blowfish.c @@ -36,10 +36,20 @@ #include "types.h" #include "g10lib.h" #include "cipher.h" +#include "bufhelp.h" +#include "cipher-selftest.h" #define BLOWFISH_BLOCKSIZE 8 #define BLOWFISH_ROUNDS 16 + +/* USE_AMD64_ASM indicates whether to use AMD64 assembly code. */ +#undef USE_AMD64_ASM +#if defined(__x86_64__) && (BLOWFISH_ROUNDS == 16) +# define USE_AMD64_ASM 1 +#endif + + typedef struct { u32 s0[256]; u32 s1[256]; @@ -240,6 +250,61 @@ static const u32 ps[BLOWFISH_ROUNDS+2] = { 0xC0AC29B7,0xC97C50DD,0x3F84D5B5,0xB5470917,0x9216D5D9,0x8979FB1B }; +#ifdef USE_AMD64_ASM + +/* Assembly implementations of Blowfish. */ +extern void _gcry_blowfish_amd64_do_encrypt(BLOWFISH_context *c, u32 *ret_xl, + u32 *ret_xr); + +extern void _gcry_blowfish_amd64_encrypt_block(BLOWFISH_context *c, byte *out, + const byte *in); + +extern void _gcry_blowfish_amd64_decrypt_block(BLOWFISH_context *c, byte *out, + const byte *in); + +/* These assembly implementations process four blocks in parallel. */ +extern void _gcry_blowfish_amd64_ctr_enc(BLOWFISH_context *ctx, byte *out, + const byte *in, byte *ctr); + +extern void _gcry_blowfish_amd64_cbc_dec(BLOWFISH_context *ctx, byte *out, + const byte *in, byte *iv); + +extern void _gcry_blowfish_amd64_cfb_dec(BLOWFISH_context *ctx, byte *out, + const byte *in, byte *iv); + +static void +do_encrypt ( BLOWFISH_context *bc, u32 *ret_xl, u32 *ret_xr ) +{ + _gcry_blowfish_amd64_do_encrypt (bc, ret_xl, ret_xr); +} + +static void +do_encrypt_block (BLOWFISH_context *context, byte *outbuf, const byte *inbuf) +{ + _gcry_blowfish_amd64_encrypt_block (context, outbuf, inbuf); +} + +static void +do_decrypt_block (BLOWFISH_context *context, byte *outbuf, const byte *inbuf) +{ + _gcry_blowfish_amd64_decrypt_block (context, outbuf, inbuf); +} + +static void encrypt_block (void *context , byte *outbuf, const byte *inbuf) +{ + BLOWFISH_context *c = (BLOWFISH_context *) context; + do_encrypt_block (c, outbuf, inbuf); + _gcry_burn_stack (2*8); +} + +static void decrypt_block (void *context, byte *outbuf, const byte *inbuf) +{ + BLOWFISH_context *c = (BLOWFISH_context *) context; + do_decrypt_block (c, outbuf, inbuf); + _gcry_burn_stack (2*8); +} + +#else /*USE_AMD64_ASM*/ #if BLOWFISH_ROUNDS != 16 static inline u32 @@ -461,6 +526,201 @@ decrypt_block (void *context, byte *outbuf, const byte *inbuf) _gcry_burn_stack (64); } +#endif /*!USE_AMD64_ASM*/ + + +/* Bulk encryption of complete blocks in CTR mode. This function is only + intended for the bulk encryption feature of cipher.c. CTR is expected to be + of size BLOWFISH_BLOCKSIZE. */ +void +_gcry_blowfish_ctr_enc(void *context, unsigned char *ctr, void *outbuf_arg, + const void *inbuf_arg, unsigned int nblocks) +{ + BLOWFISH_context *ctx = context; + unsigned char *outbuf = outbuf_arg; + const unsigned char *inbuf = inbuf_arg; + unsigned char tmpbuf[BLOWFISH_BLOCKSIZE]; + int burn_stack_depth = (64) + 2 * BLOWFISH_BLOCKSIZE; + int i; + +#ifdef USE_AMD64_ASM + { + if (nblocks >= 4) + burn_stack_depth += 5 * sizeof(void*); + + /* Process data in 4 block chunks. */ + while (nblocks >= 4) + { + _gcry_blowfish_amd64_ctr_enc(ctx, outbuf, inbuf, ctr); + + nblocks -= 4; + outbuf += 4 * BLOWFISH_BLOCKSIZE; + inbuf += 4 * BLOWFISH_BLOCKSIZE; + } + + /* Use generic code to handle smaller chunks... */ + /* TODO: use caching instead? */ + } +#endif + + for ( ;nblocks; nblocks-- ) + { + /* Encrypt the counter. */ + do_encrypt_block(ctx, tmpbuf, ctr); + /* XOR the input with the encrypted counter and store in output. */ + buf_xor(outbuf, tmpbuf, inbuf, BLOWFISH_BLOCKSIZE); + outbuf += BLOWFISH_BLOCKSIZE; + inbuf += BLOWFISH_BLOCKSIZE; + /* Increment the counter. */ + for (i = BLOWFISH_BLOCKSIZE; i > 0; i--) + { + ctr[i-1]++; + if (ctr[i-1]) + break; + } + } + + wipememory(tmpbuf, sizeof(tmpbuf)); + _gcry_burn_stack(burn_stack_depth); +} + + +/* Bulk decryption of complete blocks in CBC mode. This function is only + intended for the bulk encryption feature of cipher.c. */ +void +_gcry_blowfish_cbc_dec(void *context, unsigned char *iv, void *outbuf_arg, + const void *inbuf_arg, unsigned int nblocks) +{ + BLOWFISH_context *ctx = context; + unsigned char *outbuf = outbuf_arg; + const unsigned char *inbuf = inbuf_arg; + unsigned char savebuf[BLOWFISH_BLOCKSIZE]; + int burn_stack_depth = (64) + 2 * BLOWFISH_BLOCKSIZE; + +#ifdef USE_AMD64_ASM + { + if (nblocks >= 4) + burn_stack_depth += 5 * sizeof(void*); + + /* Process data in 4 block chunks. */ + while (nblocks >= 4) + { + _gcry_blowfish_amd64_cbc_dec(ctx, outbuf, inbuf, iv); + + nblocks -= 4; + outbuf += 4 * BLOWFISH_BLOCKSIZE; + inbuf += 4 * BLOWFISH_BLOCKSIZE; + } + + /* Use generic code to handle smaller chunks... */ + } +#endif + + for ( ;nblocks; nblocks-- ) + { + /* We need to save INBUF away because it may be identical to + OUTBUF. */ + memcpy(savebuf, inbuf, BLOWFISH_BLOCKSIZE); + + do_decrypt_block (ctx, outbuf, inbuf); + + buf_xor(outbuf, outbuf, iv, BLOWFISH_BLOCKSIZE); + memcpy(iv, savebuf, BLOWFISH_BLOCKSIZE); + inbuf += BLOWFISH_BLOCKSIZE; + outbuf += BLOWFISH_BLOCKSIZE; + } + + wipememory(savebuf, sizeof(savebuf)); + _gcry_burn_stack(burn_stack_depth); +} + + +/* Bulk decryption of complete blocks in CFB mode. This function is only + intended for the bulk encryption feature of cipher.c. */ +void +_gcry_blowfish_cfb_dec(void *context, unsigned char *iv, void *outbuf_arg, + const void *inbuf_arg, unsigned int nblocks) +{ + BLOWFISH_context *ctx = context; + unsigned char *outbuf = outbuf_arg; + const unsigned char *inbuf = inbuf_arg; + int burn_stack_depth = (64) + 2 * BLOWFISH_BLOCKSIZE; + +#ifdef USE_AMD64_ASM + { + if (nblocks >= 4) + burn_stack_depth += 5 * sizeof(void*); + + /* Process data in 4 block chunks. */ + while (nblocks >= 4) + { + _gcry_blowfish_amd64_cfb_dec(ctx, outbuf, inbuf, iv); + + nblocks -= 4; + outbuf += 4 * BLOWFISH_BLOCKSIZE; + inbuf += 4 * BLOWFISH_BLOCKSIZE; + } + + /* Use generic code to handle smaller chunks... */ + } +#endif + + for ( ;nblocks; nblocks-- ) + { + do_encrypt_block(ctx, iv, iv); + buf_xor_n_copy(outbuf, iv, inbuf, BLOWFISH_BLOCKSIZE); + outbuf += BLOWFISH_BLOCKSIZE; + inbuf += BLOWFISH_BLOCKSIZE; + } + + _gcry_burn_stack(burn_stack_depth); +} + + +/* Run the self-tests for BLOWFISH-CTR, tests IV increment of bulk CTR + encryption. Returns NULL on success. */ +static const char * +selftest_ctr (void) +{ + const int nblocks = 4+1; + const int blocksize = BLOWFISH_BLOCKSIZE; + const int context_size = sizeof(BLOWFISH_context); + + return _gcry_selftest_helper_ctr("BLOWFISH", &bf_setkey, + &encrypt_block, &_gcry_blowfish_ctr_enc, nblocks, blocksize, + context_size); +} + + +/* Run the self-tests for BLOWFISH-CBC, tests bulk CBC decryption. + Returns NULL on success. */ +static const char * +selftest_cbc (void) +{ + const int nblocks = 4+2; + const int blocksize = BLOWFISH_BLOCKSIZE; + const int context_size = sizeof(BLOWFISH_context); + + return _gcry_selftest_helper_cbc("BLOWFISH", &bf_setkey, + &encrypt_block, &_gcry_blowfish_cbc_dec, nblocks, blocksize, + context_size); +} + + +/* Run the self-tests for BLOWFISH-CFB, tests bulk CBC decryption. + Returns NULL on success. */ +static const char * +selftest_cfb (void) +{ + const int nblocks = 4+2; + const int blocksize = BLOWFISH_BLOCKSIZE; + const int context_size = sizeof(BLOWFISH_context); + + return _gcry_selftest_helper_cfb("BLOWFISH", &bf_setkey, + &encrypt_block, &_gcry_blowfish_cfb_dec, nblocks, blocksize, + context_size); +} + static const char* selftest(void) @@ -471,6 +731,7 @@ selftest(void) byte plain3[] = { 0xFE, 0xDC, 0xBA, 0x98, 0x76, 0x54, 0x32, 0x10 }; byte key3[] = { 0x41, 0x79, 0x6E, 0xA0, 0x52, 0x61, 0x6E, 0xE4 }; byte cipher3[] = { 0xE1, 0x13, 0xF4, 0x10, 0x2C, 0xFC, 0xCE, 0x43 }; + const char *r; bf_setkey( (void *) &c, (const unsigned char*)"abcdefghijklmnopqrstuvwxyz", 26 ); @@ -488,6 +749,16 @@ selftest(void) decrypt_block( (void *) &c, buffer, buffer ); if( memcmp( buffer, plain3, 8 ) ) return "Blowfish selftest failed (4)."; + + if ( (r = selftest_cbc ()) ) + return r; + + if ( (r = selftest_cfb ()) ) + return r; + + if ( (r = selftest_ctr ()) ) + return r; + return NULL; } diff --git a/cipher/cipher.c b/cipher/cipher.c index 79ca755..508f26f 100644 --- a/cipher/cipher.c +++ b/cipher/cipher.c @@ -718,6 +718,13 @@ gcry_cipher_open (gcry_cipher_hd_t *handle, h->bulk.ctr_enc = _gcry_aes_ctr_enc; break; #endif /*USE_AES*/ +#ifdef USE_BLOWFISH + case GCRY_CIPHER_BLOWFISH: + h->bulk.cfb_dec = _gcry_blowfish_cfb_dec; + h->bulk.cbc_dec = _gcry_blowfish_cbc_dec; + h->bulk.ctr_enc = _gcry_blowfish_ctr_enc; + break; +#endif /*USE_BLOWFISH*/ #ifdef USE_CAST5 case GCRY_CIPHER_CAST5: h->bulk.cfb_dec = _gcry_cast5_cfb_dec; diff --git a/configure.ac b/configure.ac index 113c71f..f13a91b 100644 --- a/configure.ac +++ b/configure.ac @@ -1189,6 +1189,13 @@ LIST_MEMBER(blowfish, $enabled_ciphers) if test "$found" = "1" ; then GCRYPT_CIPHERS="$GCRYPT_CIPHERS blowfish.lo" AC_DEFINE(USE_BLOWFISH, 1, [Defined if this module should be included]) + + case "${host}" in + x86_64-*-*) + # Build with the assembly implementation + GCRYPT_CIPHERS="$GCRYPT_CIPHERS blowfish-amd64.lo" + ;; + esac fi LIST_MEMBER(cast5, $enabled_ciphers) diff --git a/src/cipher.h b/src/cipher.h index 1742003..ca595b0 100644 --- a/src/cipher.h +++ b/src/cipher.h @@ -95,6 +95,19 @@ void _gcry_aes_ctr_enc (void *context, unsigned char *ctr, void *outbuf_arg, const void *inbuf_arg, unsigned int nblocks); +/*-- blowfish.c --*/ +void _gcry_blowfish_cfb_dec (void *context, unsigned char *iv, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks); + +void _gcry_blowfish_cbc_dec (void *context, unsigned char *iv, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks); + +void _gcry_blowfish_ctr_enc (void *context, unsigned char *ctr, + void *outbuf_arg, const void *inbuf_arg, + unsigned int nblocks); + /*-- cast5.c --*/ void _gcry_cast5_cfb_dec (void *context, unsigned char *iv, void *outbuf_arg, const void *inbuf_arg, ----------------------------------------------------------------------- hooks/post-receive -- The GNU crypto library http://git.gnupg.org