Bug#391837: Remove RSA_EXPORT support
Marc Haber
mh+debian-packages at zugschlus.de
Mon Oct 9 12:01:49 UTC 2006
Hi,
On Sun, Oct 08, 2006 at 10:23:16PM +0200, Florian Weimer wrote:
> The attached patches remove RSA_EXPORT support from Exim.
Thank you very much. I committed this to svn for testing.
> RSA_EXPORT was used to support insecure browsers during the U.S.
> crypto embargo. It requires special client support, and Exim is
> probably the only MTA that supports it -- and will never use it
> because real RSA is always available.
>
> This patch removes blocking on /dev/random from the DH parameter
> generation. Exim still consumes lots of entropy, but it will never
> block. The only remaining problem is lack of locking, which will lead
> to wasted CPU cycles when multiple Exim process try to generate new DH
> parameters. However, CPU cycles grow much faster than random bits.
>
> The first patch has been tested to be backwards compatible (Exim still
> can read the old parameter format), and new DH parameters are
> generated correctly. The second patch only illustrates how the DH
> parameters file should be generated from outside Exim; it is
> completely untrusted.
>
> Further documentation upgrades are probably necessary.
>
> #! /bin/sh /usr/share/dpatch/dpatch-run
> ## disable_rsa_export.dpatch by <fw at deneb.enyo.de>
> ##
> ## All lines beginning with `## DP:' are a description of the patch.
> ## DP: No description.
>
> @DPATCH@
> diff -urNad exim4-4.63~/src/tls-gnu.c exim4-4.63/src/tls-gnu.c
> --- exim4-4.63~/src/tls-gnu.c 2006-07-31 16:19:48.000000000 +0200
> +++ exim4-4.63/src/tls-gnu.c 2006-10-08 21:58:54.000000000 +0200
> @@ -23,7 +23,6 @@
>
> #define UNKNOWN_NAME "unknown"
> #define DH_BITS 768
> -#define RSA_BITS 512
> #define PARAM_SIZE 2*1024
>
>
> @@ -37,7 +36,6 @@
> static BOOL initialized = INITIALIZED_NOT;
> static host_item *client_host;
>
> -static gnutls_rsa_params rsa_params = NULL;
> static gnutls_dh_params dh_params = NULL;
>
> static gnutls_certificate_server_credentials x509_cred = NULL;
> @@ -57,7 +55,6 @@
> GNUTLS_KX_RSA,
> GNUTLS_KX_DHE_DSS,
> GNUTLS_KX_DHE_RSA,
> - GNUTLS_KX_RSA_EXPORT,
> 0 };
>
> static int default_cipher_priority[16] = {
> @@ -262,9 +259,6 @@
>
> /* Initialize the data structures for holding the parameters */
>
> -ret = gnutls_rsa_params_init(&rsa_params);
> -if (ret < 0) return tls_error(US"init rsa_params", host, ret);
> -
> ret = gnutls_dh_params_init(&dh_params);
> if (ret < 0) return tls_error(US"init dh_params", host, ret);
>
> @@ -298,20 +292,10 @@
> return tls_error(US"TLS cache read failed", host, 0);
> (void)close(fd);
>
> - ret = gnutls_rsa_params_import_pkcs1(rsa_params, &m, GNUTLS_X509_FMT_PEM);
> -
> + ret = gnutls_dh_params_import_pkcs3(dh_params, &m, GNUTLS_X509_FMT_PEM);
> if (ret < 0)
> - {
> - DEBUG(D_tls)
> - debug_printf("RSA params import failed: assume old-style cache file\n");
> - }
> - else
> - {
> - ret = gnutls_dh_params_import_pkcs3(dh_params, &m, GNUTLS_X509_FMT_PEM);
> - if (ret < 0)
> - return tls_error(US"DH params import", host, ret);
> - DEBUG(D_tls) debug_printf("read RSA and D-H parameters from file\n");
> - }
> + return tls_error(US"DH params import", host, ret);
> + DEBUG(D_tls) debug_printf("read D-H parameters from file\n");
>
> free(m.data);
> }
> @@ -339,10 +323,6 @@
> {
> uschar tempfilename[sizeof(filename) + 10];
>
> - DEBUG(D_tls) debug_printf("generating %d bit RSA key...\n", RSA_BITS);
> - ret = gnutls_rsa_params_generate2(rsa_params, RSA_BITS);
> - if (ret < 0) return tls_error(US"RSA key generation", host, ret);
> -
> DEBUG(D_tls) debug_printf("generating %d bit Diffie-Hellman key...\n",
> DH_BITS);
> ret = gnutls_dh_params_generate2(dh_params, DH_BITS);
> @@ -362,27 +342,13 @@
> * certtool or other programs.
> *
> * The commands for certtool are:
> - * $ certtool --generate-privkey --bits 512 >params
> - * $ echo "" >>params
> - * $ certtool --generate-dh-params --bits 1024 >> params
> + * $ certtool --generate-dh-params --bits 1024 > params
> */
>
> m.size = PARAM_SIZE;
> m.data = malloc(m.size);
> if (m.data == NULL)
> return tls_error(US"memory allocation failed", host, 0);
> -
> - ret = gnutls_rsa_params_export_pkcs1(rsa_params, GNUTLS_X509_FMT_PEM,
> - m.data, &m.size);
> - if (ret < 0) return tls_error(US"RSA params export", host, ret);
> -
> - /* Do not write the null termination byte. */
> -
> - m.size = Ustrlen(m.data);
> - if (write(fd, m.data, m.size) != m.size || write(fd, "\n", 1) != 1)
> - return tls_error(US"TLS cache write failed", host, 0);
> -
> - m.size = PARAM_SIZE;
> ret = gnutls_dh_params_export_pkcs3(dh_params, GNUTLS_X509_FMT_PEM, m.data,
> &m.size);
> if (ret < 0) return tls_error(US"DH params export", host, ret);
> @@ -398,11 +364,11 @@
> return tls_error(string_sprintf("failed to rename %s as %s: %s",
> tempfilename, filename, strerror(errno)), host, 0);
>
> - DEBUG(D_tls) debug_printf("wrote RSA and D-H parameters to file %s\n",
> + DEBUG(D_tls) debug_printf("wrote D-H parameters to file %s\n",
> filename);
> }
>
> -DEBUG(D_tls) debug_printf("initialized RSA and D-H parameters\n");
> +DEBUG(D_tls) debug_printf("initialized D-H parameters\n");
> return OK;
> }
>
> @@ -540,7 +506,6 @@
> /* Associate the parameters with the x509 credentials structure. */
>
> gnutls_certificate_set_dh_params(x509_cred, dh_params);
> -gnutls_certificate_set_rsa_export_params(x509_cred, rsa_params);
>
> DEBUG(D_tls) debug_printf("initialized certificate stuff\n");
> return OK;
> --- exim4_refresh_gnutls-params 2006/10/08 20:13:09 1.1
> +++ exim4_refresh_gnutls-params 2006/10/08 20:14:22
> @@ -49,12 +49,9 @@
> tempgnutls=$(tempfile -d $SPOOLDIR -p "gnutp" )
>
> if [ -x /usr/bin/certtool ] ; then
> - if /usr/share/exim4/timeout.pl \
> - "$1" /usr/bin/certtool --generate-privkey --bits 512 \
> - > "$tempgnutls" 2> /dev/null && \
> /usr/share/exim4/timeout.pl \
> "$1" /usr/bin/certtool --generate-dh-params --bits 1024 \
> - >> "$tempgnutls" 2> /dev/null ; then
> + > "$tempgnutls" 2> /dev/null ; then
> if [ -e $SPOOLDIR/gnutls-params ] ; then
> chmod --reference=$SPOOLDIR/gnutls-params "$tempgnutls"
> fi
I suspect that you didn't want to remove the "if", right?
> @@ -64,11 +61,8 @@
> fi
> elif [ -x /usr/bin/openssl ] ;then
> if /usr/share/exim4/timeout.pl \
> - "$1" /usr/bin/openssl genrsa 512 \
> - > "$tempgnutls" 2> /dev/null && \
> - /usr/share/exim4/timeout.pl \
> "$1" /usr/bin/openssl gendh 1024 \
> - >> "$tempgnutls" 2> /dev/null ; then
> + > "$tempgnutls" 2> /dev/null ; then
> if [ -e $SPOOLDIR/gnutls-params ] ; then
> chmod --reference=$SPOOLDIR/gnutls-params "$tempgnutls"
> fi
This seems correct to me.
Greetings
Marc
--
-----------------------------------------------------------------------------
Marc Haber | "I don't trust Computers. They | Mailadresse im Header
Mannheim, Germany | lose things." Winona Ryder | Fon: *49 621 72739834
Nordisch by Nature | How to make an American Quilt | Fax: *49 621 72739835
More information about the Pkg-exim4-maintainers
mailing list