missing HAVE_EVP_RIPEMD160 breaks ssh client
Damien Miller
djm at mindrot.org
Wed Jul 16 09:18:02 EST 2014
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:
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