sync code with last improvements from OpenBSD
This commit is contained in:
parent
4ee2459da1
commit
12cd8aa4a2
17 changed files with 397 additions and 66 deletions
|
@ -1,4 +1,4 @@
|
|||
/* $OpenBSD: kex.c,v 1.180 2023/08/21 21:16:18 tobhe Exp $ */
|
||||
/* $OpenBSD: kex.c,v 1.181 2023/08/28 03:28:43 djm Exp $ */
|
||||
/*
|
||||
* Copyright (c) 2000, 2001 Markus Friedl. All rights reserved.
|
||||
*
|
||||
|
@ -477,12 +477,14 @@ kex_send_ext_info(struct ssh *ssh)
|
|||
return SSH_ERR_ALLOC_FAIL;
|
||||
/* XXX filter algs list by allowed pubkey/hostbased types */
|
||||
if ((r = sshpkt_start(ssh, SSH2_MSG_EXT_INFO)) != 0 ||
|
||||
(r = sshpkt_put_u32(ssh, 2)) != 0 ||
|
||||
(r = sshpkt_put_u32(ssh, 3)) != 0 ||
|
||||
(r = sshpkt_put_cstring(ssh, "server-sig-algs")) != 0 ||
|
||||
(r = sshpkt_put_cstring(ssh, algs)) != 0 ||
|
||||
(r = sshpkt_put_cstring(ssh,
|
||||
"publickey-hostbound@openssh.com")) != 0 ||
|
||||
(r = sshpkt_put_cstring(ssh, "0")) != 0 ||
|
||||
(r = sshpkt_put_cstring(ssh, "ping@openssh.com")) != 0 ||
|
||||
(r = sshpkt_put_cstring(ssh, "0")) != 0 ||
|
||||
(r = sshpkt_send(ssh)) != 0) {
|
||||
error_fr(r, "compose");
|
||||
goto out;
|
||||
|
@ -512,6 +514,23 @@ kex_send_newkeys(struct ssh *ssh)
|
|||
return 0;
|
||||
}
|
||||
|
||||
/* Check whether an ext_info value contains the expected version string */
|
||||
static int
|
||||
kex_ext_info_check_ver(struct kex *kex, const char *name,
|
||||
const u_char *val, size_t len, const char *want_ver, u_int flag)
|
||||
{
|
||||
if (memchr(val, '\0', len) != NULL) {
|
||||
error("SSH2_MSG_EXT_INFO: %s value contains nul byte", name);
|
||||
return SSH_ERR_INVALID_FORMAT;
|
||||
}
|
||||
debug_f("%s=<%s>", name, val);
|
||||
if (strcmp(val, want_ver) == 0)
|
||||
kex->flags |= flag;
|
||||
else
|
||||
debug_f("unsupported version of %s extension", name);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
kex_input_ext_info(int type, u_int32_t seq, struct ssh *ssh)
|
||||
{
|
||||
|
@ -542,6 +561,8 @@ kex_input_ext_info(int type, u_int32_t seq, struct ssh *ssh)
|
|||
/* Ensure no \0 lurking in value */
|
||||
if (memchr(val, '\0', vlen) != NULL) {
|
||||
error_f("nul byte in %s", name);
|
||||
free(name);
|
||||
free(val);
|
||||
return SSH_ERR_INVALID_FORMAT;
|
||||
}
|
||||
debug_f("%s=<%s>", name, val);
|
||||
|
@ -549,18 +570,18 @@ kex_input_ext_info(int type, u_int32_t seq, struct ssh *ssh)
|
|||
val = NULL;
|
||||
} else if (strcmp(name,
|
||||
"publickey-hostbound@openssh.com") == 0) {
|
||||
/* XXX refactor */
|
||||
/* Ensure no \0 lurking in value */
|
||||
if (memchr(val, '\0', vlen) != NULL) {
|
||||
error_f("nul byte in %s", name);
|
||||
return SSH_ERR_INVALID_FORMAT;
|
||||
if ((r = kex_ext_info_check_ver(kex, name, val, vlen,
|
||||
"0", KEX_HAS_PUBKEY_HOSTBOUND)) != 0) {
|
||||
free(name);
|
||||
free(val);
|
||||
return r;
|
||||
}
|
||||
debug_f("%s=<%s>", name, val);
|
||||
if (strcmp(val, "0") == 0)
|
||||
kex->flags |= KEX_HAS_PUBKEY_HOSTBOUND;
|
||||
else {
|
||||
debug_f("unsupported version of %s extension",
|
||||
name);
|
||||
} else if (strcmp(name, "ping@openssh.com") == 0) {
|
||||
if ((r = kex_ext_info_check_ver(kex, name, val, vlen,
|
||||
"0", KEX_HAS_PING)) != 0) {
|
||||
free(name);
|
||||
free(val);
|
||||
return r;
|
||||
}
|
||||
} else
|
||||
debug_f("%s (unrecognised)", name);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue