missing HAVE_EVP_RIPEMD160 breaks ssh client
Petr Lautrbach
plautrba at redhat.com
Wed Jul 16 23:05:53 EST 2014
On Wed, Jul 16, 2014 at 09:18:02AM +1000, Damien Miller wrote:
> On Tue, 15 Jul 2014, Petr Lautrbach wrote:
>
> > Hello,
> >
> > I've updated sources but forgot to recreate configure so I've ended without
> > #define HAVE_EVP_RIPEMD160 1
> >
> > and ssh client ended with:
> >
> > OpenSSH_6.7p1, OpenSSL 1.0.1h-fips 5 Jun 2014
> > debug1: Reading configuration data ssh.config
> > main: mux digest failed
> >
> > The problem was that ssh_digest_by_alg() couldn't verify alg with an index bigger than 1 since
> > the line with SSH_DIGEST_RIPEMD160 wasn't compiled in and all indexes in the ssh_digest digests array
> > was lowered by one.
> >
> > /* NB. Indexed directly by algorithm number */
> > const struct ssh_digest digests[] = {
> > { SSH_DIGEST_MD5, "MD5", 16, EVP_md5 },
> > #ifdef HAVE_EVP_RIPEMD160 /* XXX replace with local if missing */
> > { SSH_DIGEST_RIPEMD160, "RIPEMD160", 20, EVP_ripemd160 },
> > #endif
> > { SSH_DIGEST_SHA1, "SHA1", 20, EVP_sha1 },
> > ...
>
> Try this:
It works, thanks.
Petr
> Index: digest-openssl.c
> ===================================================================
> RCS file: /var/cvs/openssh/digest-openssl.c,v
> retrieving revision 1.5
> diff -u -p -r1.5 digest-openssl.c
> --- digest-openssl.c 3 Jul 2014 11:23:25 -0000 1.5
> +++ digest-openssl.c 15 Jul 2014 23:16:30 -0000
> @@ -30,6 +30,15 @@
> #include "digest.h"
> #include "ssherr.h"
>
> +#ifndef HAVE_EVP_RIPEMD160
> +# define EVP_ripemd160 NULL
> +#endif /* HAVE_EVP_RIPEMD160 */
> +#ifndef HAVE_EVP_SHA256
> +# define EVP_sha256 NULL
> +# define EVP_sha384 NULL
> +# define EVP_sha512 NULL
> +#endif /* HAVE_EVP_SHA256 */
> +
> struct ssh_digest_ctx {
> int alg;
> EVP_MD_CTX mdctx;
> @@ -45,15 +54,11 @@ struct ssh_digest {
> /* NB. Indexed directly by algorithm number */
> const struct ssh_digest digests[] = {
> { SSH_DIGEST_MD5, "MD5", 16, EVP_md5 },
> -#ifdef HAVE_EVP_RIPEMD160 /* XXX replace with local if missing */
> { SSH_DIGEST_RIPEMD160, "RIPEMD160", 20, EVP_ripemd160 },
> -#endif
> { SSH_DIGEST_SHA1, "SHA1", 20, EVP_sha1 },
> -#ifdef HAVE_EVP_SHA256 /* XXX replace with local if missing */
> { SSH_DIGEST_SHA256, "SHA256", 32, EVP_sha256 },
> { SSH_DIGEST_SHA384, "SHA384", 48, EVP_sha384 },
> { SSH_DIGEST_SHA512, "SHA512", 64, EVP_sha512 },
> -#endif
> { -1, NULL, 0, NULL },
> };
>
> @@ -63,6 +68,8 @@ ssh_digest_by_alg(int alg)
> if (alg < 0 || alg >= SSH_DIGEST_MAX)
> return NULL;
> if (digests[alg].id != alg) /* sanity */
> + return NULL;
> + if (digests[alg].mdfunc == NULL)
> return NULL;
> return &(digests[alg]);
> }
More information about the openssh-unix-dev
mailing list