=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/ssh/sshconnect2.c,v retrieving revision 1.347 retrieving revision 1.348 diff -u -r1.347 -r1.348 --- src/usr.bin/ssh/sshconnect2.c 2021/04/03 06:18:41 1.347 +++ src/usr.bin/ssh/sshconnect2.c 2021/06/06 03:40:39 1.348 @@ -1,4 +1,4 @@ -/* $OpenBSD: sshconnect2.c,v 1.347 2021/04/03 06:18:41 djm Exp $ */ +/* $OpenBSD: sshconnect2.c,v 1.348 2021/06/06 03:40:39 djm Exp $ */ /* * Copyright (c) 2000 Markus Friedl. All rights reserved. * Copyright (c) 2008 Damien Miller. All rights reserved. @@ -1168,6 +1168,7 @@ key_sig_algorithm(struct ssh *ssh, const struct sshkey *key) { char *allowed, *oallowed, *cp, *tmp, *alg = NULL; + const char *server_sig_algs; /* * The signature algorithm will only differ from the key algorithm @@ -1183,6 +1184,14 @@ } /* + * Workaround OpenSSH 7.4 bug: this version supports RSA/SHA-2 but + * fails to advertise it via SSH2_MSG_EXT_INFO. + */ + server_sig_algs = ssh->kex->server_sig_algs; + if (key->type == KEY_RSA && (ssh->compat & SSH_BUG_SIGTYPE74)) + server_sig_algs = "rsa-sha2-256,rsa-sha2-512"; + + /* * For RSA keys/certs, since these might have a different sig type: * find the first entry in PubkeyAcceptedAlgorithms of the right type * that also appears in the supported signature algorithms list from @@ -1193,7 +1202,7 @@ if (sshkey_type_from_name(cp) != key->type) continue; tmp = match_list(sshkey_sigalg_by_name(cp), - ssh->kex->server_sig_algs, NULL); + server_sig_algs, NULL); if (tmp != NULL) alg = xstrdup(cp); free(tmp);