]> git.ipfire.org Git - thirdparty/openssh-portable.git/commitdiff
upstream: EXT_INFO negotiation of hostbound pubkey auth
authordjm@openbsd.org <djm@openbsd.org>
Sun, 19 Dec 2021 22:13:12 +0000 (22:13 +0000)
committerDamien Miller <djm@mindrot.org>
Sun, 19 Dec 2021 22:28:07 +0000 (09:28 +1100)
the EXT_INFO packet gets a new publickey-hostbound@openssh.com to
advertise the hostbound public key method.

Client side support to parse this feature flag and set the kex->flags
indicator if the expected version is offered (currently "0").

ok markus@

OpenBSD-Commit-ID: 4cdb2ca5017ec1ed7a9d33bda95c1d6a97b583b0

kex.c

diff --git a/kex.c b/kex.c
index 55babbcecf306f82dd40c17e2cfb483de57af526..29733cc0dbfc29c042fb1d23406a6926d2745003 100644 (file)
--- a/kex.c
+++ b/kex.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: kex.c,v 1.169 2021/12/19 22:08:06 djm Exp $ */
+/* $OpenBSD: kex.c,v 1.170 2021/12/19 22:13:12 djm Exp $ */
 /*
  * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
  *
@@ -436,9 +436,12 @@ 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, 1)) != 0 ||
+           (r = sshpkt_put_u32(ssh, 2)) != 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_send(ssh)) != 0) {
                error_fr(r, "compose");
                goto out;
@@ -498,6 +501,21 @@ kex_input_ext_info(int type, u_int32_t seq, struct ssh *ssh)
                        debug_f("%s=<%s>", name, val);
                        kex->server_sig_algs = val;
                        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;
+                       }
+                       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
                        debug_f("%s (unrecognised)", name);
                free(name);