<pre style='margin:0'>
Blair Zajac (blair) pushed a commit to branch master
in repository macports-ports.
</pre>
<p><a href="https://github.com/macports/macports-ports/commit/f34c23137ff37bd006dd2aba16be237f1c496b53">https://github.com/macports/macports-ports/commit/f34c23137ff37bd006dd2aba16be237f1c496b53</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'> new f34c23137ff openssh: fix support for +gsskex
</span>f34c23137ff is described below
<span style='display:block; white-space:pre;color:#808000;'>commit f34c23137ff37bd006dd2aba16be237f1c496b53
</span>Author: Blair Zajac <blair@macports.org>
AuthorDate: Sun Oct 10 21:25:28 2021 -0700
<span style='display:block; white-space:pre;color:#404040;'> openssh: fix support for +gsskex
</span><span style='display:block; white-space:pre;color:#404040;'>
</span><span style='display:block; white-space:pre;color:#404040;'> Closes: https://trac.macports.org/ticket/63598
</span>---
net/openssh/Portfile | 2 +-
...p-20201216.patch => openssh-8.8p1-gsskex.patch} | 3049 ++++++++++----------
net/openssh/files/series | 2 +-
net/openssh/files/series-gsskex | 2 +-
4 files changed, 1542 insertions(+), 1513 deletions(-)
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/openssh/Portfile b/net/openssh/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 8dd8436b67a..b30c1be55f8 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/openssh/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/openssh/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -161,7 +161,7 @@ if {${name} eq ${subport}} {
</span> }
variant gsskex requires kerberos5 description "Add OpenSSH GSSAPI key exchange patch" {
<span style='display:block; white-space:pre;background:#ffe0e0;'>- patchfiles-append openssh-8.1p1-gsskex-all-20141021-mp-20201216.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ patchfiles-append openssh-8.8p1-gsskex.patch
</span> configure.ldflags-append \
-Wl,-pie
configure.cflags-append -fPIE
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/openssh/files/openssh-8.1p1-gsskex-all-20141021-mp-20201216.patch b/net/openssh/files/openssh-8.8p1-gsskex.patch
</span>similarity index 67%
rename from net/openssh/files/openssh-8.1p1-gsskex-all-20141021-mp-20201216.patch
rename to net/openssh/files/openssh-8.8p1-gsskex.patch
<span style='display:block; white-space:pre;color:#808080;'>index 71fdde0608f..ef073f651d0 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/openssh/files/openssh-8.1p1-gsskex-all-20141021-mp-20201216.patch
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/openssh/files/openssh-8.8p1-gsskex.patch
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1,3 +1,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+====== OVERVIEW SECTION ======
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+This file has some content from the previous version of the patch that
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+applied cleanly to 8.4p1.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+====== TEXT FROM 8.4p1 VERSION ======
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> From 1c1b6fa17982eb622e2c4e8f4a279f2113f57413 Mon Sep 17 00:00:00 2001
From: Simon Wilkinson <simon@sxw.org.uk>
Date: Sun, 9 Feb 2014 16:09:48 +0000
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -21,269 +28,237 @@ Last-Updated: 2014-10-07
</span>
Patch-Name: gssapi.patch
<span style='display:block; white-space:pre;background:#ffe0e0;'>-====== MACPORTS SECTION ======
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+====== PATCH SECTION ======
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+The below was created using the following commands:
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-Updated by: Mihai Moldovan <ionic@macports.org>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Patch-Name: openssh-8.1p1-gsskex-all-20141021-mp-20201216.patch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Abstract: Updated for OpenSSH 8.1p1 with MacPorts patches for integration
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- with Apple's launchd, pam, sandbox and Keychain.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- WARNING: the commit ID does NOT match this patch. It is merely
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- provided for reference.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- This patch is a COMBINATION of both the GSSAPI patches included
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- in Fedora and Debian. Neither standalone path is particularly
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- stellar, both have their rough edges. The idea is to base upon
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- the Fedora patch and fix small issues or add other features by
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- pulling in specific changes from the Debian version.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- Sometimes, I also rewrite code to avoid copy-pasting madness
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- or the like.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-Last-Updated: 2019-10-15
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-X-Ref (Old): http://pkgs.fedoraproject.org/cgit/rpms/openssh.git/tree/openssh-6.1p1-gssapi-canohost.patch?id=b487a6d746c5bff2889ce09f98535d3b5e1e7e65
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-X-Ref (Old): http://pkgs.fedoraproject.org/cgit/rpms/openssh.git/tree/openssh-7.0p1-gssKexAlgorithms.patch?id=13073f8d9ccec27646453f729aaa2952ae86ad01
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-X-Ref (Old): http://pkgs.fedoraproject.org/cgit/rpms/openssh.git/tree/openssh-7.1p1-gssapi-documentation.patch?id=d9d9575f0065dc0cf84743fa8c163df70c0623b8
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-X-Ref (Old): http://pkgs.fedoraproject.org/cgit/rpms/openssh.git/tree/openssh-7.2p1-gsskex.patch?id=b487a6d746c5bff2889ce09f98535d3b5e1e7e65
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-X-Ref (Old): http://pkgs.fedoraproject.org/cgit/rpms/openssh.git/tree/openssh-7.2p1-gsskex.patch?id=17b491b3075c078c75ca0fa5ad7438e52747b3b0
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-X-Ref: https://src.fedoraproject.org/rpms/openssh/blob/def1debf2eba5b7877e54548c1749322e68740a6/f/openssh-8.0p1-gssapi-keyex.patch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-X-Ref (Old): http://sources.debian.net/data/main/o/openssh/1:7.3p1-1/debian/patches/gssapi.patch
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-X-Ref (Old): https://anonscm.debian.org/cgit/pkg-ssh/openssh.git/tree/debian/patches/gssapi.patch?id=477bb7636238c106f8cd7c868a8c0c5eabcfb3db
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-X-Ref (Old): https://anonscm.debian.org/cgit/pkg-ssh/openssh.git/tree/debian/patches/gssapi.patch?id=0556ea972b15607b7e13ff31bc05840881c91dd3
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5c167a9ab866df9/debian/patches/gssapi.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$ git clone https://github.com/openssh-gsskex/openssh-gsskex.git
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$ cd openssh-gsskex
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+$ git diff bf944e37..261d3de3
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-====== MACPORTS SECTION ======
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ChangeLog.gssapi | 113 +++++++++++++++++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- Makefile.in | 3 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- auth-krb5.c | 17 ++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- auth2-gss.c | 48 +++++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- auth2.c | 2 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- clientloop.c | 13 +++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- config.h.in | 6 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- configure | 57 ++++++++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- configure.ac | 24 ++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- gss-genr.c | 275 ++++++++++++++++++++++++++++++++++++++++++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- gss-serv-krb5.c | 85 ++++++++++++--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- gss-serv.c | 221 +++++++++++++++++++++++++++++++-----
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- kex.c | 16 +++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- kex.h | 14 +++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- kexgssc.c | 332 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- kexgsss.c | 290 ++++++++++++++++++++++++++++++++++++++++++++++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- monitor.c | 108 +++++++++++++++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- monitor.h | 3 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- monitor_wrap.c | 47 +++++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- monitor_wrap.h | 4 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- readconf.c | 42 +++++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- readconf.h | 5 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- servconf.c | 38 ++++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- servconf.h | 3 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ssh-gss.h | 41 ++++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ssh_config | 2 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ssh_config.5 | 34 +++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sshconnect2.c | 124 ++++++++++++++++++++-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sshd.c | 110 ++++++++++++++++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sshd_config | 2 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sshd_config.5 | 28 +++++
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sshkey.c | 3 +-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sshkey.h | 1 +
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- 33 files changed, 2052 insertions(+), 59 deletions(-)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- create mode 100644 ChangeLog.gssapi
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- create mode 100644 kexgssc.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- create mode 100644 kexgsss.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# bf944e37 corresponds to the upstream V_8_8_P1 tags in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# https://github.com/openssh/openssh-portable.git
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+#
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# 261d3de3 corresponds to the proposed commit from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+# https://github.com/openssh-gsskex/openssh-gsskex/pull/23
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null 1970-01-01 00:00:00.000000000 +0000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/ChangeLog.gssapi 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,113 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20110101
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - Finally update for OpenSSH 5.6p1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - Add GSSAPIServerIdentity option from Jim Basney
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20100308
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ Makefile.in, key.c, key.h ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Updates for OpenSSH 5.4p1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ servconf.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Include GSSAPI options in the sshd -T configuration dump, and flag
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ some older configuration options as being unsupported. Thanks to Colin
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Watson.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ -
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20100124
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ sshconnect2.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Adapt to deal with additional element in Authmethod structure. Thanks to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Colin Watson
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20090615
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ gss-genr.c gss-serv.c kexgssc.c kexgsss.c monitor.c sshconnect2.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ sshd.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Fix issues identified by Greg Hudson following a code review
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Check return value of gss_indicate_mechs
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Protect GSSAPI calls in monitor, so they can only be used if enabled
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Check return values of bignum functions in key exchange
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Use BN_clear_free to clear other side's DH value
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Make ssh_gssapi_id_kex more robust
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Only configure kex table pointers if GSSAPI is enabled
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Don't leak mechanism list, or gss mechanism list
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Cast data.length before printing
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ If serverkey isn't provided, use an empty string, rather than NULL
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20090201
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ gss-genr.c gss-serv.c kex.h kexgssc.c readconf.c readconf.h ssh-gss.h
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ssh_config.5 sshconnet2.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Add support for the GSSAPIClientIdentity option, which allows the user
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ to specify which GSSAPI identity to use to contact a given server
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20080404
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ gss-serv.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Add code to actually implement GSSAPIStrictAcceptCheck, which had somehow
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ been omitted from a previous version of this patch. Reported by Borislav
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Stoichkov
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20070317
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ gss-serv-krb5.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Remove C99ism, where new_ccname was being declared in the middle of a
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ function
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20061220
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ servconf.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Make default for GSSAPIStrictAcceptorCheck be Yes, to match previous, and
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ documented, behaviour. Reported by Dan Watson.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20060910
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ gss-genr.c kexgssc.c kexgsss.c kex.h monitor.c sshconnect2.c sshd.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ssh-gss.h ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ add support for gss-group14-sha1 key exchange mechanisms
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ gss-serv.c servconf.c servconf.h sshd_config sshd_config.5 ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Add GSSAPIStrictAcceptorCheck option to allow the disabling of
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ acceptor principal checking on multi-homed machines.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ <Bugzilla #928>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ sshd_config ssh_config ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Add settings for GSSAPIKeyExchange and GSSAPITrustDNS to the sample
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ configuration files
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ kexgss.c kegsss.c sshconnect2.c sshd.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Code cleanup. Replace strlen/xmalloc/snprintf sequences with xasprintf()
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Limit length of error messages displayed by client
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20060909
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ gss-genr.c gss-serv.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ move ssh_gssapi_acquire_cred() and ssh_gssapi_server_ctx to be server
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ only, where they belong
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ <Bugzilla #1225>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20060829
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ gss-serv-krb5.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Fix CCAPI credentials cache name when creating KRB5CCNAME environment
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ variable
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20060828
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ gss-genr.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Avoid Heimdal context freeing problem
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ <Fixed upstream 20060829>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20060818
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ gss-genr.c ssh-gss.h sshconnect2.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Make sure that SPENGO is disabled
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ <Bugzilla #1218 - Fixed upstream 20060818>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+20060421
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ gssgenr.c, sshconnect2.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ a few type changes (signed versus unsigned, int versus size_t) to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fix compiler errors/warnings
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (from jbasney AT ncsa.uiuc.edu)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ kexgssc.c, sshconnect2.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fix uninitialized variable warnings
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (from jbasney AT ncsa.uiuc.edu)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ gssgenr.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ pass oid to gss_display_status (helpful when using GSSAPI mechglue)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (from jbasney AT ncsa.uiuc.edu)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ <Bugzilla #1220 >
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ gss-serv-krb5.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ #ifdef HAVE_GSSAPI_KRB5 should be #ifdef HAVE_GSSAPI_KRB5_H
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (from jbasney AT ncsa.uiuc.edu)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ <Fixed upstream 20060304>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ readconf.c, readconf.h, ssh_config.5, sshconnect2.c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ add client-side GssapiKeyExchange option
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (from jbasney AT ncsa.uiuc.edu)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ - [ sshconnect2.c ]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ add support for GssapiTrustDns option for gssapi-with-mic
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (from jbasney AT ncsa.uiuc.edu)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ <gssapi-with-mic support is Bugzilla #1008>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/Makefile.in.orig 2020-09-27 02:25:01.000000000 -0500
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/Makefile.in 2020-12-16 18:31:47.000000000 -0600
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -91,6 +91,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- LIBSSH_OBJS=${LIBOPENSSH_OBJS} \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- authfd.o authfile.o \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ auth-compat.o \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- canohost.o channels.o cipher.o cipher-aes.o cipher-aesctr.o \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- cipher-ctr.o cleanup.o \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- compat.o fatal.o hostfile.o \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -106,6 +107,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- hmac.o sc25519.o ge25519.o fe25519.o ed25519.o verify.o hash.o \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/.travis.yml b/.travis.yml
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 00000000..5ba9985d
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/.travis.yml
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,27 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++language: c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++dist: bionic
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++compiler:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - clang
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - gcc
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# Run only unit tests. Without OpenSSL, some additional tests in makefile do not work
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++env:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - CONFIGURE=--with-kerberos5=auto TESTS="file-tests"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - CONFIGURE=--without-kerberos5 TESTS="file-tests"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - CONFIGURE=--with-kerberos5=auto --without-openssl TESTS=""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - CONFIGURE=--without-kerberos5 --without-openssl TESTS=""
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++addons:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ apt_packages:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - libssl-dev
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - libkrb5-dev
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++before_script:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - autoreconf
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - ./configure $CONFIGURE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++script:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - make
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - # make tests
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ - make unit $TESTS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/Makefile.in b/Makefile.in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index b0293841..b0e76f01 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/Makefile.in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/Makefile.in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -108,6 +108,7 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \
</span> kex.o kexdh.o kexgex.o kexecdh.o kexc25519.o \
kexgexc.o kexgexs.o \
<span style='display:block; white-space:pre;background:#e0ffe0;'>+ kexsntrup761x25519.o sntrup761.o kexgen.o \
</span> + kexgssc.o \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- sntrup4591761.o kexsntrup4591761x25519.o kexgen.o \
</span> sftp-realpath.o platform-pledge.o platform-tracing.o platform-misc.o \
sshbuf-io.o
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -123,7 +125,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -124,7 +125,7 @@ SSHDOBJS=sshd.o auth-rhosts.o auth-passwd.o \
</span> auth-bsdauth.o auth2-hostbased.o auth2-kbdint.o \
auth2-none.o auth2-passwd.o auth2-pubkey.o \
monitor.o monitor_wrap.o auth-krb5.o \
- auth2-gss.o gss-serv.o gss-serv-krb5.o \
+ auth2-gss.o gss-serv.o gss-serv-krb5.o kexgsss.o \
loginrec.o auth-pam.o auth-shadow.o auth-sia.o md5crypt.o \
<span style='display:block; white-space:pre;background:#ffe0e0;'>- sftp-server.o sftp-common.o \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ srclimit.o sftp-server.o sftp-common.o \
</span> sandbox-null.o sandbox-rlimit.o sandbox-systrace.o sandbox-darwin.o \
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/auth-krb5.c 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/auth-krb5.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -182,8 +182,13 @@ auth_krb5_password(Authctxt *authctxt, c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- len = strlen(authctxt->krb5_ticket_file) + 6;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- authctxt->krb5_ccname = xmalloc(len);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef USE_CCAPI
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ snprintf(authctxt->krb5_ccname, len, "API:%s",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ authctxt->krb5_ticket_file);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- snprintf(authctxt->krb5_ccname, len, "FILE:%s",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- authctxt->krb5_ticket_file);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef USE_PAM
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (options.use_pam)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -240,15 +245,22 @@ krb5_cleanup_proc(Authctxt *authctxt)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifndef HEIMDAL
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- krb5_error_code
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ssh_krb5_cc_gen(krb5_context ctx, krb5_ccache *ccache) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- int tmpfd, ret, oerrno;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int ret, oerrno;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- char ccname[40];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- mode_t old_umask;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef USE_CCAPI
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ char cctemplate[] = "API:krb5cc_%d";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ char cctemplate[] = "FILE:/tmp/krb5cc_%d_XXXXXXXXXX";
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int tmpfd;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ret = snprintf(ccname, sizeof(ccname),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- "FILE:/tmp/krb5cc_%d_XXXXXXXXXX", geteuid());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ cctemplate, geteuid());
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (ret < 0 || (size_t)ret >= sizeof(ccname))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return ENOMEM;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifndef USE_CCAPI
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- old_umask = umask(0177);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- tmpfd = mkstemp(ccname + strlen("FILE:"));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- oerrno = errno;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -265,6 +277,7 @@ ssh_krb5_cc_gen(krb5_context ctx, krb5_c
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return oerrno;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- close(tmpfd);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/README.md b/README.md
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index de471773..53d98ade 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/README.md
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/README.md
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1,3 +1,39 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Portable OpenSSH with GSSAPI Key Exchange patches
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++=================================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/openssh-gsskex/openssh-gsskex.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/openssh-gsskex/openssh-gsskex/context:cpp)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Currently, there are two branches with gssapi key exchange related
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++patches:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * fedora/master: Changes that are shipped in Fedora [![Build Status](https://travis-ci.org/openssh-gsskex/openssh-gsskex.svg?branch=fedora%2Fmaster)](https://travis-ci.org/openssh-gsskex/openssh-gsskex)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * debian/master: Changes that are shipped in Debian [![Build Status](https://travis-ci.org/openssh-gsskex/openssh-gsskex.svg?branch=debian%2Fmaster)](https://travis-ci.org/openssh-gsskex/openssh-gsskex)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++The target is to converge to a shared repository with single master
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++branch from where we could build releases for both OSes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++What is in:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * The original patch implementing missing parts of RFC4462 by Simon Wilkinson
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ adapted to the current OpenSSH versions and with several fixes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * New methods for GSSAPI Kex from IETF draft [1] from Jakub Jelen
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Missing kerberos-related parts:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * .k5login and .kusers support available in Fedora [2] [3].
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Improved handling of kerberos ccache location [4]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[1] https://tools.ietf.org/html/draft-ietf-curdle-gss-keyex-sha2-08
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[2] https://src.fedoraproject.org/rpms/openssh/blob/master/f/openssh-6.6p1-kuserok.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[3] https://src.fedoraproject.org/rpms/openssh/blob/master/f/openssh-6.6p1-GSSAPIEnablek5users.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++[4] https://bugzilla.mindrot.org/show_bug.cgi?id=2775
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++-------------------------------------------------------------------------------
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # Portable OpenSSH
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>- return (krb5_cc_resolve(ctx, ccname, ccache));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ [![C/C++ CI](https://github.com/openssh/openssh-portable/actions/workflows/c-cpp.yml/badge.svg)](https://github.com/openssh/openssh-portable/actions/workflows/c-cpp.yml)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/auth.c b/auth.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 00b168b4..704dc2e7 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/auth.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/auth.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -402,7 +402,8 @@ auth_root_allowed(struct ssh *ssh, const char *method)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case PERMIT_NO_PASSWD:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (strcmp(method, "publickey") == 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ strcmp(method, "hostbased") == 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- strcmp(method, "gssapi-with-mic") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ strcmp(method, "gssapi-with-mic") == 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ strcmp(method, "gssapi-keyex") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case PERMIT_FORCED_ONLY:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -729,97 +730,6 @@ fakepw(void)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (&fake);
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/auth2-gss.c 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/auth2-gss.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Returns the remote DNS hostname as a string. The returned string must not
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * be freed. NB. this will usually trigger a DNS query the first time it is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * called.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * This function does additional checks on the hostname to mitigate some
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * attacks on based on conflation of hostnames and IP addresses.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-remote_hostname(struct ssh *ssh)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- struct sockaddr_storage from;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- socklen_t fromlen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- struct addrinfo hints, *ai, *aitop;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- char name[NI_MAXHOST], ntop2[NI_MAXHOST];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- const char *ntop = ssh_remote_ipaddr(ssh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- /* Get IP address of client. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- fromlen = sizeof(from);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- memset(&from, 0, sizeof(from));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (getpeername(ssh_packet_get_connection_in(ssh),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- (struct sockaddr *)&from, &fromlen) == -1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- debug("getpeername failed: %.100s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- ipv64_normalise_mapped(&from, &fromlen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (from.ss_family == AF_INET6)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- fromlen = sizeof(struct sockaddr_in6);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- debug3("Trying to reverse map address %.100s.", ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- /* Map the IP address to a host name. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (getnameinfo((struct sockaddr *)&from, fromlen, name, sizeof(name),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- NULL, 0, NI_NAMEREQD) != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- /* Host name not found. Use ip address. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * if reverse lookup result looks like a numeric hostname,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * someone is trying to trick us by PTR record like following:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * 1.1.1.10.in-addr.arpa. IN PTR 2.3.4.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- memset(&hints, 0, sizeof(hints));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- hints.ai_socktype = SOCK_DGRAM; /*dummy*/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- hints.ai_flags = AI_NUMERICHOST;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (getaddrinfo(name, NULL, &hints, &ai) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- logit("Nasty PTR record \"%s\" is set up for %s, ignoring",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- name, ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- freeaddrinfo(ai);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- /* Names are stored in lowercase. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- lowercase(name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * Map it back to an IP address and check that the given
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * address actually is an address of this host. This is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * necessary because anyone with access to a name server can
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * define arbitrary names for an IP address. Mapping from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * name to IP address can be trusted better (but can still be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * fooled if the intruder has access to the name server of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- * the domain).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- memset(&hints, 0, sizeof(hints));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- hints.ai_family = from.ss_family;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- hints.ai_socktype = SOCK_STREAM;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (getaddrinfo(name, NULL, &hints, &aitop) != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- logit("reverse mapping checking getaddrinfo for %.700s "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- "[%s] failed.", name, ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- /* Look for the address from the list of addresses. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- for (ai = aitop; ai; ai = ai->ai_next) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop2,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- sizeof(ntop2), NULL, 0, NI_NUMERICHOST) == 0 &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- (strcmp(ntop, ntop2) == 0))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- freeaddrinfo(aitop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- /* If we reached the end of the list, the address was not there. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (ai == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- /* Address not found for the host name. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- logit("Address %.100s maps to %.600s, but this does not "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- "map back to the address.", ntop, name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- return xstrdup(name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * Return the canonical name of the host in the other side of the current
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ * connection. The host name is cached, so it is efficient to call this
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/auth2-gss.c b/auth2-gss.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 60e36961..2e9aad3f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/auth2-gss.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/auth2-gss.c
</span> @@ -1,7 +1,7 @@
<span style='display:block; white-space:pre;background:#ffe0e0;'>- /* $OpenBSD: auth2-gss.c,v 1.29 2018/07/31 03:10:27 djm Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* $OpenBSD: auth2-gss.c,v 1.32 2021/01/27 10:15:08 djm Exp $ */
</span>
/*
- * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -291,37 +266,38 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -55,6 +55,48 @@ static int input_gssapi_exchange_complet
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -55,6 +55,48 @@ static int input_gssapi_mic(int type, u_int32_t plen, struct ssh *ssh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int input_gssapi_exchange_complete(int type, u_int32_t plen, struct ssh *ssh);
</span> static int input_gssapi_errtok(int, u_int32_t, struct ssh *);
<span style='display:block; white-space:pre;background:#ffe0e0;'>- /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span> + * The 'gssapi_keyex' userauth mechanism.
+ */
+static int
+userauth_gsskeyex(struct ssh *ssh)
+{
+ Authctxt *authctxt = ssh->authctxt;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int r = -1, authenticated = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int r, authenticated = 0;
</span> + struct sshbuf *b = NULL;
+ gss_buffer_desc mic, gssbuf;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ u_char *p = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ u_char *p;
</span> + size_t len;
+
+ if ((r = sshpkt_get_string(ssh, &p, &len)) != 0 ||
+ (r = sshpkt_get_end(ssh)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "parsing");
</span> +
+ if ((b = sshbuf_new()) == NULL)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: sshbuf_new failed", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("sshbuf_new failed");
</span> +
+ mic.value = p;
+ mic.length = len;
+
+ ssh_gssapi_buildmic(b, authctxt->user, authctxt->service,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "gssapi-keyex");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "gssapi-keyex", ssh->kex->session_id);
</span> +
+ if ((gssbuf.value = sshbuf_mutable_ptr(b)) == NULL)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: sshbuf_mutable_ptr failed", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("sshbuf_mutable_ptr failed");
</span> + gssbuf.length = sshbuf_len(b);
+
+ /* gss_kex_context is NULL with privsep, so we can't check it here */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -336,13 +312,12 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + return (authenticated);
+}
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span> * We only support those mechanisms that we know about (ie ones that we know
* how to check local user kuserok and the like)
<span style='display:block; white-space:pre;background:#ffe0e0;'>- */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -260,7 +302,8 @@ input_gssapi_exchange_complete(int type,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -261,7 +303,8 @@ input_gssapi_exchange_complete(int type, u_int32_t plen, struct ssh *ssh)
</span> if ((r = sshpkt_get_end(ssh)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>- fatal("%s: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fatal_fr(r, "parse packet");
</span>
- authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user));
+ authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -350,7 +325,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
if ((!use_privsep || mm_is_monitor()) &&
(displayname = ssh_gssapi_displayname()) != NULL)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -306,7 +349,8 @@ input_gssapi_mic(int type, u_int32_t ple
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -307,7 +350,8 @@ input_gssapi_mic(int type, u_int32_t plen, struct ssh *ssh)
</span> gssbuf.length = sshbuf_len(b);
if (!GSS_ERROR(PRIVSEP(ssh_gssapi_checkmic(gssctxt, &gssbuf, &mic))))
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -360,7 +335,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> else
logit("GSSAPI MIC check failed");
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -326,6 +370,12 @@ input_gssapi_mic(int type, u_int32_t ple
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -327,6 +371,12 @@ input_gssapi_mic(int type, u_int32_t plen, struct ssh *ssh)
</span> return 0;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -373,9 +348,11 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> Authmethod method_gssapi = {
"gssapi-with-mic",
userauth_gssapi,
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/auth2.c 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/auth2.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -73,6 +73,7 @@ extern Authmethod method_passwd;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/auth2.c b/auth2.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 84d0ed16..f905d5a3 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/auth2.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/auth2.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -71,6 +71,7 @@ extern Authmethod method_passwd;
</span> extern Authmethod method_kbdint;
extern Authmethod method_hostbased;
#ifdef GSSAPI
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -383,7 +360,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> extern Authmethod method_gssapi;
#endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -80,6 +81,7 @@ Authmethod *authmethods[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -78,6 +79,7 @@ Authmethod *authmethods[] = {
</span> &method_none,
&method_pubkey,
#ifdef GSSAPI
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -391,8 +368,126 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> &method_gssapi,
#endif
&method_passwd,
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/clientloop.c 2019-11-08 14:18:24.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/clientloop.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/canohost.c b/canohost.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a810da0e..99f1cd40 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/canohost.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/canohost.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -35,6 +35,97 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "canohost.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "misc.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Returns the remote DNS hostname as a string. The returned string must not
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * be freed. NB. this will usually trigger a DNS query the first time it is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * called.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * This function does additional checks on the hostname to mitigate some
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * attacks on legacy rhosts-style authentication.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++char *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++remote_hostname(struct ssh *ssh)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct sockaddr_storage from;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ socklen_t fromlen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct addrinfo hints, *ai, *aitop;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ char name[NI_MAXHOST], ntop2[NI_MAXHOST];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const char *ntop = ssh_remote_ipaddr(ssh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Get IP address of client. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fromlen = sizeof(from);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ memset(&from, 0, sizeof(from));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (getpeername(ssh_packet_get_connection_in(ssh),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (struct sockaddr *)&from, &fromlen) == -1) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug("getpeername failed: %.100s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ipv64_normalise_mapped(&from, &fromlen);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (from.ss_family == AF_INET6)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fromlen = sizeof(struct sockaddr_in6);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug3("Trying to reverse map address %.100s.", ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Map the IP address to a host name. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (getnameinfo((struct sockaddr *)&from, fromlen, name, sizeof(name),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ NULL, 0, NI_NAMEREQD) != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Host name not found. Use ip address. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * if reverse lookup result looks like a numeric hostname,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * someone is trying to trick us by PTR record like following:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 1.1.1.10.in-addr.arpa. IN PTR 2.3.4.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ memset(&hints, 0, sizeof(hints));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ hints.ai_socktype = SOCK_DGRAM; /*dummy*/
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ hints.ai_flags = AI_NUMERICHOST;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (getaddrinfo(name, NULL, &hints, &ai) == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ logit("Nasty PTR record \"%s\" is set up for %s, ignoring",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ name, ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ freeaddrinfo(ai);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Names are stored in lowercase. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ lowercase(name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Map it back to an IP address and check that the given
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * address actually is an address of this host. This is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * necessary because anyone with access to a name server can
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * define arbitrary names for an IP address. Mapping from
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * name to IP address can be trusted better (but can still be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * fooled if the intruder has access to the name server of
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * the domain).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ memset(&hints, 0, sizeof(hints));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ hints.ai_family = from.ss_family;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ hints.ai_socktype = SOCK_STREAM;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (getaddrinfo(name, NULL, &hints, &aitop) != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ logit("reverse mapping checking getaddrinfo for %.700s "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "[%s] failed.", name, ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Look for the address from the list of addresses. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ for (ai = aitop; ai; ai = ai->ai_next) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop2,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sizeof(ntop2), NULL, 0, NI_NUMERICHOST) == 0 &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (strcmp(ntop, ntop2) == 0))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ freeaddrinfo(aitop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* If we reached the end of the list, the address was not there. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (ai == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Address not found for the host name. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ logit("Address %.100s maps to %.600s, but this does not "
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "map back to the address.", ntop, name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return xstrdup(name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ void
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ipv64_normalise_mapped(struct sockaddr_storage *addr, socklen_t *len)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/canohost.h b/canohost.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 26d62855..0cadc9f1 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/canohost.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/canohost.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -15,6 +15,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifndef _CANOHOST_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #define _CANOHOST_H
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++struct ssh;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++char *remote_hostname(struct ssh *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *get_peer_ipaddr(int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int get_peer_port(int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ char *get_local_ipaddr(int);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/clientloop.c b/clientloop.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index da14d150..d784ddc9 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/clientloop.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/clientloop.c
</span> @@ -112,6 +112,10 @@
#include "ssherr.h"
#include "hostfile.h"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -404,7 +499,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> /* import options */
extern Options options;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1393,9 +1397,18 @@ client_loop(struct ssh *ssh, int have_pt
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1343,9 +1347,18 @@ client_loop(struct ssh *ssh, int have_pty, int escape_char_arg,
</span> break;
/* Do channel operations unless rekeying in progress. */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -424,31 +519,11 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> /* Buffer input from the connection. */
client_process_net_input(ssh, readset);
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/config.h.in 2019-10-09 02:39:34.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/config.h.in 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1884,6 +1884,9 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* Use btmp to log bad logins */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #undef USE_BTMP
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/* platform uses an in-memory credentials cache */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#undef USE_CCAPI
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* Use libedit for sftp */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #undef USE_LIBEDIT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1902,6 +1905,9 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* Define if you have Solaris privileges */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #undef USE_SOLARIS_PRIVS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/* platform has the Security Authorization Session API */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#undef USE_SECURITY_SESSION_API
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* Define if you have Solaris process contracts */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #undef USE_SOLARIS_PROCESS_CONTRACTS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/configure.ac 2019-11-08 15:37:14.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/configure.ac 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -667,6 +667,30 @@ main() { if (NSVersionOfRunTimeLibrary("
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/configure.ac b/configure.ac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 413913a7..29de0ef0 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/configure.ac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/configure.ac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -709,6 +709,30 @@ main() { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16))
</span> [Use tunnel device compatibility to OpenBSD])
AC_DEFINE([SSH_TUN_PREPEND_AF], [1],
[Prepend the address family to IP tunnel traffic])
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -477,12 +552,14 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + [AC_MSG_RESULT([no])]
+ )
m4_pattern_allow([AU_IPv])
<span style='display:block; white-space:pre;background:#ffe0e0;'>- AC_CHECK_DECL([AU_IPv4],
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- AC_DEFINE([LASTLOG_WRITE_PUTUTXLINE], [1],
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/gss-genr.c 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/gss-genr.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ AC_CHECK_DECL([AU_IPv4], [],
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ AC_DEFINE([AU_IPv4], [0], [System only supports IPv4 audit records])
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/gss-genr.c b/gss-genr.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 68528051..cede661b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/gss-genr.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/gss-genr.c
</span> @@ -1,7 +1,7 @@
<span style='display:block; white-space:pre;background:#ffe0e0;'>- /* $OpenBSD: gss-genr.c,v 1.26 2018/07/10 09:13:30 djm Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* $OpenBSD: gss-genr.c,v 1.28 2021/01/27 10:05:28 djm Exp $ */
</span>
/*
- * Copyright (c) 2001-2007 Simon Wilkinson. All rights reserved.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -490,7 +567,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -41,12 +41,36 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -41,9 +41,33 @@
</span> #include "sshbuf.h"
#include "log.h"
#include "ssh2.h"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -502,9 +579,6 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
#include "ssh-gss.h"
<span style='display:block; white-space:pre;background:#ffe0e0;'>- extern u_char *session_id2;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- extern u_int session_id2_len;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span> +typedef struct {
+ char *encoded;
+ gss_OID oid;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -527,7 +601,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> /* sshbuf_get for gss_buffer_desc */
int
ssh_gssapi_get_buffer_desc(struct sshbuf *b, gss_buffer_desc *g)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -62,6 +86,160 @@ ssh_gssapi_get_buffer_desc(struct sshbuf
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -59,6 +83,159 @@ ssh_gssapi_get_buffer_desc(struct sshbuf *b, gss_buffer_desc *g)
</span> return 0;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -539,7 +613,6 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + u_char *p;
+ size_t len;
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span> + if ((r = sshpkt_get_string(ssh, &p, &len)) != 0)
+ return r;
+ g->value = p;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -563,8 +636,8 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + if (GSS_ERROR(gss_indicate_mechs(&min_status, &gss_supported)))
+ return NULL;
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return(ssh_gssapi_kex_mechs(gss_supported, ssh_gssapi_check_mechanism,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ host, client, kex));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return ssh_gssapi_kex_mechs(gss_supported, ssh_gssapi_check_mechanism,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ host, client, kex);
</span> +}
+
+char *
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -572,7 +645,8 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + const char *host, const char *client, const char *kex) {
+ struct sshbuf *buf = NULL;
+ size_t i;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int r, oidpos, enclen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int r = SSH_ERR_ALLOC_FAIL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int oidpos, enclen;
</span> + char *mechs, *encoded;
+ u_char digest[SSH_DIGEST_MAX_LENGTH];
+ char deroid[2];
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -589,7 +663,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + (gss_supported->count + 1));
+
+ if ((buf = sshbuf_new()) == NULL)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: sshbuf_new failed", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("sshbuf_new failed");
</span> +
+ oidpos = 0;
+ s = cp = xstrdup(kex);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -606,12 +680,12 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + gss_supported->elements[i].elements,
+ gss_supported->elements[i].length)) != 0 ||
+ (r = ssh_digest_final(md, digest, sizeof(digest))) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: digest failed: %s", __func__,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "digest failed");
</span> + ssh_digest_free(md);
+ md = NULL;
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ encoded = xmalloc(ssh_digest_bytes(SSH_DIGEST_MD5) * 2);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ encoded = xmalloc(ssh_digest_bytes(SSH_DIGEST_MD5)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2);
</span> + enclen = __b64_ntop(digest,
+ ssh_digest_bytes(SSH_DIGEST_MD5), encoded,
+ ssh_digest_bytes(SSH_DIGEST_MD5) * 2);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -621,12 +695,10 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + (p = strsep(&cp, ","))) {
+ if (sshbuf_len(buf) != 0 &&
+ (r = sshbuf_put_u8(buf, ',')) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: sshbuf_put_u8 error: %s",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "sshbuf_put_u8 error");
</span> + if ((r = sshbuf_put(buf, p, strlen(p))) != 0 ||
+ (r = sshbuf_put(buf, encoded, enclen)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: sshbuf_put error: %s",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "sshbuf_put error");
</span> + }
+
+ gss_enc2oid[oidpos].oid = &(gss_supported->elements[i]);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -639,7 +711,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + gss_enc2oid[oidpos].encoded = NULL;
+
+ if ((mechs = sshbuf_dup_string(buf)) == NULL)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: sshbuf_dup_string failed", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("sshbuf_dup_string failed");
</span> +
+ sshbuf_free(buf);
+
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -673,6 +745,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + default:
+ return GSS_C_NO_OID;
+ }
<span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span> +#undef SKIP_KEX_NAME
+
+ while (gss_enc2oid[i].encoded != NULL &&
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -688,7 +761,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> /* Check that the OID in a data stream matches that in the context */
int
ssh_gssapi_check_oid(Gssctxt *ctx, void *data, size_t len)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -218,7 +396,7 @@ ssh_gssapi_init_ctx(Gssctxt *ctx, int de
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -215,7 +392,7 @@ ssh_gssapi_init_ctx(Gssctxt *ctx, int deleg_creds, gss_buffer_desc *recv_tok,
</span> }
ctx->major = gss_init_sec_context(&ctx->minor,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -697,10 +770,11 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> GSS_C_MUTUAL_FLAG | GSS_C_INTEG_FLAG | deleg_flag,
0, NULL, recv_tok, NULL, send_tok, flags, NULL);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -248,8 +426,42 @@ ssh_gssapi_import_name(Gssctxt *ctx, con
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -244,9 +421,43 @@ ssh_gssapi_import_name(Gssctxt *ctx, const char *host)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (ctx->major);
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>- OM_uint32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++OM_uint32
</span> +ssh_gssapi_client_identity(Gssctxt *ctx, const char *name)
+{
+ gss_buffer_desc gssbuf;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -731,7 +805,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + return(ctx->major);
+}
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+OM_uint32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ OM_uint32
</span> ssh_gssapi_sign(Gssctxt *ctx, gss_buffer_t buffer, gss_buffer_t hash)
{
+ if (ctx == NULL)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -740,7 +814,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> if ((ctx->major = gss_get_mic(&ctx->minor, ctx->context,
GSS_C_QOP_DEFAULT, buffer, hash)))
ssh_gssapi_error(ctx);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -257,6 +469,19 @@ ssh_gssapi_sign(Gssctxt *ctx, gss_buffer
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -254,6 +465,19 @@ ssh_gssapi_sign(Gssctxt *ctx, gss_buffer_t buffer, gss_buffer_t hash)
</span> return (ctx->major);
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -759,8 +833,8 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +
void
ssh_gssapi_buildmic(struct sshbuf *b, const char *user, const char *service,
<span style='display:block; white-space:pre;background:#ffe0e0;'>- const char *context)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -273,11 +498,16 @@ ssh_gssapi_buildmic(struct sshbuf *b, co
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *context, const struct sshbuf *session_id)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -270,11 +494,16 @@ ssh_gssapi_buildmic(struct sshbuf *b, const char *user, const char *service,
</span> }
int
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -778,7 +852,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
/* RFC 4462 says we MUST NOT do SPNEGO */
if (oid->length == spnego_oid.length &&
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -287,6 +517,10 @@ ssh_gssapi_check_mechanism(Gssctxt **ctx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -284,6 +513,10 @@ ssh_gssapi_check_mechanism(Gssctxt **ctx, gss_OID oid, const char *host)
</span> ssh_gssapi_build_ctx(ctx);
ssh_gssapi_set_oid(*ctx, oid);
major = ssh_gssapi_import_name(*ctx, host);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -789,7 +863,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> if (!GSS_ERROR(major)) {
major = ssh_gssapi_init_ctx(*ctx, 0, GSS_C_NO_BUFFER, &token,
NULL);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -296,10 +530,66 @@ ssh_gssapi_check_mechanism(Gssctxt **ctx
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -293,10 +526,66 @@ ssh_gssapi_check_mechanism(Gssctxt **ctx, gss_OID oid, const char *host)
</span> GSS_C_NO_BUFFER);
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -857,8 +931,10 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +}
+
#endif /* GSSAPI */
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/gss-serv-krb5.c 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/gss-serv-krb5.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/gss-serv-krb5.c b/gss-serv-krb5.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a151bc1e..ef20401e 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/gss-serv-krb5.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/gss-serv-krb5.c
</span> @@ -1,7 +1,7 @@
/* $OpenBSD: gss-serv-krb5.c,v 1.9 2018/07/09 21:37:55 markus Exp $ */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -868,21 +944,20 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -120,7 +120,7 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_cl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -120,7 +120,7 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_client *client)
</span> krb5_error_code problem;
krb5_principal princ;
OM_uint32 maj_status, min_status;
- int len;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ const char *new_ccname, *new_cctype;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const char *new_ccname;
</span> const char *errmsg;
if (client->creds == NULL) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -180,11 +180,26 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_cl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -180,11 +180,16 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_client *client)
</span> return;
}
- client->store.filename = xstrdup(krb5_cc_get_name(krb_context, ccache));
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ new_cctype = krb5_cc_get_type(krb_context, ccache);
</span> + new_ccname = krb5_cc_get_name(krb_context, ccache);
+
client->store.envvar = "KRB5CCNAME";
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -893,22 +968,13 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + xasprintf(&client->store.envval, "API:%s", new_ccname);
+ client->store.filename = NULL;
+#else
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (new_ccname[0] == ':')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ new_ccname++;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ xasprintf(&client->store.envval, "%s:%s", new_cctype, new_ccname);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (strcmp(new_cctype, "DIR") == 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ char *p;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ p = strrchr(client->store.envval, '/');
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (p)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *p = '\0';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((strcmp(new_cctype, "FILE") == 0) || (strcmp(new_cctype, "DIR") == 0))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ client->store.filename = xstrdup(new_ccname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ xasprintf(&client->store.envval, "FILE:%s", new_ccname);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ client->store.filename = xstrdup(new_ccname);
</span> +#endif
#ifdef USE_PAM
if (options.use_pam)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -193,9 +208,76 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_cl
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -193,9 +198,76 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_client *client)
</span>
krb5_cc_close(krb_context, ccache);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -928,9 +994,9 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + OM_uint32 maj_status, min_status;
+
+ if ((problem = krb5_cc_resolve(krb_context, store->envval, &ccache))) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ logit("krb5_cc_resolve(): %.100s",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ krb5_get_err_text(krb_context, problem));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ logit("krb5_cc_resolve(): %.100s",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ krb5_get_err_text(krb_context, problem));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return 0;
</span> + }
+
+ /* Find out who the principal in this cache is */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -985,7 +1051,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> ssh_gssapi_mech gssapi_kerberos_mech = {
"toWM5Slw5Ew8Mqkay+al2g==",
"Kerberos",
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -203,7 +285,8 @@ ssh_gssapi_mech gssapi_kerberos_mech = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -203,7 +275,8 @@ ssh_gssapi_mech gssapi_kerberos_mech = {
</span> NULL,
&ssh_gssapi_krb5_userok,
NULL,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -995,10 +1061,12 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> };
#endif /* KRB5 */
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/gss-serv.c 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/gss-serv.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/gss-serv.c b/gss-serv.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index b5d4bb2d..4287579a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/gss-serv.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/gss-serv.c
</span> @@ -1,7 +1,7 @@
<span style='display:block; white-space:pre;background:#ffe0e0;'>- /* $OpenBSD: gss-serv.c,v 1.31 2018/07/09 21:37:55 markus Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* $OpenBSD: gss-serv.c,v 1.32 2020/03/13 03:17:07 djm Exp $ */
</span>
/*
- * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1006,7 +1074,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> *
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -44,17 +44,20 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -44,17 +44,19 @@
</span> #include "session.h"
#include "misc.h"
#include "servconf.h"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1018,10 +1086,10 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> extern ServerOptions options;
static ssh_gssapi_client gssapi_client =
<span style='display:block; white-space:pre;background:#ffe0e0;'>- { GSS_C_EMPTY_BUFFER, GSS_C_EMPTY_BUFFER,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- { GSS_C_EMPTY_BUFFER, GSS_C_EMPTY_BUFFER,
</span> - GSS_C_NO_CREDENTIAL, NULL, {NULL, NULL, NULL, NULL}};
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ GSS_C_NO_CREDENTIAL, GSS_C_NO_NAME, NULL,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ {NULL, NULL, NULL, NULL, NULL}, 0, 0};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ { GSS_C_EMPTY_BUFFER, GSS_C_EMPTY_BUFFER, GSS_C_NO_CREDENTIAL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ GSS_C_NO_NAME, NULL, {NULL, NULL, NULL, NULL, NULL}, 0, 0};
</span>
ssh_gssapi_mech gssapi_null_mech =
- { NULL, NULL, {0, NULL}, NULL, NULL, NULL, NULL};
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1029,10 +1097,11 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
#ifdef KRB5
extern ssh_gssapi_mech gssapi_kerberos_mech;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -141,6 +144,29 @@ ssh_gssapi_server_ctx(Gssctxt **ctx, gss
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -140,6 +142,29 @@ ssh_gssapi_server_ctx(Gssctxt **ctx, gss_OID oid)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ return (ssh_gssapi_acquire_cred(*ctx));
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>- /* Unprivileged */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/* Unprivileged */
</span> +char *
+ssh_gssapi_server_mechanisms(void) {
+ if (supported_oids == NULL)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1055,11 +1124,10 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + return (res);
+}
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+/* Unprivileged */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* Unprivileged */
</span> void
ssh_gssapi_supported_oids(gss_OID_set *oidset)
<span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -150,7 +176,9 @@ ssh_gssapi_supported_oids(gss_OID_set *o
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -150,7 +175,9 @@ ssh_gssapi_supported_oids(gss_OID_set *oidset)
</span> gss_OID_set supported;
gss_create_empty_oid_set(&min_status, oidset);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1070,7 +1138,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
while (supported_mechs[i]->name != NULL) {
if (GSS_ERROR(gss_test_oid_set_member(&min_status,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -276,8 +304,48 @@ OM_uint32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -276,8 +303,48 @@ OM_uint32
</span> ssh_gssapi_getclient(Gssctxt *ctx, ssh_gssapi_client *client)
{
int i = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1092,7 +1160,8 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + ssh_gssapi_error(ctx);
+ return (ctx->major);
+ }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- gss_buffer_desc ename;
</span> + ctx->major = gss_compare_name(&ctx->minor, client->name,
+ new_name, &equal);
+
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1105,8 +1174,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + debug("Rekeyed credentials have different name");
+ return GSS_S_COMPLETE;
+ }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- gss_buffer_desc ename;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span> + debug("Marking rekeyed credentials for export");
+
+ gss_release_name(&ctx->minor, &client->name);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1120,7 +1188,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
client->mech = NULL;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -292,6 +360,13 @@ ssh_gssapi_getclient(Gssctxt *ctx, ssh_g
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -292,6 +359,13 @@ ssh_gssapi_getclient(Gssctxt *ctx, ssh_gssapi_client *client)
</span> if (client->mech == NULL)
return GSS_S_FAILURE;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1134,7 +1202,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> if ((ctx->major = gss_display_name(&ctx->minor, ctx->client,
&client->displayname, NULL))) {
ssh_gssapi_error(ctx);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -309,6 +384,8 @@ ssh_gssapi_getclient(Gssctxt *ctx, ssh_g
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -309,6 +383,8 @@ ssh_gssapi_getclient(Gssctxt *ctx, ssh_gssapi_client *client)
</span> return (ctx->major);
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1143,7 +1211,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> /* We can't copy this structure, so we just move the pointer to it */
client->creds = ctx->client_creds;
ctx->client_creds = GSS_C_NO_CREDENTIAL;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -319,11 +396,20 @@ ssh_gssapi_getclient(Gssctxt *ctx, ssh_g
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -319,11 +395,20 @@ ssh_gssapi_getclient(Gssctxt *ctx, ssh_gssapi_client *client)
</span> void
ssh_gssapi_cleanup_creds(void)
{
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1157,10 +1225,10 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +
+ if (gssapi_client.store.data != NULL) {
+ if ((problem = krb5_cc_resolve(gssapi_client.store.data, gssapi_client.store.envval, &ccache))) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug("%s: krb5_cc_resolve(): %.100s", __func__,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug_f("krb5_cc_resolve(): %.100s",
</span> + krb5_get_err_text(gssapi_client.store.data, problem));
+ } else if ((problem = krb5_cc_destroy(gssapi_client.store.data, ccache))) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug("%s: krb5_cc_resolve(): %.100s", __func__,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug_f("krb5_cc_destroy(): %.100s",
</span> + krb5_get_err_text(gssapi_client.store.data, problem));
+ } else {
+ krb5_free_context(gssapi_client.store.data);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1169,7 +1237,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> }
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -356,19 +442,23 @@ ssh_gssapi_do_child(char ***envp, u_int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -356,19 +441,23 @@ ssh_gssapi_do_child(char ***envp, u_int *envsizep)
</span>
/* Privileged */
int
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1196,7 +1264,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> /* Destroy delegated credentials if userok fails */
gss_release_buffer(&lmin, &gssapi_client.displayname);
gss_release_buffer(&lmin, &gssapi_client.exportedname);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -382,14 +472,90 @@ ssh_gssapi_userok(char *user)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -382,14 +471,90 @@ ssh_gssapi_userok(char *user)
</span> return (0);
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1250,14 +1318,14 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + * be next to impossible. In any case, we may want different options
+ * for rekeying. So, use our own :)
+ */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef USE_PAM
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef USE_PAM
</span> + if (!use_privsep) {
+ debug("Not even going to try and do PAM with privsep disabled");
+ return;
+ }
+
+ ret = pam_start("sshd-rekey", gssapi_client.store.owner->pw_name,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ &pamconv, &pamh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ &pamconv, &pamh);
</span> + if (ret)
+ return;
+
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1293,9 +1361,11 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> }
/* Privileged */
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/kex.c 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/kex.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -55,11 +55,16 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/kex.c b/kex.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 709a0ec6..d369c46b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/kex.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/kex.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -57,11 +57,16 @@
</span> #include "misc.h"
#include "dispatch.h"
#include "monitor.h"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1312,7 +1382,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> /* prototype */
static int kex_choose_conf(struct ssh *);
static int kex_input_newkeys(int, u_int32_t, struct ssh *);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -113,15 +118,27 @@ static const struct kexalg kexalgs[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -117,15 +122,28 @@ static const struct kexalg kexalgs[] = {
</span> #endif /* HAVE_EVP_SHA256 || !WITH_OPENSSL */
{ NULL, 0, -1, -1},
};
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1321,12 +1391,13 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + { KEX_GSS_GEX_SHA1_ID, KEX_GSS_GEX_SHA1, 0, SSH_DIGEST_SHA1 },
+ { KEX_GSS_GRP1_SHA1_ID, KEX_GSS_GRP1_SHA1, 0, SSH_DIGEST_SHA1 },
+ { KEX_GSS_GRP14_SHA1_ID, KEX_GSS_GRP14_SHA1, 0, SSH_DIGEST_SHA1 },
<span style='display:block; white-space:pre;background:#e0ffe0;'>++ { KEX_GSS_GRP14_SHA256_ID, KEX_GSS_GRP14_SHA256, 0, SSH_DIGEST_SHA256 },
</span> + { KEX_GSS_GRP16_SHA512_ID, KEX_GSS_GRP16_SHA512, 0, SSH_DIGEST_SHA512 },
+ { KEX_GSS_NISTP256_SHA256_ID, KEX_GSS_NISTP256_SHA256,
+ NID_X9_62_prime256v1, SSH_DIGEST_SHA256 },
+ { KEX_GSS_C25519_SHA256_ID, KEX_GSS_C25519_SHA256, 0, SSH_DIGEST_SHA256 },
+#endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ { NULL, -1, -1, -1 },
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ { NULL, 0, -1, -1},
</span> +};
-char *
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1343,7 +1414,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> if (ret != NULL)
ret[rlen++] = sep;
nlen = strlen(k->name);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -136,6 +153,18 @@ kex_alg_list(char sep)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -140,6 +158,18 @@ kex_alg_list(char sep)
</span> return ret;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1362,20 +1433,18 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> static const struct kexalg *
kex_alg_by_name(const char *name)
{
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -145,6 +174,12 @@ kex_alg_by_name(const char *name)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -149,6 +179,10 @@ kex_alg_by_name(const char *name)
</span> if (strcmp(k->name, name) == 0)
return k;
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef GSSAPI
</span> + for (k = gss_kexalgs; k->name != NULL; k++) {
+ if (strncmp(k->name, name, strlen(k->name)) == 0)
+ return k;
+ }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span> return NULL;
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -313,6 +348,29 @@ kex_assemble_names(char **listp, const c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -317,6 +351,29 @@ kex_assemble_names(char **listp, const char *def, const char *all)
</span> return r;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1405,22 +1474,24 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> /* put algorithm proposal into buffer */
int
kex_prop2buf(struct sshbuf *b, char *proposal[PROPOSAL_MAX])
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -696,6 +754,9 @@ kex_free(struct kex *kex)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -699,6 +756,9 @@ kex_free(struct kex *kex)
</span> sshbuf_free(kex->server_version);
sshbuf_free(kex->client_pub);
<span style='display:block; white-space:pre;background:#ffe0e0;'>- free(kex->session_id);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sshbuf_free(kex->session_id);
</span> +#ifdef GSSAPI
+ free(kex->gss_host);
+#endif /* GSSAPI */
free(kex->failed_choice);
free(kex->hostkey_alg);
free(kex->name);
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/kex.h 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/kex.h 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/kex.h b/kex.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 9605ed52..0677208a 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/kex.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/kex.h
</span> @@ -102,6 +102,15 @@ enum kex_exchange {
KEX_ECDH_SHA2,
KEX_C25519_SHA256,
<span style='display:block; white-space:pre;background:#ffe0e0;'>- KEX_KEM_SNTRUP4591761X25519_SHA512,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ KEX_KEM_SNTRUP761X25519_SHA512,
</span> +#ifdef GSSAPI
+ KEX_GSS_GRP1_SHA1,
+ KEX_GSS_GRP14_SHA1,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1433,20 +1504,20 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> KEX_MAX
};
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -153,6 +162,12 @@ struct kex {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -152,6 +161,12 @@ struct kex {
</span> u_int flags;
int hash_alg;
int ec_nid;
+#ifdef GSSAPI
+ int gss_deleg_creds;
+ int gss_trust_dns;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ char *gss_host;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ char *gss_host;
</span> + char *gss_client;
+#endif
char *failed_choice;
int (*verify_host_key)(struct sshkey *, struct ssh *);
struct sshkey *(*load_host_public_key)(int, int, struct ssh *);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -174,8 +189,10 @@ struct kex {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -173,8 +188,10 @@ struct kex {
</span>
int kex_names_valid(const char *);
char *kex_alg_list(char);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1457,18 +1528,20 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
int kex_exchange_identification(struct ssh *, int, const char *);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -202,6 +219,10 @@ int kexgex_client(struct ssh *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -202,6 +219,12 @@ int kexgex_client(struct ssh *);
</span> int kexgex_server(struct ssh *);
int kex_gen_client(struct ssh *);
int kex_gen_server(struct ssh *);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef GSSAPI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(GSSAPI) && defined(WITH_OPENSSL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int kexgssgex_client(struct ssh *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int kexgssgex_server(struct ssh *);
</span> +int kexgss_client(struct ssh *);
+int kexgss_server(struct ssh *);
+#endif
int kex_dh_keypair(struct kex *);
int kex_dh_enc(struct kex *, const struct sshbuf *, struct sshbuf **,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -234,6 +255,12 @@ int kexgex_hash(int, const struct sshbu
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -234,6 +257,12 @@ int kexgex_hash(int, const struct sshbuf *, const struct sshbuf *,
</span> const BIGNUM *, const u_char *, size_t,
u_char *, size_t *);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1481,9 +1554,53 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> void kexc25519_keygen(u_char key[CURVE25519_SIZE], u_char pub[CURVE25519_SIZE])
__attribute__((__bounded__(__minbytes__, 1, CURVE25519_SIZE)))
__attribute__((__bounded__(__minbytes__, 2, CURVE25519_SIZE)));
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null 1970-01-01 00:00:00.000000000 +0000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/kexgssc.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,405 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/kexdh.c b/kexdh.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index c1084f21..0faab21b 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/kexdh.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/kexdh.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -49,13 +49,23 @@ kex_dh_keygen(struct kex *kex)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ switch (kex->kex_type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case KEX_DH_GRP1_SHA1:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef GSSAPI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ case KEX_GSS_GRP1_SHA1:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ kex->dh = dh_new_group1();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case KEX_DH_GRP14_SHA1:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case KEX_DH_GRP14_SHA256:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef GSSAPI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ case KEX_GSS_GRP14_SHA1:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ case KEX_GSS_GRP14_SHA256:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ kex->dh = dh_new_group14();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case KEX_DH_GRP16_SHA512:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef GSSAPI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ case KEX_GSS_GRP16_SHA512:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ kex->dh = dh_new_group16();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ case KEX_DH_GRP18_SHA512:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/kexgen.c b/kexgen.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index bde28053..31f90f50 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/kexgen.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/kexgen.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -44,7 +44,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int input_kex_gen_init(int, u_int32_t, struct ssh *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static int input_kex_gen_reply(int type, u_int32_t seq, struct ssh *ssh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-static int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ kex_gen_hash(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int hash_alg,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const struct sshbuf *client_version,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/kexgssc.c b/kexgssc.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 00000000..1c62740e
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/kexgssc.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,599 @@
</span> +/*
+ * Copyright (c) 2001-2009 Simon Wilkinson. All rights reserved.
+ *
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1512,6 +1629,8 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +
+#if defined(GSSAPI) && defined(WITH_OPENSSL)
+
<span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "includes.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span> +#include <openssl/crypto.h>
+#include <openssl/bn.h>
+
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1532,22 +1651,18 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +#include "ssh-gss.h"
+
+int
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+kexgss_client(struct ssh *ssh) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++kexgss_client(struct ssh *ssh)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span> + struct kex *kex = ssh->kex;
+ gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER,
+ recv_tok = GSS_C_EMPTY_BUFFER,
+ gssbuf, msg_tok = GSS_C_EMPTY_BUFFER, *token_ptr;
+ Gssctxt *ctxt;
+ OM_uint32 maj_status, min_status, ret_flags;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ BIGNUM *p = NULL, *g = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ struct sshbuf *buf = NULL;
</span> + struct sshbuf *server_blob = NULL;
+ struct sshbuf *shared_secret = NULL;
+ struct sshbuf *server_host_key_blob = NULL;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ struct sshbuf *empty = sshbuf_new();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ BIGNUM *dh_server_pub = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ const BIGNUM *pub_key, *dh_p, *dh_g;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int nbits = 0, min = DH_GRP_MIN, max = DH_GRP_MAX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct sshbuf *empty = NULL;
</span> + u_char *msg;
+ int type = 0;
+ int first = 1;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1583,42 +1698,8 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + case KEX_GSS_C25519_SHA256:
+ r = kex_c25519_keypair(kex);
+ break;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ case KEX_GSS_GEX_SHA1:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug("Doing group exchange");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ nbits = dh_estimate(kex->dh_need * 8);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->min = DH_GRP_MIN;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->max = DH_GRP_MAX;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->nbits = nbits;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_GROUPREQ)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_put_u32(ssh, min)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_put_u32(ssh, nbits)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_put_u32(ssh, max)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_send(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("Failed to construct a packet: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = ssh_packet_read_expect(ssh, SSH2_MSG_KEXGSS_GROUP)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("Error: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = sshpkt_get_bignum2(ssh, &p)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_get_bignum2(ssh, &g)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_get_end(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("shpkt_get_bignum2 failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (BN_num_bits(p) < min || BN_num_bits(p) > max)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("GSSGRP_GEX group out of range: %d !< %d !< %d",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ min, BN_num_bits(p), max);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((kex->dh = dh_new_group(g, p)) == NULL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("dn_new_group() failed");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ p = g = NULL; /* belong to kex->dh now */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = dh_gen_key(kex->dh, kex->we_need * 8)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ goto out;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ DH_get0_key(kex->dh, &pub_key, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span> + default:
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: Unexpected KEX type %d", __func__, kex->kex_type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("Unexpected KEX type %d", kex->kex_type);
</span> + }
+ if (r != 0)
+ return r;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1626,7 +1707,6 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + token_ptr = GSS_C_NO_BUFFER;
+
+ do {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* Step 2 - call GSS_Init_sec_context() */
</span> + debug("Calling gss_init_sec_context");
+
+ maj_status = ssh_gssapi_init_ctx(ctxt,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1668,10 +1748,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_INIT)) != 0 ||
+ (r = sshpkt_put_string(ssh, send_tok.value,
+ send_tok.length)) != 0 ||
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (KEX_GSS_GEX_SHA1 == kex->kex_type &&
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_put_bignum2(ssh, pub_key)) != 0) ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (KEX_GSS_GEX_SHA1 != kex->kex_type &&
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_put_stringb(ssh, kex->client_pub)) != 0))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_stringb(ssh, kex->client_pub)) != 0)
</span> + fatal("failed to construct packet: %s", ssh_err(r));
+ first = 0;
+ } else {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1701,8 +1778,6 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + debug("Received GSSAPI_CONTINUE");
+ if (maj_status == GSS_S_COMPLETE)
+ fatal("GSSAPI Continue received from server when complete");
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (maj_status == GSS_S_COMPLETE)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("GSSAPI Continue received from server when complete");
</span> + if ((r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
+ &recv_tok)) != 0 ||
+ (r = sshpkt_get_end(ssh)) != 0)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1722,9 +1797,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + fatal("sshpkt failed: %s", ssh_err(r));
+ if (c) {
+ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ssh, &recv_tok)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (KEX_GSS_GEX_SHA1 == kex->kex_type &&
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_get_end(ssh)) != 0))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ssh, &recv_tok)) != 0)
</span> + fatal("Failed to read token: %s", ssh_err(r));
+ /* If we're already complete - protocol error */
+ if (maj_status == GSS_S_COMPLETE)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1761,14 +1834,13 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +
+ /*
+ * We _must_ have received a COMPLETE message in reply from the
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * server, which will have set dh_server_pub and msg_tok
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * server, which will have set server_blob and msg_tok
</span> + */
+
+ if (type != SSH2_MSG_KEXGSS_COMPLETE)
+ fatal("Didn't receive a SSH2_MSG_KEXGSS_COMPLETE when I expected it");
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* 7. C verifies that the key Q_S is valid */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* 8. C computes shared secret */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* compute shared secret */
</span> + switch (kex->kex_type) {
+ case KEX_GSS_GRP1_SHA1:
+ case KEX_GSS_GRP14_SHA1:
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1791,20 +1863,6 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +
+ r = kex_ecdh_dec(kex, server_blob, &shared_secret);
+ break;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ case KEX_GSS_GEX_SHA1:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((buf = sshbuf_new()) == NULL ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshbuf_put_stringb(buf, server_blob)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshbuf_get_bignum2(buf, &dh_server_pub)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ goto out;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ sshbuf_free(buf);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((shared_secret = sshbuf_new()) == NULL) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ r = SSH_ERR_ALLOC_FAIL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ goto out;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ r = kex_dh_compute_key(kex, dh_server_pub, shared_secret);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span> + default:
+ r = SSH_ERR_INVALID_ARGUMENT;
+ break;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1812,39 +1870,25 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + if (r != 0)
+ goto out;
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ hashlen = sizeof(hash);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (KEX_GSS_GEX_SHA1 == kex->kex_type) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ DH_get0_pqg(kex->dh, &dh_p, NULL, &dh_g);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = kexgex_hash(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->hash_alg,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->client_version,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->server_version,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->my,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->peer,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (server_host_key_blob ? server_host_key_blob : empty),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->min, kex->nbits, kex->max,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ dh_p, dh_g,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ pub_key,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ dh_server_pub,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ sshbuf_ptr(shared_secret), sshbuf_len(shared_secret),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ hash, &hashlen)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("Failed to calculate hash: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = kex_gen_hash(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->hash_alg,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->client_version,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->server_version,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->my,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->peer,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (server_host_key_blob ? server_host_key_blob : empty),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->client_pub,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ server_blob,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ shared_secret,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ hash, &hashlen)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: Unexpected KEX type %d", __func__, kex->kex_type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((empty = sshbuf_new()) == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ r = SSH_ERR_ALLOC_FAIL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto out;
</span> + }
+
<span style='display:block; white-space:pre;background:#e0ffe0;'>++ hashlen = sizeof(hash);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = kex_gen_hash(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->hash_alg,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->client_version,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->server_version,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->my,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->peer,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (server_host_key_blob ? server_host_key_blob : empty),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->client_pub,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ server_blob,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ shared_secret,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ hash, &hashlen)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("Unexpected KEX type %d", kex->kex_type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span> + gssbuf.value = hash;
+ gssbuf.length = hashlen;
+
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1854,13 +1898,6 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +
+ gss_release_buffer(&min_status, &msg_tok);
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* save session id */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((KEX_GSS_GEX_SHA1 == kex->kex_type) && (kex->session_id == NULL)) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->session_id_len = hashlen;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->session_id = xmalloc(kex->session_id_len);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ memcpy(kex->session_id, hash, kex->session_id_len);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span> + if (kex->gss_deleg_creds)
+ ssh_gssapi_credentials_updated(ctxt);
+
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1869,16 +1906,12 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + else
+ ssh_gssapi_delete_ctx(&ctxt);
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* Finally derive the keys and send them */
</span> + if ((r = kex_derive_keys(ssh, hash, hashlen, shared_secret)) == 0)
+ r = kex_send_newkeys(ssh);
+
+out:
+ explicit_bzero(hash, sizeof(hash));
+ explicit_bzero(kex->c25519_client_key, sizeof(kex->c25519_client_key));
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ DH_free(kex->dh);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->dh = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ BN_clear_free(dh_server_pub);
</span> + sshbuf_free(empty);
+ sshbuf_free(server_host_key_blob);
+ sshbuf_free(server_blob);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -1888,181 +1921,406 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + return r;
+}
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif /* defined(GSSAPI) && defined(WITH_OPENSSL) */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null 1970-01-01 00:00:00.000000000 +0000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/kexgsss.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,345 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Copyright (c) 2001-2009 Simon Wilkinson. All rights reserved.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Redistribution and use in source and binary forms, with or without
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * modification, are permitted provided that the following conditions
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * are met:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * 1. Redistributions of source code must retain the above copyright
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * notice, this list of conditions and the following disclaimer.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * 2. Redistributions in binary form must reproduce the above copyright
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * notice, this list of conditions and the following disclaimer in the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * documentation and/or other materials provided with the distribution.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "includes.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#if defined(GSSAPI) && defined(WITH_OPENSSL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <string.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <openssl/crypto.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <openssl/bn.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "xmalloc.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "sshbuf.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "ssh2.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "sshkey.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "cipher.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "kex.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "log.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "packet.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "dh.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "ssh-gss.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "monitor_wrap.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "misc.h" /* servconf.h needs misc.h for struct ForwardOptions */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "servconf.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "digest.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "ssherr.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+extern ServerOptions options;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span> +int
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+kexgss_server(struct ssh *ssh)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++kexgssgex_client(struct ssh *ssh)
</span> +{
+ struct kex *kex = ssh->kex;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int r = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ OM_uint32 maj_status, min_status;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Some GSSAPI implementations use the input value of ret_flags (an
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * output variable) as a means of triggering mechanism specific
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * features. Initializing it to zero avoids inadvertently
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * activating this non-standard behaviour.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ OM_uint32 ret_flags = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ gss_buffer_desc gssbuf, recv_tok, msg_tok;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ Gssctxt *ctxt = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ recv_tok = GSS_C_EMPTY_BUFFER, gssbuf,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ msg_tok = GSS_C_EMPTY_BUFFER, *token_ptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Gssctxt *ctxt;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ OM_uint32 maj_status, min_status, ret_flags;
</span> + struct sshbuf *shared_secret = NULL;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ struct sshbuf *client_pubkey = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ struct sshbuf *server_pubkey = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ struct sshbuf *empty = sshbuf_new();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int min = -1, max = -1, nbits = -1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int cmin = -1, cmax = -1; /* client proposal */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ BIGNUM *dh_client_pub = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ const BIGNUM *pub_key, *dh_p, *dh_g;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ BIGNUM *p = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ BIGNUM *g = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct sshbuf *buf = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct sshbuf *server_host_key_blob = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct sshbuf *server_blob = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ BIGNUM *dh_server_pub = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ u_char *msg;
</span> + int type = 0;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ gss_OID oid;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ char *mechs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int first = 1;
</span> + u_char hash[SSH_DIGEST_MAX_LENGTH];
+ size_t hashlen;
<span style='display:block; white-space:pre;background:#e0ffe0;'>++ const BIGNUM *pub_key, *dh_p, *dh_g;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int nbits = 0, min = DH_GRP_MIN, max = DH_GRP_MAX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct sshbuf *empty = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ u_char c;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int r;
</span> +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* Initialise GSSAPI */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Initialise our GSSAPI world */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ssh_gssapi_build_ctx(&ctxt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (ssh_gssapi_id_kex(ctxt, kex->name, kex->kex_type)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ == GSS_C_NO_OID)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Couldn't identify host exchange");
</span> +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* If we're rekeying, privsep means that some of the private structures
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * in the GSSAPI code are no longer available. This kludges them back
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * into life
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (!ssh_gssapi_oid_table_ok()) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ mechs = ssh_gssapi_server_mechanisms();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ free(mechs);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (ssh_gssapi_import_name(ctxt, kex->gss_host))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Couldn't import hostname");
</span> +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug2("%s: Identifying %s", __func__, kex->name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ oid = ssh_gssapi_id_kex(NULL, kex->name, kex->kex_type);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (oid == GSS_C_NO_OID)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("Unknown gssapi mechanism");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (kex->gss_client &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ssh_gssapi_client_identity(ctxt, kex->gss_client))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Couldn't acquire client credentials");
</span> +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug2("%s: Acquiring credentials", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug("Doing group exchange");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ nbits = dh_estimate(kex->dh_need * 8);
</span> +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (GSS_ERROR(PRIVSEP(ssh_gssapi_server_ctx(&ctxt, oid))))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("Unable to acquire credentials for the server");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->min = DH_GRP_MIN;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->max = DH_GRP_MAX;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->nbits = nbits;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_GROUPREQ)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_u32(ssh, min)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_u32(ssh, nbits)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_u32(ssh, max)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_send(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Failed to construct a packet: %s", ssh_err(r));
</span> +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (KEX_GSS_GEX_SHA1 == kex->kex_type) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* 5. S generates an ephemeral key pair (do the allocations early) */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug("Doing group exchange");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ssh_packet_read_expect(ssh, SSH2_MSG_KEXGSS_GROUPREQ);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* store client proposal to provide valid signature */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = sshpkt_get_u32(ssh, &cmin)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_get_u32(ssh, &nbits)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_get_u32(ssh, &cmax)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_get_end(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->nbits = nbits;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->min = cmin;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->max = cmax;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ min = MAX(DH_GRP_MIN, cmin);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ max = MIN(DH_GRP_MAX, cmax);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ nbits = MAXIMUM(DH_GRP_MIN, nbits);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ nbits = MINIMUM(DH_GRP_MAX, nbits);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (max < min || nbits < min || max < nbits)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("GSS_GEX, bad parameters: %d !< %d !< %d",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ min, nbits, max);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->dh = PRIVSEP(choose_dh(min, nbits, max));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (kex->dh == NULL) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ sshpkt_disconnect(ssh, "Protocol error: no matching group found");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("Protocol error: no matching group found");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = ssh_packet_read_expect(ssh, SSH2_MSG_KEXGSS_GROUP)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Error: %s", ssh_err(r));
</span> +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ DH_get0_pqg(kex->dh, &dh_p, NULL, &dh_g);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_GROUP)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_put_bignum2(ssh, dh_p)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_put_bignum2(ssh, dh_g)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_send(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_get_bignum2(ssh, &p)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_bignum2(ssh, &g)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_end(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("shpkt_get_bignum2 failed: %s", ssh_err(r));
</span> +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = ssh_packet_write_wait(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("ssh_packet_write_wait: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (BN_num_bits(p) < min || BN_num_bits(p) > max)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("GSSGRP_GEX group out of range: %d !< %d !< %d",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ min, BN_num_bits(p), max);
</span> +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* Compute our exchange value in parallel with the client */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = dh_gen_key(kex->dh, kex->we_need * 8)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ goto out;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((kex->dh = dh_new_group(g, p)) == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("dn_new_group() failed");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ p = g = NULL; /* belong to kex->dh now */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = dh_gen_key(kex->dh, kex->we_need * 8)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto out;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DH_get0_key(kex->dh, &pub_key, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ token_ptr = GSS_C_NO_BUFFER;
</span> +
+ do {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug("Wait SSH2_MSG_KEXGSS_INIT");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ type = ssh_packet_read(ssh);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ switch(type) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ case SSH2_MSG_KEXGSS_INIT:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (KEX_GSS_GEX_SHA1 == kex->kex_type) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (dh_client_pub != NULL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("Received KEXGSS_INIT after initialising");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ &recv_tok)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_get_bignum2(ssh, &dh_client_pub)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_get_end(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Step 2 - call GSS_Init_sec_context() */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug("Calling gss_init_sec_context");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ maj_status = ssh_gssapi_init_ctx(ctxt,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->gss_deleg_creds, token_ptr, &send_tok,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ &ret_flags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (GSS_ERROR(maj_status)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* XXX Useles code: Missing send? */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (send_tok.length != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_start(ssh,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ SSH2_MSG_KEXGSS_CONTINUE)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_string(ssh, send_tok.value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ send_tok.length)) != 0)
</span> + fatal("sshpkt failed: %s", ssh_err(r));
+ }
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (client_pubkey != NULL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("Received KEXGSS_INIT after initialising");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ &recv_tok)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_getb_froms(ssh, &client_pubkey)) != 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_get_end(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("gss_init_context failed");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* If we've got an old receive buffer get rid of it */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (token_ptr != GSS_C_NO_BUFFER)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_release_buffer(&min_status, &recv_tok);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (maj_status == GSS_S_COMPLETE) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* If mutual state flag is not true, kex fails */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!(ret_flags & GSS_C_MUTUAL_FLAG))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Mutual authentication failed");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* If integ avail flag is not true kex fails */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!(ret_flags & GSS_C_INTEG_FLAG))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Integrity check failed");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * If we have data to send, then the last message that we
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * received cannot have been a 'complete'.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (send_tok.length != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (first) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_INIT)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_string(ssh, send_tok.value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ send_tok.length)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_bignum2(ssh, pub_key)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ first = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_CONTINUE)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_string(ssh,send_tok.value,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ send_tok.length)) != 0)
</span> + fatal("sshpkt failed: %s", ssh_err(r));
+ }
<span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_send(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt_send failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_release_buffer(&min_status, &send_tok);
</span> +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ switch (kex->kex_type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* If we've sent them data, they should reply */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ type = ssh_packet_read(ssh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (type == SSH2_MSG_KEXGSS_HOSTKEY) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug("Received KEXGSS_HOSTKEY");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (server_host_key_blob)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Server host key received more than once");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_getb_froms(ssh, &server_host_key_blob)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } while (type == SSH2_MSG_KEXGSS_HOSTKEY);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ switch (type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ case SSH2_MSG_KEXGSS_CONTINUE:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug("Received GSSAPI_CONTINUE");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (maj_status == GSS_S_COMPLETE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("GSSAPI Continue received from server when complete");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ &recv_tok)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_end(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ case SSH2_MSG_KEXGSS_COMPLETE:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug("Received GSSAPI_COMPLETE");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (msg_tok.value != NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Received GSSAPI_COMPLETE twice?");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_getb_froms(ssh, &server_blob)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ &msg_tok)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Is there a token included? */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_get_u8(ssh, &c)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (c) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ssh, &recv_tok)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_end(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* If we're already complete - protocol error */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (maj_status == GSS_S_COMPLETE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshpkt_disconnect(ssh, "Protocol error: received token when complete");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* No token included */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (maj_status != GSS_S_COMPLETE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshpkt_disconnect(ssh, "Protocol error: did not receive final token");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ case SSH2_MSG_KEXGSS_ERROR:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug("Received Error");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_get_u32(ssh, &maj_status)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_u32(ssh, &min_status)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_string(ssh, &msg, NULL)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_string(ssh, NULL, NULL)) != 0 || /* lang tag */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_end(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("GSSAPI Error: \n%.400s", msg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshpkt_disconnect(ssh, "Protocol error: didn't expect packet type %d",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ token_ptr = &recv_tok;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* No data, and not complete */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (maj_status != GSS_S_COMPLETE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Not complete, and no token output");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } while (maj_status & GSS_S_CONTINUE_NEEDED);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * We _must_ have received a COMPLETE message in reply from the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * server, which will have set dh_server_pub and msg_tok
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (type != SSH2_MSG_KEXGSS_COMPLETE)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Didn't receive a SSH2_MSG_KEXGSS_COMPLETE when I expected it");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* 7. C verifies that the key Q_S is valid */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* 8. C computes shared secret */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((buf = sshbuf_new()) == NULL ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshbuf_put_stringb(buf, server_blob)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshbuf_get_bignum2(buf, &dh_server_pub)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto out;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshbuf_free(buf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ buf = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((shared_secret = sshbuf_new()) == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ r = SSH_ERR_ALLOC_FAIL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto out;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = kex_dh_compute_key(kex, dh_server_pub, shared_secret)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto out;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((empty = sshbuf_new()) == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ r = SSH_ERR_ALLOC_FAIL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto out;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DH_get0_pqg(kex->dh, &dh_p, NULL, &dh_g);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ hashlen = sizeof(hash);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = kexgex_hash(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->hash_alg,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->client_version,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->server_version,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->my,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->peer,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (server_host_key_blob ? server_host_key_blob : empty),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->min, kex->nbits, kex->max,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ dh_p, dh_g,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pub_key,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ dh_server_pub,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshbuf_ptr(shared_secret), sshbuf_len(shared_secret),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ hash, &hashlen)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Failed to calculate hash: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gssbuf.value = hash;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gssbuf.length = hashlen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Verify that the hash matches the MIC we just got. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (GSS_ERROR(ssh_gssapi_checkmic(ctxt, &gssbuf, &msg_tok)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshpkt_disconnect(ssh, "Hash's MIC didn't verify");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_release_buffer(&min_status, &msg_tok);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (kex->gss_deleg_creds)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ssh_gssapi_credentials_updated(ctxt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (gss_kex_context == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_kex_context = ctxt;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ssh_gssapi_delete_ctx(&ctxt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Finally derive the keys and send them */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = kex_derive_keys(ssh, hash, hashlen, shared_secret)) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ r = kex_send_newkeys(ssh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++out:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshbuf_free(buf);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshbuf_free(server_blob);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshbuf_free(empty);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ explicit_bzero(hash, sizeof(hash));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DH_free(kex->dh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->dh = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ BN_clear_free(dh_server_pub);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshbuf_free(shared_secret);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshbuf_free(server_host_key_blob);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* defined(GSSAPI) && defined(WITH_OPENSSL) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/kexgsss.c b/kexgsss.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+new file mode 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 00000000..a2c02148
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/kexgsss.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -0,0 +1,474 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++/*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Copyright (c) 2001-2009 Simon Wilkinson. All rights reserved.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Redistribution and use in source and binary forms, with or without
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * modification, are permitted provided that the following conditions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * are met:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 1. Redistributions of source code must retain the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * notice, this list of conditions and the following disclaimer.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * 2. Redistributions in binary form must reproduce the above copyright
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * notice, this list of conditions and the following disclaimer in the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * documentation and/or other materials provided with the distribution.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "includes.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(GSSAPI) && defined(WITH_OPENSSL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <string.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <openssl/crypto.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <openssl/bn.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "xmalloc.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "sshbuf.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "ssh2.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "sshkey.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "cipher.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "kex.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "log.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "packet.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "dh.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "ssh-gss.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "monitor_wrap.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "misc.h" /* servconf.h needs misc.h for struct ForwardOptions */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "servconf.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "ssh-gss.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "digest.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "ssherr.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++extern ServerOptions options;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++kexgss_server(struct ssh *ssh)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct kex *kex = ssh->kex;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ OM_uint32 maj_status, min_status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Some GSSAPI implementations use the input value of ret_flags (an
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * output variable) as a means of triggering mechanism specific
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * features. Initializing it to zero avoids inadvertently
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * activating this non-standard behaviour.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ OM_uint32 ret_flags = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_buffer_desc gssbuf, recv_tok, msg_tok;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Gssctxt *ctxt = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct sshbuf *shared_secret = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct sshbuf *client_pubkey = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct sshbuf *server_pubkey = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct sshbuf *empty = sshbuf_new();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int type = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_OID oid;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ char *mechs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ u_char hash[SSH_DIGEST_MAX_LENGTH];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t hashlen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Initialise GSSAPI */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* If we're rekeying, privsep means that some of the private structures
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * in the GSSAPI code are no longer available. This kludges them back
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * into life
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!ssh_gssapi_oid_table_ok()) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ mechs = ssh_gssapi_server_mechanisms();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ free(mechs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug2_f("Identifying %s", kex->name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ oid = ssh_gssapi_id_kex(NULL, kex->name, kex->kex_type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (oid == GSS_C_NO_OID)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Unknown gssapi mechanism");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug2_f("Acquiring credentials");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (GSS_ERROR(PRIVSEP(ssh_gssapi_server_ctx(&ctxt, oid))))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Unable to acquire credentials for the server");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug("Wait SSH2_MSG_KEXGSS_INIT");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ type = ssh_packet_read(ssh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ switch(type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ case SSH2_MSG_KEXGSS_INIT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (client_pubkey != NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Received KEXGSS_INIT after initialising");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ &recv_tok)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_getb_froms(ssh, &client_pubkey)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_end(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ switch (kex->kex_type) {
</span> + case KEX_GSS_GRP1_SHA1:
+ case KEX_GSS_GRP14_SHA1:
+ case KEX_GSS_GRP14_SHA256:
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2078,10 +2336,8 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + r = kex_c25519_enc(kex, client_pubkey, &server_pubkey,
+ &shared_secret);
+ break;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ case KEX_GSS_GEX_SHA1:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span> + default:
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: Unexpected KEX type %d", __func__, kex->kex_type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("Unexpected KEX type %d", kex->kex_type);
</span> + }
+ if (r != 0)
+ goto out;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2108,8 +2364,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + if (maj_status != GSS_S_COMPLETE && send_tok.length == 0)
+ fatal("Zero length token output when incomplete");
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (((KEX_GSS_GEX_SHA1 == kex->kex_type) && (dh_client_pub == NULL)) ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ((KEX_GSS_GEX_SHA1 != kex->kex_type) && (client_pubkey == NULL)))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (client_pubkey == NULL)
</span> + fatal("No client public key");
+
+ if (maj_status & GSS_S_CONTINUE_NEEDED) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2138,50 +2393,19 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + if (!(ret_flags & GSS_C_INTEG_FLAG))
+ fatal("Integrity flag wasn't set");
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (KEX_GSS_GEX_SHA1 == kex->kex_type) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* calculate shared secret */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((shared_secret = sshbuf_new()) == NULL) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ r = SSH_ERR_ALLOC_FAIL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ goto out;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = kex_dh_compute_key(kex, dh_client_pub, shared_secret)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ goto out;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ DH_get0_key(kex->dh, &pub_key, NULL);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ DH_get0_pqg(kex->dh, &dh_p, NULL, &dh_g);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span> + hashlen = sizeof(hash);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (KEX_GSS_GEX_SHA1 == kex->kex_type) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = kexgex_hash(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->hash_alg,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->client_version,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->server_version,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->peer,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->my,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ empty,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ cmin, nbits, cmax,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ dh_p, dh_g,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ dh_client_pub,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ pub_key,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ sshbuf_ptr(shared_secret), sshbuf_len(shared_secret),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ hash, &hashlen)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("kexgex_hash failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if ((r = kex_gen_hash(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->hash_alg,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->client_version,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->server_version,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->peer,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->my,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ empty,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ client_pubkey,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ server_pubkey,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ shared_secret,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ hash, &hashlen)) != 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ goto out;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = kex_gen_hash(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->hash_alg,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->client_version,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->server_version,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->peer,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->my,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ empty,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ client_pubkey,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ server_pubkey,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ shared_secret,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ hash, &hashlen)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto out;
</span> +
+ gssbuf.value = hash;
+ gssbuf.length = hashlen;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2190,10 +2414,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + fatal("Couldn't get MIC");
+
+ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_COMPLETE)) != 0 ||
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ((KEX_GSS_GEX_SHA1 == kex->kex_type) &&
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_put_bignum2(ssh, pub_key)) != 0) ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ((KEX_GSS_GEX_SHA1 != kex->kex_type) &&
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (r = sshpkt_put_stringb(ssh, server_pubkey)) != 0) ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_stringb(ssh, server_pubkey)) != 0 ||
</span> + (r = sshpkt_put_string(ssh, msg_tok.value, msg_tok.length)) != 0)
+ fatal("sshpkt failed: %s", ssh_err(r));
+
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2206,7 +2427,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + fatal("sshpkt failed: %s", ssh_err(r));
+ }
+ if ((r = sshpkt_send(ssh)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt_send failed: %s", ssh_err(r));
</span> +
+ gss_release_buffer(&min_status, &send_tok);
+ gss_release_buffer(&min_status, &msg_tok);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2216,40 +2437,264 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + else
+ ssh_gssapi_delete_ctx(&ctxt);
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* Finally derive the keys and send them */
</span> + if ((r = kex_derive_keys(ssh, hash, hashlen, shared_secret)) == 0)
+ r = kex_send_newkeys(ssh);
+
+ /* If this was a rekey, then save out any delegated credentials we
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * just exchanged. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * just exchanged. */
</span> + if (options.gss_store_rekey)
+ ssh_gssapi_rekey_creds();
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span> +out:
+ sshbuf_free(empty);
+ explicit_bzero(hash, sizeof(hash));
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ DH_free(kex->dh);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->dh = NULL;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ BN_clear_free(dh_client_pub);
</span> + sshbuf_free(shared_secret);
+ sshbuf_free(client_pubkey);
+ sshbuf_free(server_pubkey);
+ return r;
+}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif /* defined(GSSAPI) && defined(WITH_OPENSSL) */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/monitor.c 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/monitor.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -147,6 +147,8 @@ int mm_answer_gss_setup_ctx(struct ssh *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int mm_answer_gss_accept_ctx(struct ssh *, int, struct sshbuf *);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int mm_answer_gss_userok(struct ssh *, int, struct sshbuf *);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int mm_answer_gss_checkmic(struct ssh *, int, struct sshbuf *);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int mm_answer_gss_sign(struct ssh *, int, struct sshbuf *);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int mm_answer_gss_updatecreds(struct ssh *, int, struct sshbuf *);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef SSH_AUDIT_EVENTS
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -219,11 +221,18 @@ struct mon_table mon_dispatch_proto20[]
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {MONITOR_REQ_GSSSTEP, 0, mm_answer_gss_accept_ctx},
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++kexgssgex_server(struct ssh *ssh)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct kex *kex = ssh->kex;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ OM_uint32 maj_status, min_status;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * Some GSSAPI implementations use the input value of ret_flags (an
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * output variable) as a means of triggering mechanism specific
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * features. Initializing it to zero avoids inadvertently
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * activating this non-standard behaviour.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ OM_uint32 ret_flags = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_buffer_desc gssbuf, recv_tok, msg_tok;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ Gssctxt *ctxt = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct sshbuf *shared_secret = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int type = 0;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_OID oid;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ char *mechs;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ u_char hash[SSH_DIGEST_MAX_LENGTH];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ size_t hashlen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ BIGNUM *dh_client_pub = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ const BIGNUM *pub_key, *dh_p, *dh_g;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int min = -1, max = -1, nbits = -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int cmin = -1, cmax = -1; /* client proposal */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ struct sshbuf *empty = sshbuf_new();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Initialise GSSAPI */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* If we're rekeying, privsep means that some of the private structures
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * in the GSSAPI code are no longer available. This kludges them back
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * into life
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!ssh_gssapi_oid_table_ok())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((mechs = ssh_gssapi_server_mechanisms()))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ free(mechs);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug2_f("Identifying %s", kex->name);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ oid = ssh_gssapi_id_kex(NULL, kex->name, kex->kex_type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (oid == GSS_C_NO_OID)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Unknown gssapi mechanism");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug2_f("Acquiring credentials");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (GSS_ERROR(PRIVSEP(ssh_gssapi_server_ctx(&ctxt, oid))))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Unable to acquire credentials for the server");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* 5. S generates an ephemeral key pair (do the allocations early) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug("Doing group exchange");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ssh_packet_read_expect(ssh, SSH2_MSG_KEXGSS_GROUPREQ);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* store client proposal to provide valid signature */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_get_u32(ssh, &cmin)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_u32(ssh, &nbits)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_u32(ssh, &cmax)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_end(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->nbits = nbits;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->min = cmin;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->max = cmax;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ min = MAX(DH_GRP_MIN, cmin);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ max = MIN(DH_GRP_MAX, cmax);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ nbits = MAXIMUM(DH_GRP_MIN, nbits);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ nbits = MINIMUM(DH_GRP_MAX, nbits);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (max < min || nbits < min || max < nbits)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("GSS_GEX, bad parameters: %d !< %d !< %d",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ min, nbits, max);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->dh = PRIVSEP(choose_dh(min, nbits, max));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (kex->dh == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshpkt_disconnect(ssh, "Protocol error: no matching group found");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Protocol error: no matching group found");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DH_get0_pqg(kex->dh, &dh_p, NULL, &dh_g);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_GROUP)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_bignum2(ssh, dh_p)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_bignum2(ssh, dh_g)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_send(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = ssh_packet_write_wait(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("ssh_packet_write_wait: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Compute our exchange value in parallel with the client */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = dh_gen_key(kex->dh, kex->we_need * 8)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto out;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug("Wait SSH2_MSG_GSSAPI_INIT");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ type = ssh_packet_read(ssh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ switch(type) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ case SSH2_MSG_KEXGSS_INIT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (dh_client_pub != NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Received KEXGSS_INIT after initialising");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ &recv_tok)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_bignum2(ssh, &dh_client_pub)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_end(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Send SSH_MSG_KEXGSS_HOSTKEY here, if we want */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ case SSH2_MSG_KEXGSS_CONTINUE:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ &recv_tok)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_get_end(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshpkt_disconnect(ssh,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "Protocol error: didn't expect packet type %d",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ type);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ maj_status = PRIVSEP(ssh_gssapi_accept_ctx(ctxt, &recv_tok,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ &send_tok, &ret_flags));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_release_buffer(&min_status, &recv_tok);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (maj_status != GSS_S_COMPLETE && send_tok.length == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Zero length token output when incomplete");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (dh_client_pub == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("No client public key");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (maj_status & GSS_S_CONTINUE_NEEDED) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug("Sending GSSAPI_CONTINUE");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_CONTINUE)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_string(ssh, send_tok.value, send_tok.length)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_send(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_release_buffer(&min_status, &send_tok);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } while (maj_status & GSS_S_CONTINUE_NEEDED);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (GSS_ERROR(maj_status)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (send_tok.length > 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_CONTINUE)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_string(ssh, send_tok.value, send_tok.length)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_send(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("accept_ctx died");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!(ret_flags & GSS_C_MUTUAL_FLAG))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Mutual Authentication flag wasn't set");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!(ret_flags & GSS_C_INTEG_FLAG))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Integrity flag wasn't set");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* calculate shared secret */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((shared_secret = sshbuf_new()) == NULL) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ r = SSH_ERR_ALLOC_FAIL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto out;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = kex_dh_compute_key(kex, dh_client_pub, shared_secret)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto out;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DH_get0_key(kex->dh, &pub_key, NULL);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DH_get0_pqg(kex->dh, &dh_p, NULL, &dh_g);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ hashlen = sizeof(hash);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = kexgex_hash(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->hash_alg,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->client_version,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->server_version,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->peer,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->my,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ empty,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cmin, nbits, cmax,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ dh_p, dh_g,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ dh_client_pub,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ pub_key,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshbuf_ptr(shared_secret), sshbuf_len(shared_secret),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ hash, &hashlen)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("kexgex_hash failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gssbuf.value = hash;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gssbuf.length = hashlen;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (GSS_ERROR(PRIVSEP(ssh_gssapi_sign(ctxt, &gssbuf, &msg_tok))))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("Couldn't get MIC");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_COMPLETE)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_bignum2(ssh, pub_key)) != 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_string(ssh, msg_tok.value, msg_tok.length)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (send_tok.length != 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_put_u8(ssh, 1)) != 0 || /* true */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ (r = sshpkt_put_string(ssh, send_tok.value, send_tok.length)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_put_u8(ssh, 0)) != 0) /* false */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = sshpkt_send(ssh)) != 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal("sshpkt failed: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_release_buffer(&min_status, &send_tok);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_release_buffer(&min_status, &msg_tok);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (gss_kex_context == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_kex_context = ctxt;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ssh_gssapi_delete_ctx(&ctxt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Finally derive the keys and send them */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if ((r = kex_derive_keys(ssh, hash, hashlen, shared_secret)) == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ r = kex_send_newkeys(ssh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* If this was a rekey, then save out any delegated credentials we
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * just exchanged. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (options.gss_store_rekey)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ssh_gssapi_rekey_creds();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++out:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshbuf_free(empty);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ explicit_bzero(hash, sizeof(hash));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ DH_free(kex->dh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->dh = NULL;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ BN_clear_free(dh_client_pub);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ sshbuf_free(shared_secret);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ return r;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* defined(GSSAPI) && defined(WITH_OPENSSL) */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/monitor.c b/monitor.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 74c803e1..d8e447fe 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/monitor.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/monitor.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -145,6 +145,8 @@ int mm_answer_gss_setup_ctx(struct ssh *, int, struct sshbuf *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int mm_answer_gss_accept_ctx(struct ssh *, int, struct sshbuf *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int mm_answer_gss_userok(struct ssh *, int, struct sshbuf *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int mm_answer_gss_checkmic(struct ssh *, int, struct sshbuf *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int mm_answer_gss_sign(struct ssh *, int, struct sshbuf *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++int mm_answer_gss_updatecreds(struct ssh *, int, struct sshbuf *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef SSH_AUDIT_EVENTS
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -217,11 +219,18 @@ struct mon_table mon_dispatch_proto20[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ {MONITOR_REQ_GSSSTEP, 0, mm_answer_gss_accept_ctx},
</span> {MONITOR_REQ_GSSUSEROK, MON_ONCE|MON_AUTHDECIDE, mm_answer_gss_userok},
{MONITOR_REQ_GSSCHECKMIC, MON_ONCE, mm_answer_gss_checkmic},
+ {MONITOR_REQ_GSSSIGN, MON_ONCE, mm_answer_gss_sign},
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2267,7 +2712,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> #ifdef WITH_OPENSSL
{MONITOR_REQ_MODULI, 0, mm_answer_moduli},
#endif
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -292,6 +301,10 @@ monitor_child_preauth(struct ssh *ssh, s
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -290,6 +299,10 @@ monitor_child_preauth(struct ssh *ssh, struct monitor *pmonitor)
</span> /* Permit requests for moduli and signatures */
monitor_permit(mon_dispatch, MONITOR_REQ_MODULI, 1);
monitor_permit(mon_dispatch, MONITOR_REQ_SIGN, 1);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2278,7 +2723,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
/* The first few requests do not require asynchronous access */
while (!authenticated) {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -405,6 +418,10 @@ monitor_child_postauth(struct ssh *ssh,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -401,6 +414,10 @@ monitor_child_postauth(struct ssh *ssh, struct monitor *pmonitor)
</span> monitor_permit(mon_dispatch, MONITOR_REQ_MODULI, 1);
monitor_permit(mon_dispatch, MONITOR_REQ_SIGN, 1);
monitor_permit(mon_dispatch, MONITOR_REQ_TERM, 1);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2289,47 +2734,47 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
if (auth_opts->permit_pty_flag) {
monitor_permit(mon_dispatch, MONITOR_REQ_PTY, 1);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1689,6 +1706,17 @@ monitor_apply_keystate(struct ssh *ssh,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1730,6 +1747,17 @@ monitor_apply_keystate(struct ssh *ssh, struct monitor *pmonitor)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ # ifdef OPENSSL_HAS_ECC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ kex->kex[KEX_ECDH_SHA2] = kex_gen_server;
</span> # endif
<span style='display:block; white-space:pre;background:#e0ffe0;'>++# ifdef GSSAPI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (options.gss_keyex) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->kex[KEX_GSS_GRP1_SHA1] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->kex[KEX_GSS_GRP14_SHA1] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->kex[KEX_GSS_GRP14_SHA256] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->kex[KEX_GSS_GRP16_SHA512] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->kex[KEX_GSS_GEX_SHA1] = kexgssgex_server;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->kex[KEX_GSS_NISTP256_SHA256] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->kex[KEX_GSS_C25519_SHA256] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++# endif
</span> #endif /* WITH_OPENSSL */
<span style='display:block; white-space:pre;background:#ffe0e0;'>- kex->kex[KEX_C25519_SHA256] = kex_gen_server;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef GSSAPI
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (options.gss_keyex) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->kex[KEX_GSS_GRP1_SHA1] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->kex[KEX_GSS_GRP14_SHA1] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->kex[KEX_GSS_GRP14_SHA256] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->kex[KEX_GSS_GRP16_SHA512] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->kex[KEX_GSS_GEX_SHA1] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->kex[KEX_GSS_NISTP256_SHA256] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->kex[KEX_GSS_C25519_SHA256] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- kex->kex[KEX_KEM_SNTRUP4591761X25519_SHA512] = kex_gen_server;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- kex->load_host_public_key=&get_hostkey_public_by_type;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- kex->load_host_private_key=&get_hostkey_private_by_type;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1780,8 +1808,8 @@ mm_answer_gss_setup_ctx(struct ssh *ssh,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ kex->kex[KEX_C25519_SHA256] = kex_gen_server;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1822,8 +1850,8 @@ mm_answer_gss_setup_ctx(struct ssh *ssh, int sock, struct sshbuf *m)
</span> u_char *p;
int r;
- if (!options.gss_authentication)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-- fatal("%s: GSSAPI authentication not enabled", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- fatal_f("GSSAPI authentication not enabled");
</span> + if (!options.gss_authentication && !options.gss_keyex)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: GSSAPI not enabled", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("GSSAPI not enabled");
</span>
if ((r = sshbuf_get_string(m, &p, &len)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>- fatal("%s: buffer error: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1813,8 +1841,8 @@ mm_answer_gss_accept_ctx(struct ssh *ssh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fatal_fr(r, "parse");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1855,8 +1883,8 @@ mm_answer_gss_accept_ctx(struct ssh *ssh, int sock, struct sshbuf *m)
</span> OM_uint32 flags = 0; /* GSI needs this */
int r;
- if (!options.gss_authentication)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-- fatal("%s: GSSAPI authentication not enabled", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- fatal_f("GSSAPI authentication not enabled");
</span> + if (!options.gss_authentication && !options.gss_keyex)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: GSSAPI not enabled", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("GSSAPI not enabled");
</span>
if ((r = ssh_gssapi_get_buffer_desc(m, &in)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>- fatal("%s: buffer error: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1834,6 +1862,7 @@ mm_answer_gss_accept_ctx(struct ssh *ssh
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fatal_fr(r, "ssh_gssapi_get_buffer_desc");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1876,6 +1904,7 @@ mm_answer_gss_accept_ctx(struct ssh *ssh, int sock, struct sshbuf *m)
</span> monitor_permit(mon_dispatch, MONITOR_REQ_GSSSTEP, 0);
monitor_permit(mon_dispatch, MONITOR_REQ_GSSUSEROK, 1);
monitor_permit(mon_dispatch, MONITOR_REQ_GSSCHECKMIC, 1);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2337,18 +2782,18 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> }
return (0);
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1845,8 +1874,8 @@ mm_answer_gss_checkmic(struct ssh *ssh,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1887,8 +1916,8 @@ mm_answer_gss_checkmic(struct ssh *ssh, int sock, struct sshbuf *m)
</span> OM_uint32 ret;
int r;
- if (!options.gss_authentication)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-- fatal("%s: GSSAPI authentication not enabled", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- fatal_f("GSSAPI authentication not enabled");
</span> + if (!options.gss_authentication && !options.gss_keyex)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: GSSAPI not enabled", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("GSSAPI not enabled");
</span>
if ((r = ssh_gssapi_get_buffer_desc(m, &gssbuf)) != 0 ||
(r = ssh_gssapi_get_buffer_desc(m, &mic)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1872,13 +1901,17 @@ mm_answer_gss_checkmic(struct ssh *ssh,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1914,13 +1943,17 @@ mm_answer_gss_checkmic(struct ssh *ssh, int sock, struct sshbuf *m)
</span> int
mm_answer_gss_userok(struct ssh *ssh, int sock, struct sshbuf *m)
{
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2357,21 +2802,21 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> const char *displayname;
- if (!options.gss_authentication)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-- fatal("%s: GSSAPI authentication not enabled", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- fatal_f("GSSAPI authentication not enabled");
</span> + if (!options.gss_authentication && !options.gss_keyex)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: GSSAPI not enabled", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("GSSAPI not enabled");
</span>
- authenticated = authctxt->valid && ssh_gssapi_userok(authctxt->user);
+ if ((r = sshbuf_get_u32(m, &kex)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: buffer error: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "buffer error");
</span> +
+ authenticated = authctxt->valid &&
+ ssh_gssapi_userok(authctxt->user, authctxt->pw, kex);
sshbuf_reset(m);
if ((r = sshbuf_put_u32(m, authenticated)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1887,7 +1920,11 @@ mm_answer_gss_userok(struct ssh *ssh, in
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- debug3("%s: sending result %d", __func__, authenticated);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1929,7 +1962,11 @@ mm_answer_gss_userok(struct ssh *ssh, int sock, struct sshbuf *m)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug3_f("sending result %d", authenticated);
</span> mm_request_send(sock, MONITOR_ANS_GSSUSEROK, m);
- auth_method = "gssapi-with-mic";
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2383,11 +2828,12 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
if ((displayname = ssh_gssapi_displayname()) != NULL)
auth2_record_info(authctxt, "%s", displayname);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1895,5 +1932,85 @@ mm_answer_gss_userok(struct ssh *ssh, in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1937,5 +1974,83 @@ mm_answer_gss_userok(struct ssh *ssh, int sock, struct sshbuf *m)
</span> /* Monitor loop will terminate if authenticated */
return (authenticated);
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#endif /* GSSAPI */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span> +int
+mm_answer_gss_sign(struct ssh *ssh, int socket, struct sshbuf *m)
+{
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2399,16 +2845,15 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + int r;
+
+ if (!options.gss_authentication && !options.gss_keyex)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: GSSAPI not enabled", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("GSSAPI not enabled");
</span> +
+ if ((r = sshbuf_get_string(m, &p, &len)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: buffer error: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "buffer error");
</span> + data.value = p;
+ data.length = len;
+ /* Lengths of SHA-1, SHA-256 and SHA-512 hashes that are used */
+ if (data.length != 20 && data.length != 32 && data.length != 64)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: data length incorrect: %d", __func__,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (int) data.length);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("data length incorrect: %d", (int) data.length);
</span> +
+ /* Save the session ID on the first time around */
+ if (session_id2_len == 0) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2424,7 +2869,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +
+ if ((r = sshbuf_put_u32(m, major)) != 0 ||
+ (r = sshbuf_put_string(m, hash.value, hash.length)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: buffer error: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "buffer error");
</span> +
+ mm_request_send(socket, MONITOR_ANS_GSSSIGN, m);
+
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2445,12 +2890,12 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + int r, ok;
+
+ if (!options.gss_authentication && !options.gss_keyex)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: GSSAPI not enabled", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("GSSAPI not enabled");
</span> +
+ if ((r = sshbuf_get_string(m, (u_char **)&store.filename, NULL)) != 0 ||
+ (r = sshbuf_get_string(m, (u_char **)&store.envvar, NULL)) != 0 ||
+ (r = sshbuf_get_string(m, (u_char **)&store.envval, NULL)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: buffer error: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "buffer error");
</span> +
+ ok = ssh_gssapi_update_creds(&store);
+
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2460,30 +2905,32 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +
+ sshbuf_reset(m);
+ if ((r = sshbuf_put_u32(m, ok)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: buffer error: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "buffer error");
</span> +
+ mm_request_send(socket, MONITOR_ANS_GSSUPCREDS, m);
+
+ return(0);
+}
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif /* GSSAPI */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/monitor.h 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/monitor.h 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -63,6 +63,9 @@ enum monitor_reqtype {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif /* GSSAPI */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/monitor.h b/monitor.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 683e5e07..2b1a2d59 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/monitor.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/monitor.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -63,6 +63,8 @@ enum monitor_reqtype {
</span> MONITOR_REQ_PAM_FREE_CTX = 110, MONITOR_ANS_PAM_FREE_CTX = 111,
MONITOR_REQ_AUDIT_EVENT = 112, MONITOR_REQ_AUDIT_COMMAND = 113,
+ MONITOR_REQ_GSSSIGN = 150, MONITOR_ANS_GSSSIGN = 151,
+ MONITOR_REQ_GSSUPCREDS = 152, MONITOR_ANS_GSSUPCREDS = 153,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span> };
struct ssh;
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/monitor_wrap.c 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/monitor_wrap.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -978,13 +978,15 @@ mm_ssh_gssapi_checkmic(Gssctxt *ctx, gss
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/monitor_wrap.c b/monitor_wrap.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 748333c7..3310ad3f 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/monitor_wrap.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/monitor_wrap.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -999,13 +999,15 @@ mm_ssh_gssapi_checkmic(Gssctxt *ctx, gss_buffer_t gssbuf, gss_buffer_t gssmic)
</span> }
int
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2494,14 +2941,14 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> int r, authenticated = 0;
if ((m = sshbuf_new()) == NULL)
<span style='display:block; white-space:pre;background:#ffe0e0;'>- fatal("%s: sshbuf_new failed", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fatal_f("sshbuf_new failed");
</span> + if ((r = sshbuf_put_u32(m, kex)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: buffer error: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "buffer error");
</span>
mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSUSEROK, m);
mm_request_receive_expect(pmonitor->m_recvfd,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -997,4 +999,57 @@ mm_ssh_gssapi_userok(char *user)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- debug3("%s: user %sauthenticated",__func__, authenticated ? "" : "not ");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1018,4 +1020,57 @@ mm_ssh_gssapi_userok(char *user)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug3_f("user %sauthenticated", authenticated ? "" : "not ");
</span> return (authenticated);
}
+
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2513,16 +2960,16 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + int r;
+
+ if ((m = sshbuf_new()) == NULL)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: sshbuf_new failed", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("sshbuf_new failed");
</span> + if ((r = sshbuf_put_string(m, data->value, data->length)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: buffer error: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "buffer error");
</span> +
+ mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSIGN, m);
+ mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSIGN, m);
+
+ if ((r = sshbuf_get_u32(m, &major)) != 0 ||
+ (r = ssh_gssapi_get_buffer_desc(m, hash)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: buffer error: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "buffer error");
</span> +
+ sshbuf_free(m);
+
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2536,7 +2983,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + int r, ok;
+
+ if ((m = sshbuf_new()) == NULL)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: sshbuf_new failed", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("sshbuf_new failed");
</span> +
+ if ((r = sshbuf_put_cstring(m,
+ store->filename ? store->filename : "")) != 0 ||
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2544,13 +2991,13 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + store->envvar ? store->envvar : "")) != 0 ||
+ (r = sshbuf_put_cstring(m,
+ store->envval ? store->envval : "")) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: buffer error: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "buffer error");
</span> +
+ mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSUPCREDS, m);
+ mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSUPCREDS, m);
+
+ if ((r = sshbuf_get_u32(m, &ok)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: buffer error: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "buffer error");
</span> +
+ sshbuf_free(m);
+
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2558,9 +3005,11 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +}
+
#endif /* GSSAPI */
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/monitor_wrap.h 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/monitor_wrap.h 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -63,8 +63,10 @@ int mm_sshkey_verify(const struct sshkey
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/monitor_wrap.h b/monitor_wrap.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a163b67d..f51bcca0 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/monitor_wrap.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/monitor_wrap.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -65,8 +65,10 @@ int mm_sshkey_verify(const struct sshkey *, const u_char *, size_t,
</span> OM_uint32 mm_ssh_gssapi_server_ctx(Gssctxt **, gss_OID);
OM_uint32 mm_ssh_gssapi_accept_ctx(Gssctxt *,
gss_buffer_desc *, gss_buffer_desc *, OM_uint32 *);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2572,8 +3021,10 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> #endif
#ifdef USE_PAM
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/readconf.c 2019-11-08 15:37:14.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/readconf.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/readconf.c b/readconf.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index bcca6ed4..dc7ece37 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/readconf.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/readconf.c
</span> @@ -67,6 +67,7 @@
#include "uidswap.h"
#include "myproposal.h"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2582,7 +3033,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
/* Format of the configuration file:
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -162,6 +163,8 @@ typedef enum {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -161,6 +162,8 @@ typedef enum {
</span> oClearAllForwardings, oNoHostAuthenticationForLocalhost,
oEnableSSHKeysign, oRekeyLimit, oVerifyHostKeyDNS, oConnectTimeout,
oAddressFamily, oGssAuthentication, oGssDelegateCreds,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2591,7 +3042,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> oServerAliveInterval, oServerAliveCountMax, oIdentitiesOnly,
oSendEnv, oSetEnv, oControlPath, oControlMaster, oControlPersist,
oHashKnownHosts,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -205,10 +208,21 @@ static struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -206,10 +209,22 @@ static struct {
</span> /* Sometimes-unsupported options */
#if defined(GSSAPI)
{ "gssapiauthentication", oGssAuthentication },
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2608,12 +3059,13 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> { "gssapidelegatecredentials", oUnsupported },
+ { "gssapitrustdns", oUnsupported },
+ { "gssapiclientidentity", oUnsupported },
<span style='display:block; white-space:pre;background:#e0ffe0;'>++ { "gssapiserveridentity", oUnsupported },
</span> + { "gssapirenewalforcesrekey", oUnsupported },
+ { "gssapikexalgorithms", oUnsupported },
#endif
#ifdef ENABLE_PKCS11
{ "pkcs11provider", oPKCS11Provider },
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -994,10 +1008,42 @@ parse_time:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1113,10 +1128,46 @@ parse_time:
</span> intptr = &options->gss_authentication;
goto parse_flag;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2642,13 +3094,17 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + goto parse_flag;
+
+ case oGssKexAlgorithms:
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ arg = strdelim(&s);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (!arg || *arg == '\0')
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%.200s line %d: Missing argument.",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ arg = argv_next(&ac, &av);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!arg || *arg == '\0') {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ error("%.200s line %d: Missing argument.",
</span> + filename, linenum);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (!kex_gss_names_valid(arg))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%.200s line %d: Bad GSSAPI KexAlgorithms '%s'.",
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto out;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (!kex_gss_names_valid(arg)) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ error("%.200s line %d: Bad GSSAPI KexAlgorithms '%s'.",
</span> + filename, linenum, arg ? arg : "<NONE>");
<span style='display:block; white-space:pre;background:#e0ffe0;'>++ goto out;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span> + if (*activep && options->gss_kex_algorithms == NULL)
+ options->gss_kex_algorithms = xstrdup(arg);
+ break;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2656,9 +3112,9 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> case oBatchMode:
intptr = &options->batch_mode;
goto parse_flag;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1875,7 +1921,13 @@ initialize_options(Options * options)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2333,7 +2384,13 @@ initialize_options(Options * options)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ options->fwd_opts.streamlocal_bind_unlink = -1;
</span> options->pubkey_authentication = -1;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- options->challenge_response_authentication = -1;
</span> options->gss_authentication = -1;
+ options->gss_keyex = -1;
options->gss_deleg_creds = -1;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2670,8 +3126,8 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> options->password_authentication = -1;
options->kbd_interactive_authentication = -1;
options->kbd_interactive_devices = NULL;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2024,8 +2076,18 @@ fill_default_options(Options * options)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- options->challenge_response_authentication = 1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2490,8 +2547,18 @@ fill_default_options(Options * options)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ options->pubkey_authentication = 1;
</span> if (options->gss_authentication == -1)
options->gss_authentication = 0;
+ if (options->gss_keyex == -1)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2689,7 +3145,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> if (options->password_authentication == -1)
options->password_authentication = 1;
if (options->kbd_interactive_authentication == -1)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2645,7 +2707,14 @@ dump_client_config(Options *o, const cha
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3282,7 +3349,14 @@ dump_client_config(Options *o, const char *host)
</span> dump_cfg_fmtint(oGatewayPorts, o->fwd_opts.gateway_ports);
#ifdef GSSAPI
dump_cfg_fmtint(oGssAuthentication, o->gss_authentication);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2704,25 +3160,29 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> #endif /* GSSAPI */
dump_cfg_fmtint(oHashKnownHosts, o->hash_known_hosts);
dump_cfg_fmtint(oHostbasedAuthentication, o->hostbased_authentication);
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/readconf.h 2019-11-08 15:37:14.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/readconf.h 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -40,7 +40,13 @@ typedef struct {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int challenge_response_authentication;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* Try S/Key or TIS, authentication. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/readconf.h b/readconf.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index f24719f9..00895ad8 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/readconf.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/readconf.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -39,7 +39,13 @@ typedef struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int pubkey_authentication; /* Try ssh2 pubkey authentication. */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ int hostbased_authentication; /* ssh2's rhosts_rsa */
</span> int gss_authentication; /* Try GSS authentication */
+ int gss_keyex; /* Try GSS key exchange */
int gss_deleg_creds; /* Delegate GSS credentials */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int gss_trust_dns; /* Trust DNS for GSS canonicalization */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int gss_renewal_rekey; /* Credential renewal forces rekey */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ char *gss_client_identity; /* Principal to initiate GSSAPI with */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ char *gss_server_identity; /* GSSAPI target principal */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int gss_trust_dns; /* Trust DNS for GSS canonicalization */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int gss_renewal_rekey; /* Credential renewal forces rekey */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ char *gss_client_identity; /* Principal to initiate GSSAPI with */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ char *gss_server_identity; /* GSSAPI target principal */
</span> + char *gss_kex_algorithms; /* GSSAPI kex methods to be offered by client. */
int password_authentication; /* Try password
* authentication. */
int kbd_interactive_authentication; /* Try keyboard-interactive auth. */
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/servconf.c 2019-11-08 14:18:25.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/servconf.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -64,6 +64,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/servconf.c b/servconf.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index b2fbf0b2..d78fbb67 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/servconf.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/servconf.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -70,6 +70,7 @@
</span> #include "auth.h"
#include "myproposal.h"
#include "digest.h"
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2730,7 +3190,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
static void add_listen_addr(ServerOptions *, const char *,
const char *, int);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -124,8 +125,11 @@ initialize_server_options(ServerOptions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -136,8 +137,11 @@ initialize_server_options(ServerOptions *options)
</span> options->kerberos_ticket_cleanup = -1;
options->kerberos_get_afs_token = -1;
options->gss_authentication=-1;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2741,8 +3201,8 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + options->gss_kex_algorithms = NULL;
options->password_authentication = -1;
options->kbd_interactive_authentication = -1;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- options->challenge_response_authentication = -1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -351,10 +355,18 @@ fill_default_server_options(ServerOption
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ options->permit_empty_passwd = -1;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -356,10 +360,18 @@ fill_default_server_options(ServerOptions *options)
</span> options->kerberos_get_afs_token = 0;
if (options->gss_authentication == -1)
options->gss_authentication = 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2761,15 +3221,15 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> if (options->password_authentication == -1)
options->password_authentication = 1;
if (options->kbd_interactive_authentication == -1)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -498,6 +510,7 @@ typedef enum {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- sHostKeyAlgorithms,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -505,6 +517,7 @@ typedef enum {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ sHostKeyAlgorithms, sPerSourceMaxStartups, sPerSourceNetBlockSize,
</span> sClientAliveInterval, sClientAliveCountMax, sAuthorizedKeysFile,
sGssAuthentication, sGssCleanupCreds, sGssStrictAcceptor,
+ sGssKeyEx, sGssKexAlgorithms, sGssStoreRekey,
sAcceptEnv, sSetEnv, sPermitTunnel,
sMatch, sPermitOpen, sPermitListen, sForceCommand, sChrootDirectory,
sUsePrivilegeSeparation, sAllowAgentForwarding,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -572,12 +585,22 @@ static struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -586,12 +599,22 @@ static struct {
</span> #ifdef GSSAPI
{ "gssapiauthentication", sGssAuthentication, SSHCFG_ALL },
{ "gssapicleanupcredentials", sGssCleanupCreds, SSHCFG_GLOBAL },
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2791,8 +3251,8 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + { "gssapiusesessioncredcache", sUnsupported, SSHCFG_GLOBAL },
{ "passwordauthentication", sPasswordAuthentication, SSHCFG_ALL },
{ "kbdinteractiveauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL },
<span style='display:block; white-space:pre;background:#ffe0e0;'>- { "challengeresponseauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL },
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1488,6 +1511,10 @@ process_server_config_line(ServerOptions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ { "challengeresponseauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL }, /* alias */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1575,6 +1598,10 @@ process_server_config_line_depth(ServerOptions *options, char *line,
</span> intptr = &options->gss_authentication;
goto parse_flag;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2803,7 +3263,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> case sGssCleanupCreds:
intptr = &options->gss_cleanup_creds;
goto parse_flag;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1496,6 +1523,22 @@ process_server_config_line(ServerOptions
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1583,6 +1610,22 @@ process_server_config_line_depth(ServerOptions *options, char *line,
</span> intptr = &options->gss_strict_acceptor;
goto parse_flag;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2812,7 +3272,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + goto parse_flag;
+
+ case sGssKexAlgorithms:
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ arg = strdelim(&cp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ arg = argv_next(&ac, &av);
</span> + if (!arg || *arg == '\0')
+ fatal("%.200s line %d: Missing argument.",
+ filename, linenum);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2826,7 +3286,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> case sPasswordAuthentication:
intptr = &options->password_authentication;
goto parse_flag;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2585,6 +2628,10 @@ dump_config(ServerOptions *o)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2891,6 +2934,10 @@ dump_config(ServerOptions *o)
</span> #ifdef GSSAPI
dump_cfg_fmtint(sGssAuthentication, o->gss_authentication);
dump_cfg_fmtint(sGssCleanupCreds, o->gss_cleanup_creds);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2837,52 +3297,86 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> #endif
dump_cfg_fmtint(sPasswordAuthentication, o->password_authentication);
dump_cfg_fmtint(sKbdInteractiveAuthentication,
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/servconf.h 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/servconf.h 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -126,8 +126,11 @@ typedef struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/servconf.h b/servconf.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index dd5cbc15..413413e9 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/servconf.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/servconf.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -141,8 +141,11 @@ typedef struct {
</span> int kerberos_get_afs_token; /* If true, try to get AFS token if
* authenticated with Kerberos. */
int gss_authentication; /* If true, permit GSSAPI authentication */
+ int gss_keyex; /* If true, permit GSSAPI key exchange */
int gss_cleanup_creds; /* If true, destroy cred cache on logout */
int gss_strict_acceptor; /* If true, restrict the GSSAPI acceptor name */
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ int gss_store_rekey;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ int gss_store_rekey;
</span> + char *gss_kex_algorithms; /* GSSAPI kex methods to be offered by client. */
int password_authentication; /* If true, permit password
* authentication. */
int kbd_interactive_authentication; /* If true, permit */
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/ssh-gss.h 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/ssh-gss.h 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/session.c b/session.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 5f423f9f..165b8782 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/session.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/session.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2670,13 +2670,19 @@ do_cleanup(struct ssh *ssh, Authctxt *authctxt)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef KRB5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (options.kerberos_ticket_cleanup &&
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- authctxt->krb5_ctx)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ authctxt->krb5_ctx) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ temporarily_use_uid(authctxt->pw);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ krb5_cleanup_proc(authctxt);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ restore_uid();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifdef GSSAPI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- if (options.gss_cleanup_creds)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (options.gss_cleanup_creds) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ temporarily_use_uid(authctxt->pw);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ssh_gssapi_cleanup_creds();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ restore_uid();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* remove agent socket */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/ssh-gss.h b/ssh-gss.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a8af117d..6303ce18 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/ssh-gss.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/ssh-gss.h
</span> @@ -1,6 +1,6 @@
<span style='display:block; white-space:pre;background:#ffe0e0;'>- /* $OpenBSD: ssh-gss.h,v 1.14 2018/07/10 09:13:30 djm Exp $ */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* $OpenBSD: ssh-gss.h,v 1.15 2021/01/27 10:05:28 djm Exp $ */
</span> /*
- * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
+ * Copyright (c) 2001-2009 Simon Wilkinson. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -61,10 +61,30 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -61,10 +61,34 @@
</span>
#define SSH_GSS_OIDTYPE 0x06
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define SSH2_MSG_KEXGSS_INIT 30
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define SSH2_MSG_KEXGSS_CONTINUE 31
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define SSH2_MSG_KEXGSS_COMPLETE 32
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define SSH2_MSG_KEXGSS_HOSTKEY 33
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define SSH2_MSG_KEXGSS_ERROR 34
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define SSH2_MSG_KEXGSS_INIT 30
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define SSH2_MSG_KEXGSS_CONTINUE 31
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define SSH2_MSG_KEXGSS_COMPLETE 32
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define SSH2_MSG_KEXGSS_HOSTKEY 33
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define SSH2_MSG_KEXGSS_ERROR 34
</span> +#define SSH2_MSG_KEXGSS_GROUPREQ 40
+#define SSH2_MSG_KEXGSS_GROUP 41
+#define KEX_GSS_GRP1_SHA1_ID "gss-group1-sha1-"
+#define KEX_GSS_GRP14_SHA1_ID "gss-group14-sha1-"
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define KEX_GSS_GRP14_SHA256_ID "gss-group14-sha256-"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define KEX_GSS_GRP16_SHA512_ID "gss-group16-sha512-"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define KEX_GSS_GRP14_SHA256_ID "gss-group14-sha256-"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#define KEX_GSS_GRP16_SHA512_ID "gss-group16-sha512-"
</span> +#define KEX_GSS_GEX_SHA1_ID "gss-gex-sha1-"
+#define KEX_GSS_NISTP256_SHA256_ID "gss-nistp256-sha256-"
+#define KEX_GSS_C25519_SHA256_ID "gss-curve25519-sha256-"
+
+#define GSS_KEX_DEFAULT_KEX \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ KEX_GSS_GEX_SHA1_ID "," \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ KEX_GSS_GRP14_SHA1_ID
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ KEX_GSS_GRP14_SHA256_ID "," \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ KEX_GSS_GRP16_SHA512_ID "," \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ KEX_GSS_NISTP256_SHA256_ID "," \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ KEX_GSS_C25519_SHA256_ID "," \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ KEX_GSS_GRP14_SHA1_ID "," \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ KEX_GSS_GEX_SHA1_ID
</span> +
typedef struct {
char *filename;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2892,7 +3386,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> void *data;
} ssh_gssapi_ccache;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -72,8 +92,11 @@ typedef struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -72,8 +96,11 @@ typedef struct {
</span> gss_buffer_desc displayname;
gss_buffer_desc exportedname;
gss_cred_id_t creds;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2904,7 +3398,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> } ssh_gssapi_client;
typedef struct ssh_gssapi_mech_struct {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -84,6 +107,7 @@ typedef struct ssh_gssapi_mech_struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -84,6 +111,7 @@ typedef struct ssh_gssapi_mech_struct {
</span> int (*userok) (ssh_gssapi_client *, char *);
int (*localname) (ssh_gssapi_client *, char **);
void (*storecreds) (ssh_gssapi_client *);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2912,7 +3406,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> } ssh_gssapi_mech;
typedef struct {
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -94,10 +118,11 @@ typedef struct {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -94,10 +122,11 @@ typedef struct {
</span> gss_OID oid; /* client */
gss_cred_id_t creds; /* server */
gss_name_t client; /* server */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2925,7 +3419,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
int ssh_gssapi_check_oid(Gssctxt *, void *, size_t);
void ssh_gssapi_set_oid_data(Gssctxt *, void *, size_t);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -109,6 +134,7 @@ OM_uint32 ssh_gssapi_test_oid_supported(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -109,6 +138,7 @@ OM_uint32 ssh_gssapi_test_oid_supported(OM_uint32 *, gss_OID, int *);
</span>
struct sshbuf;
int ssh_gssapi_get_buffer_desc(struct sshbuf *, gss_buffer_desc *);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2933,10 +3427,10 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
OM_uint32 ssh_gssapi_import_name(Gssctxt *, const char *);
OM_uint32 ssh_gssapi_init_ctx(Gssctxt *, int,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -123,17 +149,33 @@ void ssh_gssapi_delete_ctx(Gssctxt **);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -123,17 +153,33 @@ void ssh_gssapi_delete_ctx(Gssctxt **);
</span> OM_uint32 ssh_gssapi_sign(Gssctxt *, gss_buffer_t, gss_buffer_t);
void ssh_gssapi_buildmic(struct sshbuf *, const char *,
<span style='display:block; white-space:pre;background:#ffe0e0;'>- const char *, const char *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ const char *, const char *, const struct sshbuf *);
</span> -int ssh_gssapi_check_mechanism(Gssctxt **, gss_OID, const char *);
+int ssh_gssapi_check_mechanism(Gssctxt **, gss_OID, const char *, const char *);
+OM_uint32 ssh_gssapi_client_identity(Gssctxt *, const char *);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2969,9 +3463,62 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> #endif /* GSSAPI */
#endif /* _SSH_GSS_H */
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/ssh_config 2019-11-08 15:37:17.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/ssh_config 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -24,6 +24,8 @@ Host *
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/ssh.1 b/ssh.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 7efb2382..67ea50aa 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/ssh.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/ssh.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -530,7 +530,13 @@ For full details of the options listed below, and their possible values, see
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .It GatewayPorts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .It GlobalKnownHostsFile
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .It GSSAPIAuthentication
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.It GSSAPIKeyExchange
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.It GSSAPIClientIdentity
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .It GSSAPIDelegateCredentials
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.It GSSAPIKexAlgorithms
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.It GSSAPIRenewalForcesRekey
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.It GSSAPIServerIdentity
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.It GSSAPITrustDns
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .It HashKnownHosts
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .It Host
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .It HostbasedAcceptedAlgorithms
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -607,6 +613,8 @@ flag),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (supported message integrity codes),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .Ar kex
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (key exchange algorithms),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.Ar kex-gss
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++(GSSAPI key exchange algorithms),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .Ar key
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ (key types),
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .Ar key-cert
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/ssh.c b/ssh.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index e6fe8090..519b7a23 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/ssh.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/ssh.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -775,6 +775,8 @@ main(int ac, char **av)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else if (strcmp(optarg, "kex") == 0 ||
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ strcasecmp(optarg, "KexAlgorithms") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cp = kex_alg_list('\n');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ else if (strcmp(optarg, "kex-gss") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ cp = kex_gss_alg_list('\n');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else if (strcmp(optarg, "key") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cp = sshkey_alg_list(0, 0, 0, '\n');
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ else if (strcmp(optarg, "key-cert") == 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -802,8 +804,8 @@ main(int ac, char **av)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ } else if (strcmp(optarg, "help") == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ cp = xstrdup(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ "cipher\ncipher-auth\ncompression\nkex\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- "key\nkey-cert\nkey-plain\nkey-sig\nmac\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- "protocol-version\nsig");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "kex-gss\nkey\nkey-cert\nkey-plain\n"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "key-sig\nmac\nprotocol-version\nsig");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ if (cp == NULL)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fatal("Unsupported query \"%s\"", optarg);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/ssh_config b/ssh_config
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 842ea866..52aae869 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/ssh_config
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/ssh_config
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -24,6 +24,8 @@
</span> # HostbasedAuthentication no
# GSSAPIAuthentication no
# GSSAPIDelegateCredentials no
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -2980,23 +3527,14 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> # BatchMode no
# CheckHostIP yes
# AddressFamily any
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/ssh_config.5 2019-11-08 15:37:17.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/ssh_config.5 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1,4 +1,4 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--.\"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+kex-gss\n.\"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .\" Author: Tatu Ylonen <ylo@cs.hut.fi>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .\" Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .\" All rights reserved
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -767,10 +767,66 @@ The default is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/ssh_config.5 b/ssh_config.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 170125a0..2bac0a75 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/ssh_config.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/ssh_config.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -833,10 +833,67 @@ The default is
</span> Specifies whether user authentication based on GSSAPI is allowed.
The default is
.Cm no .
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+.It Cm GSSAPIKeyExchange
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+Specifies whether key exchange based on GSSAPI may be used. When using
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+GSSAPI key exchange the server need not have a host key.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+The default is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+.Cm no .
</span> +.It Cm GSSAPIClientIdentity
+If set, specifies the GSSAPI client identity that ssh should use when
+connecting to the server. The default is unset, which means that the default
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3005,11 +3543,16 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> Forward (delegate) credentials to the server.
The default is
.Cm no .
<span style='display:block; white-space:pre;background:#e0ffe0;'>++.It Cm GSSAPIKeyExchange
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Specifies whether key exchange based on GSSAPI may be used. When using
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++GSSAPI key exchange the server need not have a host key.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++The default is
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.Dq no .
</span> +.It Cm GSSAPIRenewalForcesRekey
+If set to
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+.Cm yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.Dq yes
</span> +then renewal of the client's GSSAPI credentials will force the rekeying of the
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ssh connection. With a compatible server, this can delegate the renewed
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ssh connection. With a compatible server, this will delegate the renewed
</span> +credentials to a session on the server.
+.Pp
+Checks are made to ensure that credentials are only propagated when the new
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3017,7 +3560,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +receiving server still has the old set in its cache.
+.Pp
+The default is
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+.Cm no .
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.Dq no .
</span> +.Pp
+For this to work
+.Cm GSSAPIKeyExchange
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3029,14 +3572,14 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +hostname.
+.It Cm GSSAPITrustDns
+Set to
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+.Cm yes
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.Dq yes
</span> +to indicate that the DNS is trusted to securely canonicalize
+the name of the host being connected to. If
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+.Cm no ,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.Dq no ,
</span> +the hostname entered on the
+command line will be passed untouched to the GSSAPI library.
+The default is
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+.Cm no .
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.Dq no .
</span> +.It Cm GSSAPIKexAlgorithms
+The list of key exchange algorithms that are offered for GSSAPI
+key exchange. Possible values are
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3051,34 +3594,38 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +.Ed
+.Pp
+The default is
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+.Dq gss-gex-sha1-,gss-group14-sha1- .
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.Dq gss-group14-sha256-,gss-group16-sha512-,gss-nistp256-sha256-,gss-curve25519-sha256-,gss-gex-sha1-,gss-group14-sha1- .
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++This option only applies to connections using GSSAPI.
</span> .It Cm HashKnownHosts
Indicates that
.Xr ssh 1
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/sshconnect2.c.orig 2020-09-27 02:25:01.000000000 -0500
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/sshconnect2.c 2021-02-19 13:12:38.000000000 -0600
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -58,6 +58,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "myproposal.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "sshconnect.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "authfile.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "auth-compat.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "dh.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "authfd.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "log.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -210,6 +211,11 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/sshconnect2.c b/sshconnect2.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index fea50fab..9837b212 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/sshconnect2.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/sshconnect2.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -81,8 +81,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /* import */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-extern char *client_version_string;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-extern char *server_version_string;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ extern Options options;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ /*
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -220,6 +218,11 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port,
</span> char *s, *all_key;
int r, use_known_hosts_order = 0;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef GSSAPI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(GSSAPI) && defined(WITH_OPENSSL)
</span> + char *orig = NULL, *gss = NULL;
+ char *gss_host = NULL;
+#endif
+
xxx_host = host;
xxx_hostaddr = hostaddr;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -253,6 +259,35 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- compat_pkalg_proposal(options.hostkeyalgorithms);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ xxx_conn_info = cinfo;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -264,6 +267,42 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ compat_pkalg_proposal(ssh, options.hostkeyalgorithms);
</span> }
+#if defined(GSSAPI) && defined(WITH_OPENSSL)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3087,12 +3634,19 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + * client to the key exchange algorithm proposal */
+ orig = myproposal[PROPOSAL_KEX_ALGS];
+
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (options.gss_server_identity)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (options.gss_server_identity) {
</span> + gss_host = xstrdup(options.gss_server_identity);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (options.gss_trust_dns)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ gss_host = xstrdup(auth_get_canonical_hostname(ssh, 1));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (options.gss_trust_dns) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_host = remote_hostname(ssh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Fall back to specified host if we are using proxy command
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * and can not use DNS on that socket */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (strcmp(gss_host, "UNKNOWN") == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ free(gss_host);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_host = xstrdup(host);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span> + gss_host = xstrdup(host);
<span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span> +
+ gss = ssh_gssapi_client_mechanisms(gss_host,
+ options.gss_client_identity, options.gss_kex_algorithms);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3113,7 +3667,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> if (options.rekey_limit || options.rekey_interval)
ssh_packet_set_rekey_limits(ssh, options.rekey_limit,
options.rekey_interval);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -271,16 +306,46 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -282,16 +321,46 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port,
</span> # ifdef OPENSSL_HAS_ECC
ssh->kex->kex[KEX_ECDH_SHA2] = kex_gen_client;
# endif
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3124,14 +3678,14 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + ssh->kex->kex[KEX_GSS_GRP14_SHA1] = kexgss_client;
+ ssh->kex->kex[KEX_GSS_GRP14_SHA256] = kexgss_client;
+ ssh->kex->kex[KEX_GSS_GRP16_SHA512] = kexgss_client;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ssh->kex->kex[KEX_GSS_GEX_SHA1] = kexgss_client;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ ssh->kex->kex[KEX_GSS_GEX_SHA1] = kexgssgex_client;
</span> + ssh->kex->kex[KEX_GSS_NISTP256_SHA256] = kexgss_client;
+ ssh->kex->kex[KEX_GSS_C25519_SHA256] = kexgss_client;
+ }
+# endif
+#endif /* WITH_OPENSSL */
ssh->kex->kex[KEX_C25519_SHA256] = kex_gen_client;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- ssh->kex->kex[KEX_KEM_SNTRUP4591761X25519_SHA512] = kex_gen_client;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ssh->kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_client;
</span> ssh->kex->verify_host_key=&verify_host_key_callback;
+#if defined(GSSAPI) && defined(WITH_OPENSSL)
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3147,7 +3701,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
/* remove ext-info from the KEX proposals for rekeying */
myproposal[PROPOSAL_KEX_ALGS] =
<span style='display:block; white-space:pre;background:#ffe0e0;'>- compat_kex_proposal(options.kex_algorithms);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ compat_kex_proposal(ssh, options.kex_algorithms);
</span> +#if defined(GSSAPI) && defined(WITH_OPENSSL)
+ /* repair myproposal after it was crumpled by the */
+ /* ext-info removal above */
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3159,17 +3713,17 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + }
+#endif
if ((r = kex_prop2buf(ssh->kex->my, myproposal)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>- fatal("kex_prop2buf: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fatal_r(r, "kex_prop2buf");
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -377,6 +442,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -385,6 +454,7 @@ static int input_gssapi_response(int type, u_int32_t, struct ssh *);
</span> static int input_gssapi_token(int type, u_int32_t, struct ssh *);
static int input_gssapi_error(int, u_int32_t, struct ssh *);
static int input_gssapi_errtok(int, u_int32_t, struct ssh *);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+int userauth_gsskeyex(struct ssh *);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static int userauth_gsskeyex(struct ssh *);
</span> #endif
void userauth(struct ssh *, char *);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -393,6 +459,11 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -401,6 +471,11 @@ static char *authmethods_get(void);
</span>
Authmethod authmethods[] = {
#ifdef GSSAPI
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3181,25 +3735,33 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> {"gssapi-with-mic",
userauth_gssapi,
userauth_gssapi_cleanup,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -763,12 +834,24 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -776,12 +851,32 @@ userauth_gssapi(struct ssh *ssh)
</span> OM_uint32 min;
int r, ok = 0;
gss_OID mech = NULL;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ char *gss_host;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ char *gss_host = NULL;
</span> +
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (options.gss_server_identity)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (options.gss_server_identity) {
</span> + gss_host = xstrdup(options.gss_server_identity);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ else if (options.gss_trust_dns)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ gss_host = xstrdup(auth_get_canonical_hostname(ssh, 1));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else if (options.gss_trust_dns) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_host = remote_hostname(ssh);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ /* Fall back to specified host if we are using proxy command
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ * and can not use DNS on that socket */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (strcmp(gss_host, "UNKNOWN") == 0) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ free(gss_host);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ gss_host = xstrdup(authctxt->host);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ } else {
</span> + gss_host = xstrdup(authctxt->host);
<span style='display:block; white-space:pre;background:#e0ffe0;'>++ }
</span>
/* Try one GSSAPI method at a time, rather than sending them all at
* once. */
if (authctxt->gss_supported_mechs == NULL)
- gss_indicate_mechs(&min, &authctxt->gss_supported_mechs);
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (GSS_ERROR(gss_indicate_mechs(&min, &authctxt->gss_supported_mechs))) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ if (GSS_ERROR(gss_indicate_mechs(&min,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ &authctxt->gss_supported_mechs))) {
</span> + authctxt->gss_supported_mechs = NULL;
+ free(gss_host);
+ return 0;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3207,7 +3769,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
/* Check to see whether the mechanism is usable before we offer it */
while (authctxt->mech_tried < authctxt->gss_supported_mechs->count &&
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -777,13 +860,15 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -790,13 +885,15 @@ userauth_gssapi(struct ssh *ssh)
</span> elements[authctxt->mech_tried];
/* My DER encoding requires length<128 */
if (mech->length < 128 && ssh_gssapi_check_mechanism(&gssctxt,
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3224,7 +3786,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> if (!ok || mech == NULL)
return 0;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1023,6 +1108,55 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1037,6 +1134,55 @@ input_gssapi_error(int type, u_int32_t plen, struct ssh *ssh)
</span> free(lang);
return r;
}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3249,13 +3811,13 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + }
+
+ if ((b = sshbuf_new()) == NULL)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: sshbuf_new failed", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("sshbuf_new failed");
</span> +
+ ssh_gssapi_buildmic(b, authctxt->server_user, authctxt->service,
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "gssapi-keyex");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ "gssapi-keyex", ssh->kex->session_id);
</span> +
+ if ((gssbuf.value = sshbuf_mutable_ptr(b)) == NULL)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: sshbuf_mutable_ptr failed", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_f("sshbuf_mutable_ptr failed");
</span> + gssbuf.length = sshbuf_len(b);
+
+ if (GSS_ERROR(ssh_gssapi_sign(gss_kex_context, &gssbuf, &mic))) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3269,7 +3831,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + (r = sshpkt_put_cstring(ssh, authctxt->method->name)) != 0 ||
+ (r = sshpkt_put_string(ssh, mic.value, mic.length)) != 0 ||
+ (r = sshpkt_send(ssh)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fatal("%s: %s", __func__, ssh_err(r));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ fatal_fr(r, "parsing");
</span> +
+ sshbuf_free(b);
+ gss_release_buffer(&ms, &mic);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3280,31 +3842,22 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> #endif /* GSSAPI */
static int
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/sshd.c 2019-11-08 15:36:59.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/sshd.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -123,6 +123,10 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "version.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include "ssherr.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef USE_SECURITY_SESSION_API
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <Security/AuthSession.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /* Re-exec fds */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define REEXEC_DEVCRYPTO_RESERVED_FD (STDERR_FILENO + 1)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #define REEXEC_STARTUP_PIPE_FD (STDERR_FILENO + 2)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -865,8 +869,8 @@ notify_hostkeys(struct ssh *ssh)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/sshd.c b/sshd.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index ea63d030..eb884efd 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/sshd.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/sshd.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -807,8 +807,8 @@ notify_hostkeys(struct ssh *ssh)
</span> }
<span style='display:block; white-space:pre;background:#ffe0e0;'>- debug3("%s: sent %u hostkeys", __func__, nkeys);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ debug3_f("sent %u hostkeys", nkeys);
</span> if (nkeys == 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-- fatal("%s: no hostkeys", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+- fatal_f("no hostkeys");
</span> - if ((r = sshpkt_send(ssh)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug3("%s: no hostkeys", __func__);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ debug3_f("no hostkeys");
</span> + else if ((r = sshpkt_send(ssh)) != 0)
sshpkt_fatal(ssh, r, "%s: send", __func__);
sshbuf_free(buf);
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -1842,7 +1846,8 @@ main(int ac, char **av)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1898,7 +1898,8 @@ main(int ac, char **av)
</span> free(fp);
}
accumulate_host_timing_secret(cfg, NULL);
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3314,72 +3867,11 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> logit("sshd: no hostkeys available -- exiting.");
exit(1);
}
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2138,6 +2143,60 @@ main(int ac, char **av)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- rdomain == NULL ? "" : "\"");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- free(laddr);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef USE_SECURITY_SESSION_API
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Create a new security session for use by the new user login if
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * the current session is the root session or we are not launched
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * by inetd (eg: debugging mode or server mode). We do not
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * necessarily need to create a session if we are launched from
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * inetd because Panther xinetd will create a session for us.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * The only case where this logic will fail is if there is an
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * inetd running in a non-root session which is not creating
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * new sessions for us. Then all the users will end up in the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * same session (bad).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * When the client exits, the session will be destroyed for us
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * automatically.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * We must create the session before any credentials are stored
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * (including AFS pags, which happens a few lines below).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ OSStatus err = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ SecuritySessionId sid = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ SessionAttributeBits sattrs = 0;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ err = SessionGetInfo(callerSecuritySession, &sid, &sattrs);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ error("SessionGetInfo() failed with error %.8X",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (unsigned) err);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug("Current Session ID is %.8X / Session Attributes are %.8X",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (unsigned) sid, (unsigned) sattrs);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (inetd_flag && !(sattrs & sessionIsRoot))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug("Running in inetd mode in a non-root session... "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "assuming inetd created the session for us.");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug("Creating new security session...");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ err = SessionCreate(0, sessionHasTTY | sessionIsRemote);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ error("SessionCreate() failed with error %.8X",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (unsigned) err);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ err = SessionGetInfo(callerSecuritySession, &sid,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ &sattrs);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (err)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ error("SessionGetInfo() failed with error %.8X",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (unsigned) err);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ else
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug("New Session ID is %.8X / Session Attributes are %.8X",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (unsigned) sid, (unsigned) sattrs);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * We don't want to listen forever unless the other side
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * successfully authenticates itself. So we set up an alarm which is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2334,6 +2393,48 @@ do_ssh2_kex(struct ssh *ssh)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2388,6 +2389,48 @@ do_ssh2_kex(struct ssh *ssh)
</span> myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = compat_pkalg_proposal(
<span style='display:block; white-space:pre;background:#ffe0e0;'>- list_hostkey_types());
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ssh, list_hostkey_types());
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef GSSAPI
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(GSSAPI) && defined(WITH_OPENSSL)
</span> + {
+ char *orig;
+ char *gss = NULL;
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3423,8 +3915,8 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +
/* start key exchange */
if ((r = kex_setup(ssh, myproposal)) != 0)
<span style='display:block; white-space:pre;background:#ffe0e0;'>- fatal("kex_setup: %s", ssh_err(r));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2349,7 +2450,18 @@ do_ssh2_kex(struct ssh *ssh)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ fatal_r(r, "kex_setup");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2403,7 +2446,18 @@ do_ssh2_kex(struct ssh *ssh)
</span> # ifdef OPENSSL_HAS_ECC
kex->kex[KEX_ECDH_SHA2] = kex_gen_server;
# endif
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3435,17 +3927,19 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> + kex->kex[KEX_GSS_GRP14_SHA1] = kexgss_server;
+ kex->kex[KEX_GSS_GRP14_SHA256] = kexgss_server;
+ kex->kex[KEX_GSS_GRP16_SHA512] = kexgss_server;
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+ kex->kex[KEX_GSS_GEX_SHA1] = kexgss_server;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ kex->kex[KEX_GSS_GEX_SHA1] = kexgssgex_server;
</span> + kex->kex[KEX_GSS_NISTP256_SHA256] = kexgss_server;
+ kex->kex[KEX_GSS_C25519_SHA256] = kexgss_server;
+ }
+# endif
+#endif /* WITH_OPENSSL */
kex->kex[KEX_C25519_SHA256] = kex_gen_server;
<span style='display:block; white-space:pre;background:#ffe0e0;'>- kex->kex[KEX_KEM_SNTRUP4591761X25519_SHA512] = kex_gen_server;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server;
</span> kex->load_host_public_key=&get_hostkey_public_by_type;
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/sshd_config 2019-11-08 15:37:17.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/sshd_config 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/sshd_config b/sshd_config
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index c423eba1..f91d293c 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/sshd_config
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/sshd_config
</span> @@ -69,6 +69,8 @@ AuthorizedKeysFile .ssh/authorized_keys
# GSSAPI options
#GSSAPIAuthentication no
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3455,21 +3949,23 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span>
# Set this to 'yes' to enable PAM authentication, account processing,
# and session processing. If this is enabled, PAM authentication will
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/sshd_config.5 2019-11-08 15:37:17.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/sshd_config.5 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -659,6 +659,11 @@ The default is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- Specifies whether user authentication based on GSSAPI is allowed.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/sshd_config.5 b/sshd_config.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index a8d0545c..6076df94 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/sshd_config.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/sshd_config.5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -650,6 +650,11 @@ Specifies whether to automatically destroy the user's credentials cache
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ on logout.
</span> The default is
<span style='display:block; white-space:pre;background:#ffe0e0;'>- .Cm no .
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .Cm yes .
</span> +.It Cm GSSAPIKeyExchange
+Specifies whether key exchange based on GSSAPI is allowed. GSSAPI key exchange
+doesn't rely on ssh keys to verify host identity.
+The default is
+.Cm no .
<span style='display:block; white-space:pre;background:#ffe0e0;'>- .It Cm GSSAPICleanupCredentials
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- Specifies whether to automatically destroy the user's credentials cache
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- on logout.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -678,6 +683,30 @@ machine's default store.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .It Cm GSSAPIStrictAcceptorCheck
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Determines whether to be strict about the identity of the GSSAPI acceptor
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ a client authenticates against.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -664,6 +669,31 @@ machine's default store.
</span> This facility is provided to assist with operation on multi homed machines.
The default is
.Cm yes .
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3477,7 +3973,7 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +Controls whether the user's GSSAPI credentials should be updated following a
+successful connection rekeying. This option can be used to accepted renewed
+or updated credentials from a compatible client. The default is
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+.Cm no .
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.Dq no .
</span> +.Pp
+For this to work
+.Cm GSSAPIKeyExchange
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3496,21 +3992,24 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> +.Ed
+.Pp
+The default is
<span style='display:block; white-space:pre;background:#ffe0e0;'>-+.Dq gss-gex-sha1-,gss-group14-sha1- .
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .It Cm HostbasedAcceptedKeyTypes
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- Specifies the key types that will be accepted for hostbased authentication
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- as a list of comma-separated patterns.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/sshkey.c 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/sshkey.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -145,6 +145,7 @@ static const struct keytype keytypes[] =
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- # endif /* OPENSSL_HAS_NISTP521 */
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++.Dq gss-group14-sha256-,gss-group16-sha512-,gss-nistp256-sha256-,gss-curve25519-sha256-,gss-gex-sha1-,gss-group14-sha1- .
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++This option only applies to connections using GSSAPI.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ .It Cm HostbasedAcceptedAlgorithms
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Specifies the signature algorithms that will be accepted for hostbased
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ authentication as a list of comma-separated patterns.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/sshkey.c b/sshkey.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 0dbc0d87..17f8aa91 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/sshkey.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/sshkey.c
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -156,6 +156,7 @@ static const struct keytype keytypes[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ KEY_ECDSA_SK_CERT, NID_X9_62_prime256v1, 1, 0 },
</span> # endif /* OPENSSL_HAS_ECC */
#endif /* WITH_OPENSSL */
+ { "null", "null", NULL, KEY_NULL, 0, 0, 0 },
{ NULL, NULL, NULL, -1, -1, 0, 0 }
};
<span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -233,7 +234,7 @@ sshkey_alg_list(int certs_only, int plai
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -257,7 +258,7 @@ sshkey_alg_list(int certs_only, int plain_only, int include_sigonly, char sep)
</span> const struct keytype *kt;
for (kt = keytypes; kt->type != -1; kt++) {
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -3519,486 +4018,16 @@ X-Ref: https://salsa.debian.org/ssh-team/openssh/blob/767ee84d3465b6d244a9108de5
</span> continue;
if (!include_sigonly && kt->sigonly)
continue;
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/sshkey.h.orig 2020-09-27 02:25:01.000000000 -0500
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/sshkey.h 2020-12-16 18:42:50.000000000 -0600
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -65,6 +65,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- KEY_ED25519_CERT,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- KEY_XMSS,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- KEY_XMSS_CERT,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ KEY_NULL,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- KEY_ECDSA_SK,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --git a/sshkey.h b/sshkey.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+index 6edc6c5a..94501115 100644
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- a/sshkey.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ b/sshkey.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -71,6 +71,7 @@ enum sshkey_types {
</span> KEY_ECDSA_SK_CERT,
KEY_ED25519_SK,
<span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/auth.c.orig 2020-09-27 02:25:01.000000000 -0500
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/auth.c 2020-12-16 18:45:58.000000000 -0600
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -400,7 +400,8 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case PERMIT_NO_PASSWD:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (strcmp(method, "publickey") == 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- strcmp(method, "hostbased") == 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- strcmp(method, "gssapi-with-mic") == 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ strcmp(method, "gssapi-with-mic") == 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ strcmp(method, "gssapi-keyex") == 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- return 1;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case PERMIT_FORCED_ONLY:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -725,120 +726,6 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * Returns the remote DNS hostname as a string. The returned string must not
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * be freed. NB. this will usually trigger a DNS query the first time it is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * called.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * This function does additional checks on the hostname to mitigate some
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * attacks on legacy rhosts-style authentication.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * XXX is RhostsRSAAuthentication vulnerable to these?
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * XXX Can we remove these checks? (or if not, remove RhostsRSAAuthentication?)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--static char *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--remote_hostname(struct ssh *ssh)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- struct sockaddr_storage from;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- socklen_t fromlen;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- struct addrinfo hints, *ai, *aitop;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- char name[NI_MAXHOST], ntop2[NI_MAXHOST];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- const char *ntop = ssh_remote_ipaddr(ssh);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- /* Get IP address of client. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- fromlen = sizeof(from);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- memset(&from, 0, sizeof(from));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (getpeername(ssh_packet_get_connection_in(ssh),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- (struct sockaddr *)&from, &fromlen) == -1) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- debug("getpeername failed: %.100s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- ipv64_normalise_mapped(&from, &fromlen);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (from.ss_family == AF_INET6)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- fromlen = sizeof(struct sockaddr_in6);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- debug3("Trying to reverse map address %.100s.", ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- /* Map the IP address to a host name. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (getnameinfo((struct sockaddr *)&from, fromlen, name, sizeof(name),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- NULL, 0, NI_NAMEREQD) != 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- /* Host name not found. Use ip address. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * if reverse lookup result looks like a numeric hostname,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * someone is trying to trick us by PTR record like following:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * 1.1.1.10.in-addr.arpa. IN PTR 2.3.4.5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- memset(&hints, 0, sizeof(hints));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- hints.ai_socktype = SOCK_DGRAM; /*dummy*/
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- hints.ai_flags = AI_NUMERICHOST;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (getaddrinfo(name, NULL, &hints, &ai) == 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- logit("Nasty PTR record \"%s\" is set up for %s, ignoring",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- name, ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- freeaddrinfo(ai);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- /* Names are stored in lowercase. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- lowercase(name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * Map it back to an IP address and check that the given
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * address actually is an address of this host. This is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * necessary because anyone with access to a name server can
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * define arbitrary names for an IP address. Mapping from
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * name to IP address can be trusted better (but can still be
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * fooled if the intruder has access to the name server of
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * the domain).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- memset(&hints, 0, sizeof(hints));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- hints.ai_family = from.ss_family;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- hints.ai_socktype = SOCK_STREAM;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (getaddrinfo(name, NULL, &hints, &aitop) != 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- logit("reverse mapping checking getaddrinfo for %.700s "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- "[%s] failed.", name, ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- /* Look for the address from the list of addresses. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- for (ai = aitop; ai; ai = ai->ai_next) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop2,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- sizeof(ntop2), NULL, 0, NI_NUMERICHOST) == 0 &&
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- (strcmp(ntop, ntop2) == 0))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- freeaddrinfo(aitop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- /* If we reached the end of the list, the address was not there. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (ai == NULL) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- /* Address not found for the host name. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- logit("Address %.100s maps to %.600s, but this does not "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- "map back to the address.", ntop, name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- return xstrdup(ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- return xstrdup(name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * Return the canonical name of the host in the other side of the current
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * connection. The host name is cached, so it is efficient to call this
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- * several times.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--const char *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--auth_get_canonical_hostname(struct ssh *ssh, int use_dns)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- static char *dnsname;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (!use_dns)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- return ssh_remote_ipaddr(ssh);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- else if (dnsname != NULL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- return dnsname;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- dnsname = remote_hostname(ssh);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- return dnsname;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * Runs command in a subprocess with a minimal environment.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * Returns pid on success, 0 on failure.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- * The child stdout and stderr maybe captured, left attached or sent to
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null 1970-01-01 00:00:00.000000000 +0000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/auth-compat.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,174 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Copyright (c) 2000 Markus Friedl. All rights reserved.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Redistribution and use in source and binary forms, with or without
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * modification, are permitted provided that the following conditions
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * are met:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * 1. Redistributions of source code must retain the above copyright
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * notice, this list of conditions and the following disclaimer.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * 2. Redistributions in binary form must reproduce the above copyright
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * notice, this list of conditions and the following disclaimer in the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * documentation and/or other materials provided with the distribution.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "includes.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <sys/types.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <sys/stat.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <sys/socket.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <netinet/in.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <errno.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <fcntl.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef HAVE_PATHS_H
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+# include <paths.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <pwd.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef HAVE_LOGIN_H
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <login.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef USE_SHADOW
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <shadow.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef HAVE_LIBGEN_H
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <libgen.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <stdarg.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <stdio.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <string.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <unistd.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <limits.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include <netdb.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "auth-compat.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "log.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "canohost.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "misc.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/**************** XXX moved from auth.c ****************/
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Returns the remote DNS hostname as a string. The returned string must not
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * be freed. NB. this will usually trigger a DNS query the first time it is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * called.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * This function does additional checks on the hostname to mitigate some
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * attacks on legacy rhosts-style authentication.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * XXX is RhostsRSAAuthentication vulnerable to these?
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * XXX Can we remove these checks? (or if not, remove RhostsRSAAuthentication?)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+char *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+remote_hostname(struct ssh *ssh)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ struct sockaddr_storage from;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ socklen_t fromlen;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ struct addrinfo hints, *ai, *aitop;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ char name[NI_MAXHOST], ntop2[NI_MAXHOST];
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ const char *ntop = ssh_remote_ipaddr(ssh);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* Get IP address of client. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fromlen = sizeof(from);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ memset(&from, 0, sizeof(from));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (getpeername(ssh_packet_get_connection_in(ssh),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (struct sockaddr *)&from, &fromlen) == -1) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug("getpeername failed: %.100s", strerror(errno));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return strdup(ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ ipv64_normalise_mapped(&from, &fromlen);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (from.ss_family == AF_INET6)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ fromlen = sizeof(struct sockaddr_in6);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ debug3("Trying to reverse map address %.100s.", ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* Map the IP address to a host name. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (getnameinfo((struct sockaddr *)&from, fromlen, name, sizeof(name),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ NULL, 0, NI_NAMEREQD) != 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* Host name not found. Use ip address. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return strdup(ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * if reverse lookup result looks like a numeric hostname,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * someone is trying to trick us by PTR record like following:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * 1.1.1.10.in-addr.arpa. IN PTR 2.3.4.5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ memset(&hints, 0, sizeof(hints));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ hints.ai_socktype = SOCK_DGRAM; /*dummy*/
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ hints.ai_flags = AI_NUMERICHOST;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (getaddrinfo(name, NULL, &hints, &ai) == 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ logit("Nasty PTR record \"%s\" is set up for %s, ignoring",
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ name, ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ freeaddrinfo(ai);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return strdup(ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* Names are stored in lowercase. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ lowercase(name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Map it back to an IP address and check that the given
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * address actually is an address of this host. This is
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * necessary because anyone with access to a name server can
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * define arbitrary names for an IP address. Mapping from
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * name to IP address can be trusted better (but can still be
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * fooled if the intruder has access to the name server of
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * the domain).
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ memset(&hints, 0, sizeof(hints));
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ hints.ai_family = from.ss_family;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ hints.ai_socktype = SOCK_STREAM;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (getaddrinfo(name, NULL, &hints, &aitop) != 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ logit("reverse mapping checking getaddrinfo for %.700s "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "[%s] failed.", name, ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return strdup(ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* Look for the address from the list of addresses. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ for (ai = aitop; ai; ai = ai->ai_next) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop2,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ sizeof(ntop2), NULL, 0, NI_NUMERICHOST) == 0 &&
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ (strcmp(ntop, ntop2) == 0))
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ freeaddrinfo(aitop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* If we reached the end of the list, the address was not there. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (ai == NULL) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ /* Address not found for the host name. */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ logit("Address %.100s maps to %.600s, but this does not "
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "map back to the address.", ntop, name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return strdup(ntop);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return strdup(name);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Return the canonical name of the host in the other side of the current
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * connection. The host name is cached, so it is efficient to call this
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * several times.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+const char *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+auth_get_canonical_hostname(struct ssh *ssh, int use_dns)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+{
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ static char *dnsname;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (!use_dns)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return ssh_remote_ipaddr(ssh);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ else if (dnsname != NULL)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return dnsname;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ else {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ dnsname = remote_hostname(ssh);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ return dnsname;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+}
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- /dev/null 1970-01-01 00:00:00.000000000 +0000
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/auth-compat.h 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -0,0 +1,34 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+/*
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Copyright (c) 2000 Markus Friedl. All rights reserved.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * Redistribution and use in source and binary forms, with or without
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * modification, are permitted provided that the following conditions
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * are met:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * 1. Redistributions of source code must retain the above copyright
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * notice, this list of conditions and the following disclaimer.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * 2. Redistributions in binary form must reproduce the above copyright
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * notice, this list of conditions and the following disclaimer in the
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * documentation and/or other materials provided with the distribution.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ *
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifndef AUTH_COMPAT_H
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#define AUTH_COMPAT_H
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "packet.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+char *remote_hostname(struct ssh *);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+const char *auth_get_canonical_hostname(struct ssh *, int);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/auth.h 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/auth.h 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -40,6 +40,8 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #include <krb5.h>
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#include "auth-compat.h"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- struct passwd;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- struct ssh;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- struct sshbuf;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -194,8 +196,6 @@ FILE *auth_openkeyfile(const char *, str
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- FILE *auth_openprincipals(const char *, struct passwd *, int);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int auth_key_is_revoked(struct sshkey *);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--const char *auth_get_canonical_hostname(struct ssh *, int);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- HostStatus
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- check_key_in_hostfiles(struct passwd *, struct sshkey *, const char *,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- const char *, const char *);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/kexdh.c 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/kexdh.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -48,13 +48,23 @@ kex_dh_keygen(struct kex *kex)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- switch (kex->kex_type) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case KEX_DH_GRP1_SHA1:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef GSSAPI
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ case KEX_GSS_GRP1_SHA1:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- kex->dh = dh_new_group1();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case KEX_DH_GRP14_SHA1:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case KEX_DH_GRP14_SHA256:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef GSSAPI
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ case KEX_GSS_GRP14_SHA1:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ case KEX_GSS_GRP14_SHA256:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- kex->dh = dh_new_group14();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case KEX_DH_GRP16_SHA512:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#ifdef GSSAPI
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ case KEX_GSS_GRP16_SHA512:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+#endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- kex->dh = dh_new_group16();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- break;
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- case KEX_DH_GRP18_SHA512:
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/kexgen.c 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/kexgen.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -44,7 +44,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- static int input_kex_gen_init(int, u_int32_t, struct ssh *);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- static int input_kex_gen_reply(int type, u_int32_t seq, struct ssh *ssh);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--static int
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+int
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- kex_gen_hash(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- int hash_alg,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- const struct sshbuf *client_version,
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/session.c 2019-11-08 15:37:14.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/session.c 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -2689,13 +2689,19 @@ do_cleanup(struct ssh *ssh, Authctxt *au
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef KRB5
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- if (options.kerberos_ticket_cleanup &&
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- authctxt->krb5_ctx)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ authctxt->krb5_ctx) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ temporarily_use_uid(authctxt->pw);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- krb5_cleanup_proc(authctxt);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ restore_uid();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #ifdef GSSAPI
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- if (options.gss_cleanup_creds)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ if (options.gss_cleanup_creds) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ temporarily_use_uid(authctxt->pw);
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- ssh_gssapi_cleanup_creds();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ restore_uid();
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ }
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ KEY_ED25519_SK_CERT,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++ KEY_NULL,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ KEY_UNSPEC
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span>
<span style='display:block; white-space:pre;background:#ffe0e0;'>- /* remove agent socket */
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/ssh.1 2019-10-09 02:31:03.000000000 +0200
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/ssh.1 2019-11-08 15:37:23.000000000 +0100
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -497,7 +497,13 @@ For full details of the options listed b
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .It GatewayPorts
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .It GlobalKnownHostsFile
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .It GSSAPIAuthentication
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+.It GSSAPIKeyExchange
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+.It GSSAPIClientIdentity
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .It GSSAPIDelegateCredentials
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+.It GSSAPIKexAlgorithms
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+.It GSSAPIRenewalForcesRekey
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+.It GSSAPIServerIdentity
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+.It GSSAPITrustDns
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .It HashKnownHosts
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .It Host
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .It HostbasedAuthentication
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -573,6 +579,8 @@ flag),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (supported message integrity codes),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .Ar kex
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (key exchange algorithms),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+.Ar kex-gss
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+(GSSAPI key exchange algorithms),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .Ar key
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- (key types),
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- .Ar key-cert
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>---- a/ssh.c.orig 2020-09-27 02:25:01.000000000 -0500
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+++ b/ssh.c 2020-12-16 18:50:05.000000000 -0600
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -801,6 +801,8 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- else if (strcmp(optarg, "kex") == 0 ||
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- strcasecmp(optarg, "KexAlgorithms") == 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- cp = kex_alg_list('\n');
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ else if (strcmp(optarg, "kex-gss") == 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ cp = kex_gss_alg_list('\n');
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- else if (strcmp(optarg, "key") == 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- cp = sshkey_alg_list(0, 0, 0, '\n');
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- else if (strcmp(optarg, "key-cert") == 0)
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-@@ -825,7 +827,7 @@
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- cp[n] = '\n';
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- } else if (strcmp(optarg, "help") == 0) {
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- cp = xstrdup(
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-- "cipher\ncipher-auth\ncompression\nkex\n"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-+ "cipher\ncipher-auth\ncompression\nkex-gss\nkex\n"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- "key\nkey-cert\nkey-plain\nkey-sig\nmac\n"
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- "protocol-version\nsig");
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>- }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/openssh/files/series b/net/openssh/files/series
</span><span style='display:block; white-space:pre;color:#808080;'>index 9152056444c..86f0232ffb0 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/openssh/files/series
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/openssh/files/series
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5,4 +5,4 @@ patch-sshd.c-apple-sandbox-named-external.diff
</span> 0002-Apple-keychain-integration-other-changes.patch
macports-config.patch
patch-openbsd_compat-memmem-bug.diff
<span style='display:block; white-space:pre;background:#ffe0e0;'>-openssh-8.1p1-gsskex-all-20141021-mp-20201216.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+openssh-8.8p1-gsskex.patch
</span><span style='display:block; white-space:pre;color:#808080;'>diff --git a/net/openssh/files/series-gsskex b/net/openssh/files/series-gsskex
</span><span style='display:block; white-space:pre;color:#808080;'>index 9152056444c..86f0232ffb0 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/net/openssh/files/series-gsskex
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/net/openssh/files/series-gsskex
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -5,4 +5,4 @@ patch-sshd.c-apple-sandbox-named-external.diff
</span> 0002-Apple-keychain-integration-other-changes.patch
macports-config.patch
patch-openbsd_compat-memmem-bug.diff
<span style='display:block; white-space:pre;background:#ffe0e0;'>-openssh-8.1p1-gsskex-all-20141021-mp-20201216.patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+openssh-8.8p1-gsskex.patch
</span></pre><pre style='margin:0'>
</pre>