forked from rpms/openssh
		
	6.7p1-1 + 0.9.3-4
This commit is contained in:
		
							parent
							
								
									b457c98bec
								
							
						
					
					
						commit
						1900351913
					
				
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -13,3 +13,4 @@ pam_ssh_agent_auth-0.9.2.tar.bz2 | ||||
| /openssh-6.3p1.tar.gz | ||||
| /openssh-6.4p1.tar.gz | ||||
| /openssh-6.6p1.tar.gz | ||||
| /openssh-6.7p1.tar.gz | ||||
|  | ||||
| @ -1,14 +0,0 @@ | ||||
| diff -up openssh-5.6p1/channels.c.exit-deadlock openssh-5.6p1/channels.c
 | ||||
| --- openssh-5.6p1/channels.c.exit-deadlock	2010-08-05 15:09:48.000000000 +0200
 | ||||
| +++ openssh-5.6p1/channels.c	2010-08-23 12:41:43.000000000 +0200
 | ||||
| @@ -1647,6 +1647,10 @@ channel_handle_wfd(Channel *c, fd_set *r
 | ||||
|  	u_int dlen, olen = 0; | ||||
|  	int len; | ||||
|   | ||||
| +	if(c->wfd != -1 && buffer_len(&c->output) > 0 && c->ostate == CHAN_OUTPUT_WAIT_DRAIN) {
 | ||||
| +		debug("channel %d: forcing write", c->self);
 | ||||
| +		FD_SET(c->wfd, writeset);
 | ||||
| +	}
 | ||||
|  	/* Send buffered output data to the socket. */ | ||||
|  	if (c->wfd != -1 && | ||||
|  	    FD_ISSET(c->wfd, writeset) && | ||||
| @ -1,72 +0,0 @@ | ||||
| diff -up openssh-5.9p1/dns.c.edns openssh-5.9p1/dns.c
 | ||||
| --- openssh-5.9p1/dns.c.edns	2010-08-31 14:41:14.000000000 +0200
 | ||||
| +++ openssh-5.9p1/dns.c	2011-09-09 08:05:27.782440497 +0200
 | ||||
| @@ -177,6 +177,7 @@ verify_host_key_dns(const char *hostname
 | ||||
|  { | ||||
|  	u_int counter; | ||||
|  	int result; | ||||
| +	unsigned int rrset_flags = 0;
 | ||||
|  	struct rrsetinfo *fingerprints = NULL; | ||||
|   | ||||
|  	u_int8_t hostkey_algorithm; | ||||
| @@ -200,8 +201,19 @@ verify_host_key_dns(const char *hostname
 | ||||
|  		return -1; | ||||
|  	} | ||||
|   | ||||
| +	/*
 | ||||
| +	 * Original getrrsetbyname function, found on OpenBSD for example,
 | ||||
| +	 * doesn't accept any flag and prerequisite for obtaining AD bit in
 | ||||
| +	 * DNS response is set by "options edns0" in resolv.conf.
 | ||||
| +	 *
 | ||||
| +	 * Our version is more clever and use RRSET_FORCE_EDNS0 flag.
 | ||||
| +	 */
 | ||||
| +#ifndef HAVE_GETRRSETBYNAME
 | ||||
| +	rrset_flags |= RRSET_FORCE_EDNS0;
 | ||||
| +#endif
 | ||||
|  	result = getrrsetbyname(hostname, DNS_RDATACLASS_IN, | ||||
| -	    DNS_RDATATYPE_SSHFP, 0, &fingerprints);
 | ||||
| +	    DNS_RDATATYPE_SSHFP, rrset_flags, &fingerprints);
 | ||||
| +
 | ||||
|  	if (result) { | ||||
|  		verbose("DNS lookup error: %s", dns_result_totext(result)); | ||||
|  		return -1; | ||||
| diff -up openssh-5.9p1/openbsd-compat/getrrsetbyname.c.edns openssh-5.9p1/openbsd-compat/getrrsetbyname.c
 | ||||
| --- openssh-5.9p1/openbsd-compat/getrrsetbyname.c.edns	2009-07-13 03:38:23.000000000 +0200
 | ||||
| +++ openssh-5.9p1/openbsd-compat/getrrsetbyname.c	2011-09-09 15:03:39.930500801 +0200
 | ||||
| @@ -209,8 +209,8 @@ getrrsetbyname(const char *hostname, uns
 | ||||
|  		goto fail; | ||||
|  	} | ||||
|   | ||||
| -	/* don't allow flags yet, unimplemented */
 | ||||
| -	if (flags) {
 | ||||
| +	/* Allow RRSET_FORCE_EDNS0 flag only. */
 | ||||
| +	if ((flags & ~RRSET_FORCE_EDNS0) != 0) {
 | ||||
|  		result = ERRSET_INVAL; | ||||
|  		goto fail; | ||||
|  	} | ||||
| @@ -226,9 +226,9 @@ getrrsetbyname(const char *hostname, uns
 | ||||
|  #endif /* DEBUG */ | ||||
|   | ||||
|  #ifdef RES_USE_DNSSEC | ||||
| -	/* turn on DNSSEC if EDNS0 is configured */
 | ||||
| -	if (_resp->options & RES_USE_EDNS0)
 | ||||
| -		_resp->options |= RES_USE_DNSSEC;
 | ||||
| +	/* turn on DNSSEC if required  */
 | ||||
| +	if (flags & RRSET_FORCE_EDNS0)
 | ||||
| +		_resp->options |= (RES_USE_EDNS0|RES_USE_DNSSEC);
 | ||||
|  #endif /* RES_USE_DNSEC */ | ||||
|   | ||||
|  	/* make query */ | ||||
| diff -up openssh-5.9p1/openbsd-compat/getrrsetbyname.h.edns openssh-5.9p1/openbsd-compat/getrrsetbyname.h
 | ||||
| --- openssh-5.9p1/openbsd-compat/getrrsetbyname.h.edns	2007-10-26 08:26:50.000000000 +0200
 | ||||
| +++ openssh-5.9p1/openbsd-compat/getrrsetbyname.h	2011-09-09 08:05:27.965438689 +0200
 | ||||
| @@ -72,6 +72,9 @@
 | ||||
|  #ifndef RRSET_VALIDATED | ||||
|  # define RRSET_VALIDATED	1 | ||||
|  #endif | ||||
| +#ifndef RRSET_FORCE_EDNS0
 | ||||
| +# define RRSET_FORCE_EDNS0	0x0001
 | ||||
| +#endif
 | ||||
|   | ||||
|  /* | ||||
|   * Return codes for getrrsetbyname() | ||||
| @ -1,7 +1,8 @@ | ||||
| diff -up openssh-6.2p1/configure.ac.vendor openssh-6.2p1/configure.ac
 | ||||
| --- openssh-6.2p1/configure.ac.vendor	2013-03-25 19:34:01.277495179 +0100
 | ||||
| +++ openssh-6.2p1/configure.ac	2013-03-25 19:34:01.377495818 +0100
 | ||||
| @@ -4420,6 +4420,12 @@ AC_ARG_WITH([lastlog],
 | ||||
| diff --git a/configure.ac b/configure.ac
 | ||||
| index 6553074..8dedb95 100644
 | ||||
| --- a/configure.ac
 | ||||
| +++ b/configure.ac
 | ||||
| @@ -4676,6 +4676,12 @@ AC_ARG_WITH([lastlog],
 | ||||
|  		fi | ||||
|  	] | ||||
|  ) | ||||
| @ -14,7 +15,7 @@ diff -up openssh-6.2p1/configure.ac.vendor openssh-6.2p1/configure.ac | ||||
|   | ||||
|  dnl lastlog, [uw]tmpx? detection | ||||
|  dnl  NOTE: set the paths in the platform section to avoid the | ||||
| @@ -4681,6 +4687,7 @@ echo "           Translate v4 in v6 hack
 | ||||
| @@ -4938,6 +4944,7 @@ echo "           Translate v4 in v6 hack: $IPV4_IN6_HACK_MSG"
 | ||||
|  echo "                  BSD Auth support: $BSD_AUTH_MSG" | ||||
|  echo "              Random number source: $RAND_MSG" | ||||
|  echo "             Privsep sandbox style: $SANDBOX_STYLE" | ||||
| @ -22,10 +23,11 @@ diff -up openssh-6.2p1/configure.ac.vendor openssh-6.2p1/configure.ac | ||||
|   | ||||
|  echo "" | ||||
|   | ||||
| diff -up openssh-6.2p1/servconf.c.vendor openssh-6.2p1/servconf.c
 | ||||
| --- openssh-6.2p1/servconf.c.vendor	2013-03-25 19:34:01.197494668 +0100
 | ||||
| +++ openssh-6.2p1/servconf.c	2013-03-25 19:34:01.379495831 +0100
 | ||||
| @@ -128,6 +128,7 @@ initialize_server_options(ServerOptions
 | ||||
| diff --git a/servconf.c b/servconf.c
 | ||||
| index e3ebaac..c8a3f28 100644
 | ||||
| --- a/servconf.c
 | ||||
| +++ b/servconf.c
 | ||||
| @@ -141,6 +141,7 @@ initialize_server_options(ServerOptions *options)
 | ||||
|  	options->max_authtries = -1; | ||||
|  	options->max_sessions = -1; | ||||
|  	options->banner = NULL; | ||||
| @ -33,17 +35,16 @@ diff -up openssh-6.2p1/servconf.c.vendor openssh-6.2p1/servconf.c | ||||
|  	options->use_dns = -1; | ||||
|  	options->client_alive_interval = -1; | ||||
|  	options->client_alive_count_max = -1; | ||||
| @@ -287,6 +288,9 @@ fill_default_server_options(ServerOption
 | ||||
| @@ -310,6 +311,8 @@ fill_default_server_options(ServerOptions *options)
 | ||||
|  		options->ip_qos_bulk = IPTOS_THROUGHPUT; | ||||
|  	if (options->version_addendum == NULL) | ||||
|  		options->version_addendum = xstrdup(""); | ||||
| +	if (options->show_patchlevel == -1)
 | ||||
| +		options->show_patchlevel = 0;
 | ||||
| +
 | ||||
|  	/* Turn privilege separation on by default */ | ||||
|  	if (use_privsep == -1) | ||||
|  		use_privsep = PRIVSEP_NOSANDBOX; | ||||
| @@ -324,7 +328,7 @@ typedef enum {
 | ||||
|  	if (options->fwd_opts.streamlocal_bind_mask == (mode_t)-1) | ||||
|  		options->fwd_opts.streamlocal_bind_mask = 0177; | ||||
|  	if (options->fwd_opts.streamlocal_bind_unlink == -1) | ||||
| @@ -353,7 +356,7 @@ typedef enum {
 | ||||
|  	sIgnoreUserKnownHosts, sCiphers, sMacs, sProtocol, sPidFile, | ||||
|  	sGatewayPorts, sPubkeyAuthentication, sXAuthLocation, sSubsystem, | ||||
|  	sMaxStartups, sMaxAuthTries, sMaxSessions, | ||||
| @ -52,7 +53,7 @@ diff -up openssh-6.2p1/servconf.c.vendor openssh-6.2p1/servconf.c | ||||
|  	sHostbasedUsesNameFromPacketOnly, sClientAliveInterval, | ||||
|  	sClientAliveCountMax, sAuthorizedKeysFile, | ||||
|  	sGssAuthentication, sGssCleanupCreds, sAcceptEnv, sPermitTunnel, | ||||
| @@ -439,6 +443,7 @@ static struct {
 | ||||
| @@ -467,6 +470,7 @@ static struct {
 | ||||
|  	{ "maxauthtries", sMaxAuthTries, SSHCFG_ALL }, | ||||
|  	{ "maxsessions", sMaxSessions, SSHCFG_ALL }, | ||||
|  	{ "banner", sBanner, SSHCFG_ALL }, | ||||
| @ -60,7 +61,7 @@ diff -up openssh-6.2p1/servconf.c.vendor openssh-6.2p1/servconf.c | ||||
|  	{ "usedns", sUseDNS, SSHCFG_GLOBAL }, | ||||
|  	{ "verifyreversemapping", sDeprecated, SSHCFG_GLOBAL }, | ||||
|  	{ "reversemappingcheck", sDeprecated, SSHCFG_GLOBAL }, | ||||
| @@ -1163,6 +1168,10 @@ process_server_config_line(ServerOptions
 | ||||
| @@ -1263,6 +1267,10 @@ process_server_config_line(ServerOptions *options, char *line,
 | ||||
|  		multistate_ptr = multistate_privsep; | ||||
|  		goto parse_multistate; | ||||
|   | ||||
| @ -71,18 +72,19 @@ diff -up openssh-6.2p1/servconf.c.vendor openssh-6.2p1/servconf.c | ||||
|  	case sAllowUsers: | ||||
|  		while ((arg = strdelim(&cp)) && *arg != '\0') { | ||||
|  			if (options->num_allow_users >= MAX_ALLOW_USERS) | ||||
| @@ -1950,6 +1959,7 @@ dump_config(ServerOptions *o)
 | ||||
| @@ -2081,6 +2089,7 @@ dump_config(ServerOptions *o)
 | ||||
|  	dump_cfg_fmtint(sUseLogin, o->use_login); | ||||
|  	dump_cfg_fmtint(sCompression, o->compression); | ||||
|  	dump_cfg_fmtint(sGatewayPorts, o->gateway_ports); | ||||
|  	dump_cfg_fmtint(sGatewayPorts, o->fwd_opts.gateway_ports); | ||||
| +	dump_cfg_fmtint(sShowPatchLevel, o->show_patchlevel);
 | ||||
|  	dump_cfg_fmtint(sUseDNS, o->use_dns); | ||||
|  	dump_cfg_fmtint(sAllowTcpForwarding, o->allow_tcp_forwarding); | ||||
|  	dump_cfg_fmtint(sUsePrivilegeSeparation, use_privsep); | ||||
| diff -up openssh-6.2p1/servconf.h.vendor openssh-6.2p1/servconf.h
 | ||||
| --- openssh-6.2p1/servconf.h.vendor	2013-01-09 05:56:45.000000000 +0100
 | ||||
| +++ openssh-6.2p1/servconf.h	2013-03-25 19:34:01.379495831 +0100
 | ||||
| @@ -147,6 +147,7 @@ typedef struct {
 | ||||
|  	dump_cfg_fmtint(sAllowStreamLocalForwarding, o->allow_streamlocal_forwarding); | ||||
| diff --git a/servconf.h b/servconf.h
 | ||||
| index 49b228b..21719e2 100644
 | ||||
| --- a/servconf.h
 | ||||
| +++ b/servconf.h
 | ||||
| @@ -149,6 +149,7 @@ typedef struct {
 | ||||
|  	int	max_authtries; | ||||
|  	int	max_sessions; | ||||
|  	char   *banner;			/* SSH-2 banner message */ | ||||
| @ -90,10 +92,34 @@ diff -up openssh-6.2p1/servconf.h.vendor openssh-6.2p1/servconf.h | ||||
|  	int	use_dns; | ||||
|  	int	client_alive_interval;	/* | ||||
|  					 * poke the client this often to | ||||
| diff -up openssh-6.2p1/sshd_config.vendor openssh-6.2p1/sshd_config
 | ||||
| --- openssh-6.2p1/sshd_config.vendor	2013-03-25 19:34:01.380495837 +0100
 | ||||
| +++ openssh-6.2p1/sshd_config	2013-03-25 19:44:43.471296362 +0100
 | ||||
| @@ -118,6 +118,7 @@ UsePrivilegeSeparation sandbox		# Defaul
 | ||||
| diff --git a/sshd.c b/sshd.c
 | ||||
| index afe9afa..193b206 100644
 | ||||
| --- a/sshd.c
 | ||||
| +++ b/sshd.c
 | ||||
| @@ -432,7 +432,7 @@ sshd_exchange_identification(int sock_in, int sock_out)
 | ||||
|  	} | ||||
|   | ||||
|  	xasprintf(&server_version_string, "SSH-%d.%d-%.100s%s%s%s", | ||||
| -	    major, minor, SSH_VERSION,
 | ||||
| +	    major, minor, (options.show_patchlevel == 1) ? SSH_VENDOR_PATCHLEVEL : SSH_VERSION,
 | ||||
|  	    *options.version_addendum == '\0' ? "" : " ", | ||||
|  	    options.version_addendum, newline); | ||||
|   | ||||
| @@ -1677,7 +1677,8 @@ main(int ac, char **av)
 | ||||
|  		exit(1); | ||||
|  	} | ||||
|   | ||||
| -	debug("sshd version %s, %s", SSH_VERSION,
 | ||||
| +	debug("sshd version %s, %s", 
 | ||||
| +		(options.show_patchlevel == 1) ? SSH_VENDOR_PATCHLEVEL : SSH_VERSION,
 | ||||
|  #ifdef WITH_OPENSSL | ||||
|  	    SSLeay_version(SSLEAY_VERSION) | ||||
|  #else | ||||
| diff --git a/sshd_config b/sshd_config
 | ||||
| index 3092ac6..da3db5d 100644
 | ||||
| --- a/sshd_config
 | ||||
| +++ b/sshd_config
 | ||||
| @@ -119,6 +119,7 @@ UsePrivilegeSeparation sandbox		# Default for new installations.
 | ||||
|  #Compression delayed | ||||
|  #ClientAliveInterval 0 | ||||
|  #ClientAliveCountMax 3 | ||||
| @ -101,10 +127,11 @@ diff -up openssh-6.2p1/sshd_config.vendor openssh-6.2p1/sshd_config | ||||
|  #UseDNS yes | ||||
|  #PidFile /var/run/sshd.pid | ||||
|  #MaxStartups 10:30:100 | ||||
| diff -up openssh-6.2p1/sshd_config.0.vendor openssh-6.2p1/sshd_config.0
 | ||||
| --- openssh-6.2p1/sshd_config.0.vendor	2013-03-25 19:34:01.361495716 +0100
 | ||||
| +++ openssh-6.2p1/sshd_config.0	2013-03-25 19:34:01.381495844 +0100
 | ||||
| @@ -595,6 +595,11 @@ DESCRIPTION
 | ||||
| diff --git a/sshd_config.0 b/sshd_config.0
 | ||||
| index 43867d3..a3898c3 100644
 | ||||
| --- a/sshd_config.0
 | ||||
| +++ b/sshd_config.0
 | ||||
| @@ -700,6 +700,11 @@ DESCRIPTION
 | ||||
|               Defines the number of bits in the ephemeral protocol version 1 | ||||
|               server key.  The minimum value is 512, and the default is 1024. | ||||
|   | ||||
| @ -113,13 +140,14 @@ diff -up openssh-6.2p1/sshd_config.0.vendor openssh-6.2p1/sshd_config.0 | ||||
| +	     the binary in the server identification string.  The patch level
 | ||||
| +	     is set at compile-time.  The default is M-bM-^@M-^\noM-bM-^@M-^].
 | ||||
| +
 | ||||
|       StrictModes | ||||
|               Specifies whether sshd(8) should check file modes and ownership | ||||
|               of the user's files and home directory before accepting login. | ||||
| diff -up openssh-6.2p1/sshd_config.5.vendor openssh-6.2p1/sshd_config.5
 | ||||
| --- openssh-6.2p1/sshd_config.5.vendor	2013-03-25 19:34:01.362495722 +0100
 | ||||
| +++ openssh-6.2p1/sshd_config.5	2013-03-25 19:34:01.382495850 +0100
 | ||||
| @@ -1019,6 +1019,14 @@ This option applies to protocol version
 | ||||
|       StreamLocalBindMask | ||||
|               Sets the octal file creation mode mask (umask) used when creating | ||||
|               a Unix-domain socket file for local or remote port forwarding. | ||||
| diff --git a/sshd_config.5 b/sshd_config.5
 | ||||
| index 89a0cf2..cccb310 100644
 | ||||
| --- a/sshd_config.5
 | ||||
| +++ b/sshd_config.5
 | ||||
| @@ -1200,6 +1200,13 @@ This option applies to protocol version 1 only.
 | ||||
|  .It Cm ServerKeyBits | ||||
|  Defines the number of bits in the ephemeral protocol version 1 server key. | ||||
|  The minimum value is 512, and the default is 1024. | ||||
| @ -130,29 +158,6 @@ diff -up openssh-6.2p1/sshd_config.5.vendor openssh-6.2p1/sshd_config.5 | ||||
| +The patch level is set at compile-time. 
 | ||||
| +The default is 
 | ||||
| +.Dq no . 
 | ||||
| +This option applies to protocol version 1 only. 
 | ||||
|  .It Cm StrictModes | ||||
|  Specifies whether | ||||
|  .Xr sshd 8 | ||||
| diff -up openssh-6.2p1/sshd.c.vendor openssh-6.2p1/sshd.c
 | ||||
| --- openssh-6.2p1/sshd.c.vendor	2013-03-25 19:34:01.332495531 +0100
 | ||||
| +++ openssh-6.2p1/sshd.c	2013-03-25 19:44:11.864112092 +0100
 | ||||
| @@ -442,7 +442,7 @@ sshd_exchange_identification(int sock_in
 | ||||
|  	} | ||||
|   | ||||
|  	xasprintf(&server_version_string, "SSH-%d.%d-%.100s%s%s%s", | ||||
| -	    major, minor, SSH_VERSION,
 | ||||
| +	    major, minor, (options.show_patchlevel == 1) ? SSH_VENDOR_PATCHLEVEL : SSH_VERSION,
 | ||||
|  	    *options.version_addendum == '\0' ? "" : " ", | ||||
|  	    options.version_addendum, newline); | ||||
|   | ||||
| @@ -1675,7 +1675,8 @@ main(int ac, char **av)
 | ||||
|  		exit(1); | ||||
|  	} | ||||
|   | ||||
| -	debug("sshd version %s, %s", SSH_VERSION,
 | ||||
| +	debug("sshd version %s, %s",
 | ||||
| +	    (options.show_patchlevel == 1) ? SSH_VENDOR_PATCHLEVEL : SSH_VERSION,
 | ||||
|  	    SSLeay_version(SSLEAY_VERSION)); | ||||
|   | ||||
|  	/* Store privilege separation user for later use if required. */ | ||||
|  .It Cm StreamLocalBindMask | ||||
|  Sets the octal file creation mode mask | ||||
|  .Pq umask | ||||
|  | ||||
| @ -1,212 +0,0 @@ | ||||
| diff --git a/audit-bsm.c b/audit-bsm.c
 | ||||
| index 5160869..c7a1b47 100644
 | ||||
| --- a/audit-bsm.c
 | ||||
| +++ b/audit-bsm.c
 | ||||
| @@ -481,7 +481,7 @@ audit_unsupported_body(int what)
 | ||||
|  } | ||||
|   | ||||
|  void | ||||
| -audit_kex_body(int ctos, char *enc, char *mac, char *compress, pid_t pid, uid_t uid)
 | ||||
| +audit_kex_body(int ctos, char *enc, char *mac, char *compress, char *pfs, pid_t pid, uid_t uid)
 | ||||
|  { | ||||
|  	/* not implemented */ | ||||
|  } | ||||
| diff --git a/audit-linux.c b/audit-linux.c
 | ||||
| index 6954fc1..6686f6a 100644
 | ||||
| --- a/audit-linux.c
 | ||||
| +++ b/audit-linux.c
 | ||||
| @@ -297,7 +297,7 @@ audit_unsupported_body(int what)
 | ||||
|  const static char *direction[] = { "from-server", "from-client", "both" }; | ||||
|   | ||||
|  void | ||||
| -audit_kex_body(int ctos, char *enc, char *mac, char *compress, pid_t pid,
 | ||||
| +audit_kex_body(int ctos, char *enc, char *mac, char *compress, char *pfs, pid_t pid,
 | ||||
|  	       uid_t uid) | ||||
|  { | ||||
|  #ifdef AUDIT_CRYPTO_SESSION | ||||
| @@ -306,8 +306,8 @@ audit_kex_body(int ctos, char *enc, char *mac, char *compress, pid_t pid,
 | ||||
|  	Cipher *cipher = cipher_by_name(enc); | ||||
|  	char *s; | ||||
|   | ||||
| -	snprintf(buf, sizeof(buf), "op=start direction=%s cipher=%s ksize=%d mac=%s spid=%jd suid=%jd rport=%d laddr=%s lport=%d ",
 | ||||
| -		direction[ctos], enc, cipher ? 8 * cipher->key_len : 0, mac,
 | ||||
| +	snprintf(buf, sizeof(buf), "op=start direction=%s cipher=%s ksize=%d mac=%s pfs=%s spid=%jd suid=%jd rport=%d laddr=%s lport=%d ",
 | ||||
| +		direction[ctos], enc, cipher ? 8 * cipher->key_len : 0, mac, pfs,
 | ||||
|  		(intmax_t)pid, (intmax_t)uid, | ||||
|  		get_remote_port(), (s = get_local_ipaddr(packet_get_connection_in())), get_local_port()); | ||||
|  	free(s); | ||||
| diff --git a/audit.c b/audit.c
 | ||||
| index 13c6849..5b49434 100644
 | ||||
| --- a/audit.c
 | ||||
| +++ b/audit.c
 | ||||
| @@ -135,9 +135,9 @@ audit_unsupported(int what)
 | ||||
|  } | ||||
|   | ||||
|  void | ||||
| -audit_kex(int ctos, char *enc, char *mac, char *comp)
 | ||||
| +audit_kex(int ctos, char *enc, char *mac, char *comp, char *pfs)
 | ||||
|  { | ||||
| -	PRIVSEP(audit_kex_body(ctos, enc, mac, comp, getpid(), getuid()));
 | ||||
| +	PRIVSEP(audit_kex_body(ctos, enc, mac, comp, pfs, getpid(), getuid()));
 | ||||
|  } | ||||
|   | ||||
|  void | ||||
| @@ -270,11 +270,11 @@ audit_unsupported_body(int what)
 | ||||
|   * This will be called on succesfull protocol negotiation. | ||||
|   */ | ||||
|  void | ||||
| -audit_kex_body(int ctos, char *enc, char *mac, char *compress, pid_t pid,
 | ||||
| +audit_kex_body(int ctos, char *enc, char *mac, char *compress, char *pfs, pid_t pid,
 | ||||
|  	       uid_t uid) | ||||
|  { | ||||
| -	debug("audit protocol negotiation euid %d direction %d cipher %s mac %s compresion %s from pid %ld uid %u",
 | ||||
| -		(unsigned)geteuid(), ctos, enc, mac, compress, (long)pid,
 | ||||
| +	debug("audit protocol negotiation euid %d direction %d cipher %s mac %s compresion %s pfs %s from pid %ld uid %u",
 | ||||
| +		(unsigned)geteuid(), ctos, enc, mac, compress, pfs, (long)pid,
 | ||||
|  	        (unsigned)uid); | ||||
|  } | ||||
|   | ||||
| diff --git a/audit.h b/audit.h
 | ||||
| index a2dc3ff..903df66 100644
 | ||||
| --- a/audit.h
 | ||||
| +++ b/audit.h
 | ||||
| @@ -61,9 +61,9 @@ ssh_audit_event_t audit_classify_auth(const char *);
 | ||||
|  int	audit_keyusage(int, const char *, unsigned, char *, int); | ||||
|  void	audit_key(int, int *, const Key *); | ||||
|  void	audit_unsupported(int); | ||||
| -void	audit_kex(int, char *, char *, char *);
 | ||||
| +void	audit_kex(int, char *, char *, char *, char *);
 | ||||
|  void	audit_unsupported_body(int); | ||||
| -void	audit_kex_body(int, char *, char *, char *, pid_t, uid_t);
 | ||||
| +void	audit_kex_body(int, char *, char *, char *, char *, pid_t, uid_t);
 | ||||
|  void	audit_session_key_free(int ctos); | ||||
|  void	audit_session_key_free_body(int ctos, pid_t, uid_t); | ||||
|  void	audit_destroy_sensitive_data(const char *, pid_t, uid_t); | ||||
| diff --git a/auditstub.c b/auditstub.c
 | ||||
| index 45817e0..116f460 100644
 | ||||
| --- a/auditstub.c
 | ||||
| +++ b/auditstub.c
 | ||||
| @@ -35,7 +35,7 @@ audit_unsupported(int n)
 | ||||
|  } | ||||
|   | ||||
|  void | ||||
| -audit_kex(int ctos, char *enc, char *mac, char *comp)
 | ||||
| +audit_kex(int ctos, char *enc, char *mac, char *comp, char *pfs)
 | ||||
|  { | ||||
|  } | ||||
|   | ||||
| diff --git a/kex.c b/kex.c
 | ||||
| index ede7b67..eb5f333 100644
 | ||||
| --- a/kex.c
 | ||||
| +++ b/kex.c
 | ||||
| @@ -553,13 +553,12 @@ kex_choose_conf(Kex *kex)
 | ||||
|  		    newkeys->enc.name, | ||||
|  		    authlen == 0 ? newkeys->mac.name : "<implicit>", | ||||
|  		    newkeys->comp.name); | ||||
| -#ifdef SSH_AUDIT_EVENTS
 | ||||
| -		audit_kex(ctos, newkeys->enc.name, newkeys->mac.name, newkeys->comp.name);
 | ||||
| -#endif
 | ||||
|  	} | ||||
| +
 | ||||
|  	choose_kex(kex, cprop[PROPOSAL_KEX_ALGS], sprop[PROPOSAL_KEX_ALGS]); | ||||
|  	choose_hostkeyalg(kex, cprop[PROPOSAL_SERVER_HOST_KEY_ALGS], | ||||
|  	    sprop[PROPOSAL_SERVER_HOST_KEY_ALGS]); | ||||
| +
 | ||||
|  	need = dh_need = 0; | ||||
|  	for (mode = 0; mode < MODE_MAX; mode++) { | ||||
|  		newkeys = kex->newkeys[mode]; | ||||
| @@ -571,11 +570,16 @@ kex_choose_conf(Kex *kex)
 | ||||
|  		dh_need = MAX(dh_need, newkeys->enc.block_size); | ||||
|  		dh_need = MAX(dh_need, newkeys->enc.iv_len); | ||||
|  		dh_need = MAX(dh_need, newkeys->mac.key_len); | ||||
| +		debug("kex: %s need=%d dh_need=%d", kex->name, need, dh_need);
 | ||||
| +#ifdef SSH_AUDIT_EVENTS
 | ||||
| +		audit_kex(mode, newkeys->enc.name, newkeys->mac.name, newkeys->comp.name, kex->name);
 | ||||
| +#endif
 | ||||
|  	} | ||||
|  	/* XXX need runden? */ | ||||
|  	kex->we_need = need; | ||||
|  	kex->dh_need = dh_need; | ||||
|   | ||||
| +
 | ||||
|  	/* ignore the next message if the proposals do not match */ | ||||
|  	if (first_kex_follows && !proposals_match(my, peer) && | ||||
|  	    !(datafellows & SSH_BUG_FIRSTKEX)) { | ||||
| diff --git a/monitor.c b/monitor.c
 | ||||
| index 70b9b4c..81bc9c1 100644
 | ||||
| --- a/monitor.c
 | ||||
| +++ b/monitor.c
 | ||||
| @@ -2396,7 +2396,7 @@ int
 | ||||
|  mm_answer_audit_kex_body(int sock, Buffer *m) | ||||
|  { | ||||
|  	int ctos, len; | ||||
| -	char *cipher, *mac, *compress;
 | ||||
| +	char *cipher, *mac, *compress, *pfs;
 | ||||
|  	pid_t pid; | ||||
|  	uid_t uid; | ||||
|   | ||||
| @@ -2404,14 +2404,16 @@ mm_answer_audit_kex_body(int sock, Buffer *m)
 | ||||
|  	cipher = buffer_get_string(m, &len); | ||||
|  	mac = buffer_get_string(m, &len); | ||||
|  	compress = buffer_get_string(m, &len); | ||||
| +	pfs = buffer_get_string(m, &len);
 | ||||
|  	pid = buffer_get_int64(m); | ||||
|  	uid = buffer_get_int64(m); | ||||
|   | ||||
| -	audit_kex_body(ctos, cipher, mac, compress, pid, uid);
 | ||||
| +	audit_kex_body(ctos, cipher, mac, compress, pfs, pid, uid);
 | ||||
|   | ||||
|  	free(cipher); | ||||
|  	free(mac); | ||||
|  	free(compress); | ||||
| +	free(pfs);
 | ||||
|  	buffer_clear(m); | ||||
|   | ||||
|  	mm_request_send(sock, MONITOR_ANS_AUDIT_KEX, m); | ||||
| diff --git a/monitor_wrap.c b/monitor_wrap.c
 | ||||
| index 93f6535..69b29d8 100644
 | ||||
| --- a/monitor_wrap.c
 | ||||
| +++ b/monitor_wrap.c
 | ||||
| @@ -1408,7 +1408,7 @@ mm_audit_unsupported_body(int what)
 | ||||
|  } | ||||
|   | ||||
|  void | ||||
| -mm_audit_kex_body(int ctos, char *cipher, char *mac, char *compress, pid_t pid,
 | ||||
| +mm_audit_kex_body(int ctos, char *cipher, char *mac, char *compress, char *fps, pid_t pid,
 | ||||
|  		  uid_t uid) | ||||
|  { | ||||
|  	Buffer m; | ||||
| @@ -1418,6 +1418,7 @@ mm_audit_kex_body(int ctos, char *cipher, char *mac, char *compress, pid_t pid,
 | ||||
|  	buffer_put_cstring(&m, cipher); | ||||
|  	buffer_put_cstring(&m, (mac ? mac : "")); | ||||
|  	buffer_put_cstring(&m, compress); | ||||
| +	buffer_put_cstring(&m, fps);
 | ||||
|  	buffer_put_int64(&m, pid); | ||||
|  	buffer_put_int64(&m, uid); | ||||
|   | ||||
| diff --git a/monitor_wrap.h b/monitor_wrap.h
 | ||||
| index 4cf0c78..e43109f 100644
 | ||||
| --- a/monitor_wrap.h
 | ||||
| +++ b/monitor_wrap.h
 | ||||
| @@ -83,7 +83,7 @@ void mm_audit_event(ssh_audit_event_t);
 | ||||
|  int mm_audit_run_command(const char *); | ||||
|  void mm_audit_end_command(int, const char *); | ||||
|  void mm_audit_unsupported_body(int); | ||||
| -void mm_audit_kex_body(int, char *, char *, char *, pid_t, uid_t);
 | ||||
| +void mm_audit_kex_body(int, char *, char *, char *, char *, pid_t, uid_t);
 | ||||
|  void mm_audit_session_key_free_body(int, pid_t, uid_t); | ||||
|  void mm_audit_destroy_sensitive_data(const char *, pid_t, uid_t); | ||||
|  #endif | ||||
| diff --git a/sshd.c b/sshd.c
 | ||||
| index ee94825..41a94a7 100644
 | ||||
| --- a/sshd.c
 | ||||
| +++ b/sshd.c
 | ||||
| @@ -2430,7 +2430,7 @@ do_ssh1_kex(void)
 | ||||
|  			packet_disconnect("IP Spoofing check bytes do not match."); | ||||
|   | ||||
|  #ifdef SSH_AUDIT_EVENTS | ||||
| -	audit_kex(2, cipher_name(cipher_type), "crc", "none");
 | ||||
| +	audit_kex(2, cipher_name(cipher_type), "crc", "none", "none");
 | ||||
|  #endif | ||||
|   | ||||
|  	debug("Encryption type: %.200s", cipher_name(cipher_type)); | ||||
| @ -40,10 +40,10 @@ index ae7df25..30c3310 100644 | ||||
|  int      log_is_on_stderr(void); | ||||
|  void     log_redirect_stderr_to(const char *); | ||||
| diff --git a/monitor.c b/monitor.c
 | ||||
| index 7461fae..da2f766 100644
 | ||||
| index 7ebc76e..d97e640 100644
 | ||||
| --- a/monitor.c
 | ||||
| +++ b/monitor.c
 | ||||
| @@ -364,6 +364,8 @@ monitor_child_preauth(Authctxt *_authctxt, struct monitor *pmonitor)
 | ||||
| @@ -378,6 +378,8 @@ monitor_child_preauth(Authctxt *_authctxt, struct monitor *pmonitor)
 | ||||
|  	close(pmonitor->m_log_sendfd); | ||||
|  	pmonitor->m_log_sendfd = pmonitor->m_recvfd = -1; | ||||
|   | ||||
| @ -52,7 +52,7 @@ index 7461fae..da2f766 100644 | ||||
|  	authctxt = _authctxt; | ||||
|  	memset(authctxt, 0, sizeof(*authctxt)); | ||||
|   | ||||
| @@ -472,6 +474,8 @@ monitor_child_postauth(struct monitor *pmonitor)
 | ||||
| @@ -486,6 +488,8 @@ monitor_child_postauth(struct monitor *pmonitor)
 | ||||
|  	close(pmonitor->m_recvfd); | ||||
|  	pmonitor->m_recvfd = -1; | ||||
|   | ||||
| @ -61,7 +61,7 @@ index 7461fae..da2f766 100644 | ||||
|  	monitor_set_child_handler(pmonitor->m_pid); | ||||
|  	signal(SIGHUP, &monitor_child_handler); | ||||
|  	signal(SIGTERM, &monitor_child_handler); | ||||
| @@ -552,7 +556,7 @@ monitor_read_log(struct monitor *pmonitor)
 | ||||
| @@ -566,7 +570,7 @@ monitor_read_log(struct monitor *pmonitor)
 | ||||
|  	if (log_level_name(level) == NULL) | ||||
|  		fatal("%s: invalid log level %u (corrupted message?)", | ||||
|  		    __func__, level); | ||||
| @ -70,7 +70,7 @@ index 7461fae..da2f766 100644 | ||||
|   | ||||
|  	buffer_free(&logmsg); | ||||
|  	free(msg); | ||||
| @@ -2083,13 +2087,28 @@ monitor_init(void)
 | ||||
| @@ -2107,13 +2111,28 @@ monitor_init(void)
 | ||||
|  		mm_init_compression(mon->m_zlib); | ||||
|  	} | ||||
|   | ||||
| @ -119,7 +119,7 @@ index ff79fbb..00c2028 100644 | ||||
|   | ||||
|  struct Authctxt; | ||||
| diff --git a/session.c b/session.c
 | ||||
| index e4add93..bc4a8dd 100644
 | ||||
| index 9c94d8e..40a681e 100644
 | ||||
| --- a/session.c
 | ||||
| +++ b/session.c
 | ||||
| @@ -160,6 +160,8 @@ login_cap_t *lc;
 | ||||
| @ -131,7 +131,7 @@ index e4add93..bc4a8dd 100644 | ||||
|  /* Name and directory of socket for authentication agent forwarding. */ | ||||
|  static char *auth_sock_name = NULL; | ||||
|  static char *auth_sock_dir = NULL; | ||||
| @@ -523,8 +525,8 @@ do_exec_no_pty(Session *s, const char *command)
 | ||||
| @@ -505,8 +507,8 @@ do_exec_no_pty(Session *s, const char *command)
 | ||||
|  		is_child = 1; | ||||
|   | ||||
|  		/* Child.  Reinitialize the log since the pid has changed. */ | ||||
| @ -142,7 +142,7 @@ index e4add93..bc4a8dd 100644 | ||||
|   | ||||
|  		/* | ||||
|  		 * Create a new session and process group since the 4.4BSD | ||||
| @@ -692,8 +694,8 @@ do_exec_pty(Session *s, const char *command)
 | ||||
| @@ -674,8 +676,8 @@ do_exec_pty(Session *s, const char *command)
 | ||||
|  		close(ptymaster); | ||||
|   | ||||
|  		/* Child.  Reinitialize the log because the pid has changed. */ | ||||
| @ -153,7 +153,7 @@ index e4add93..bc4a8dd 100644 | ||||
|  		/* Close the master side of the pseudo tty. */ | ||||
|  		close(ptyfd); | ||||
|   | ||||
| @@ -797,6 +799,7 @@ do_exec(Session *s, const char *command)
 | ||||
| @@ -779,6 +781,7 @@ do_exec(Session *s, const char *command)
 | ||||
|  	int ret; | ||||
|  	const char *forced = NULL; | ||||
|  	char session_type[1024], *tty = NULL; | ||||
| @ -161,7 +161,7 @@ index e4add93..bc4a8dd 100644 | ||||
|   | ||||
|  	if (options.adm_forced_command) { | ||||
|  		original_command = command; | ||||
| @@ -854,6 +857,10 @@ do_exec(Session *s, const char *command)
 | ||||
| @@ -836,6 +839,10 @@ do_exec(Session *s, const char *command)
 | ||||
|  			tty += 5; | ||||
|  	} | ||||
|   | ||||
| @ -172,7 +172,7 @@ index e4add93..bc4a8dd 100644 | ||||
|  	verbose("Starting session: %s%s%s for %s from %.200s port %d", | ||||
|  	    session_type, | ||||
|  	    tty == NULL ? "" : " on ", | ||||
| @@ -1681,14 +1688,6 @@ child_close_fds(void)
 | ||||
| @@ -1677,14 +1684,6 @@ child_close_fds(void)
 | ||||
|  	 * descriptors left by system functions.  They will be closed later. | ||||
|  	 */ | ||||
|  	endpwent(); | ||||
| @ -187,7 +187,7 @@ index e4add93..bc4a8dd 100644 | ||||
|  } | ||||
|   | ||||
|  /* | ||||
| @@ -1834,8 +1833,6 @@ do_child(Session *s, const char *command)
 | ||||
| @@ -1830,8 +1829,6 @@ do_child(Session *s, const char *command)
 | ||||
|  			exit(1); | ||||
|  	} | ||||
|   | ||||
| @ -196,7 +196,7 @@ index e4add93..bc4a8dd 100644 | ||||
|  	if (!options.use_login) | ||||
|  		do_rc_files(s, shell); | ||||
|   | ||||
| @@ -1859,9 +1856,17 @@ do_child(Session *s, const char *command)
 | ||||
| @@ -1855,9 +1852,17 @@ do_child(Session *s, const char *command)
 | ||||
|  		argv[i] = NULL; | ||||
|  		optind = optreset = 1; | ||||
|  		__progname = argv[0]; | ||||
| @ -227,10 +227,10 @@ index 7e644ab..e162b7a 100644 | ||||
| +	return (sftp_server_main(argc, argv, user_pw, 0));
 | ||||
|  } | ||||
| diff --git a/sftp-server.c b/sftp-server.c
 | ||||
| index b8eb59c..a0e644c 100644
 | ||||
| index 0177130..8fa7fc7 100644
 | ||||
| --- a/sftp-server.c
 | ||||
| +++ b/sftp-server.c
 | ||||
| @@ -1437,7 +1437,7 @@ sftp_server_usage(void)
 | ||||
| @@ -1440,7 +1440,7 @@ sftp_server_usage(void)
 | ||||
|  } | ||||
|   | ||||
|  int | ||||
| @ -239,7 +239,7 @@ index b8eb59c..a0e644c 100644 | ||||
|  { | ||||
|  	fd_set *rset, *wset; | ||||
|  	int i, in, out, max, ch, skipargs = 0, log_stderr = 0; | ||||
| @@ -1450,7 +1450,7 @@ sftp_server_main(int argc, char **argv, struct passwd *user_pw)
 | ||||
| @@ -1453,7 +1453,7 @@ sftp_server_main(int argc, char **argv, struct passwd *user_pw)
 | ||||
|  	extern char *__progname; | ||||
|   | ||||
|  	__progname = ssh_get_progname(argv[0]); | ||||
| @ -248,15 +248,15 @@ index b8eb59c..a0e644c 100644 | ||||
|   | ||||
|  	pw = pwcopy(user_pw); | ||||
|   | ||||
| @@ -1521,7 +1521,7 @@ sftp_server_main(int argc, char **argv, struct passwd *user_pw)
 | ||||
| @@ -1524,7 +1524,7 @@ sftp_server_main(int argc, char **argv, struct passwd *user_pw)
 | ||||
|  		} | ||||
|  	} | ||||
|   | ||||
| -	log_init(__progname, log_level, log_facility, log_stderr);
 | ||||
| +	log_init_handler(__progname, log_level, log_facility, log_stderr, reset_handler);
 | ||||
|   | ||||
|  	if ((cp = getenv("SSH_CONNECTION")) != NULL) { | ||||
|  		client_addr = xstrdup(cp); | ||||
|  #if defined(HAVE_PRCTL) && defined(PR_SET_DUMPABLE) | ||||
|  	/* | ||||
| diff --git a/sftp.h b/sftp.h
 | ||||
| index 2bde8bb..ddf1a39 100644
 | ||||
| --- a/sftp.h
 | ||||
| @ -269,10 +269,10 @@ index 2bde8bb..ddf1a39 100644 | ||||
| +int	sftp_server_main(int, char **, struct passwd *, int);
 | ||||
|  void	sftp_server_cleanup_exit(int) __attribute__((noreturn)); | ||||
| diff --git a/sshd.c b/sshd.c
 | ||||
| index 3eee75a..9c00bcb 100644
 | ||||
| index 39b9c08..ca55d7f 100644
 | ||||
| --- a/sshd.c
 | ||||
| +++ b/sshd.c
 | ||||
| @@ -745,7 +745,7 @@ privsep_postauth(Authctxt *authctxt)
 | ||||
| @@ -737,7 +737,7 @@ privsep_postauth(Authctxt *authctxt)
 | ||||
|  	} | ||||
|   | ||||
|  	/* New socket pair */ | ||||
| @ -281,7 +281,7 @@ index 3eee75a..9c00bcb 100644 | ||||
|   | ||||
|  	pmonitor->m_pid = fork(); | ||||
|  	if (pmonitor->m_pid == -1) | ||||
| @@ -763,6 +763,11 @@ privsep_postauth(Authctxt *authctxt)
 | ||||
| @@ -755,6 +755,11 @@ privsep_postauth(Authctxt *authctxt)
 | ||||
|   | ||||
|  	close(pmonitor->m_sendfd); | ||||
|  	pmonitor->m_sendfd = -1; | ||||
|  | ||||
| @ -1,16 +1,16 @@ | ||||
| diff --git a/openbsd-compat/port-linux-sshd.c b/openbsd-compat/port-linux-sshd.c
 | ||||
| index 0077dd7..e3f2ced 100644
 | ||||
| index 8f32464..18a2ca4 100644
 | ||||
| --- a/openbsd-compat/port-linux-sshd.c
 | ||||
| +++ b/openbsd-compat/port-linux-sshd.c
 | ||||
| @@ -31,6 +31,7 @@
 | ||||
|  #include "xmalloc.h" | ||||
| @@ -32,6 +32,7 @@
 | ||||
|  #include "misc.h"      /* servconf.h needs misc.h for struct ForwardOptions */ | ||||
|  #include "servconf.h" | ||||
|  #include "port-linux.h" | ||||
| +#include "misc.h"
 | ||||
|  #include "key.h" | ||||
|  #include "hostfile.h" | ||||
|  #include "auth.h" | ||||
| @@ -444,7 +445,7 @@ sshd_selinux_setup_exec_context(char *pwname)
 | ||||
| @@ -445,7 +446,7 @@ sshd_selinux_setup_exec_context(char *pwname)
 | ||||
|  void | ||||
|  sshd_selinux_copy_context(void) | ||||
|  { | ||||
| @ -19,7 +19,7 @@ index 0077dd7..e3f2ced 100644 | ||||
|   | ||||
|  	if (!sshd_selinux_enabled()) | ||||
|  		return; | ||||
| @@ -460,6 +461,58 @@ sshd_selinux_copy_context(void)
 | ||||
| @@ -461,6 +462,58 @@ sshd_selinux_copy_context(void)
 | ||||
|  	} | ||||
|  } | ||||
|   | ||||
| @ -104,10 +104,10 @@ index cb51f99..8b7cda2 100644 | ||||
|   | ||||
|  #ifdef LINUX_OOM_ADJUST | ||||
| diff --git a/sshd.c b/sshd.c
 | ||||
| index 512c7ed..3eee75a 100644
 | ||||
| index 2871fe9..39b9c08 100644
 | ||||
| --- a/sshd.c
 | ||||
| +++ b/sshd.c
 | ||||
| @@ -637,7 +637,7 @@ privsep_preauth_child(void)
 | ||||
| @@ -629,7 +629,7 @@ privsep_preauth_child(void)
 | ||||
|  	demote_sensitive_data(); | ||||
|   | ||||
|  #ifdef WITH_SELINUX | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| diff --git a/gss-serv-krb5.c b/gss-serv-krb5.c
 | ||||
| index 0a4930e..a7c0c5f 100644
 | ||||
| index 961c564..0fcfd7b 100644
 | ||||
| --- a/gss-serv-krb5.c
 | ||||
| +++ b/gss-serv-krb5.c
 | ||||
| @@ -260,7 +260,6 @@ ssh_gssapi_krb5_cmdok(krb5_principal principal, const char *name,
 | ||||
| @ -20,27 +20,27 @@ index 0a4930e..a7c0c5f 100644 | ||||
|                                          k5login_exists); | ||||
|  	} | ||||
| diff --git a/servconf.c b/servconf.c
 | ||||
| index d482e79..ad5869b 100644
 | ||||
| index e4164b1..87a311b 100644
 | ||||
| --- a/servconf.c
 | ||||
| +++ b/servconf.c
 | ||||
| @@ -158,6 +158,7 @@ initialize_server_options(ServerOptions *options)
 | ||||
|  	options->ip_qos_bulk = -1; | ||||
| @@ -164,6 +164,7 @@ initialize_server_options(ServerOptions *options)
 | ||||
|  	options->version_addendum = NULL; | ||||
|  	options->fingerprint_hash = -1; | ||||
|  	options->use_kuserok = -1; | ||||
| +	options->enable_k5users = -1;
 | ||||
|  } | ||||
|   | ||||
|  void | ||||
| @@ -315,6 +316,8 @@ fill_default_server_options(ServerOptions *options)
 | ||||
|  		options->show_patchlevel = 0; | ||||
| @@ -331,6 +332,8 @@ fill_default_server_options(ServerOptions *options)
 | ||||
|  		options->fingerprint_hash = SSH_FP_HASH_DEFAULT; | ||||
|  	if (options->use_kuserok == -1) | ||||
|  		options->use_kuserok = 1; | ||||
| +	if (options->enable_k5users == -1)
 | ||||
| +		options->enable_k5users = 0;
 | ||||
|   | ||||
|  	/* Turn privilege separation on by default */ | ||||
|  	if (use_privsep == -1) | ||||
| @@ -356,7 +359,7 @@ typedef enum {
 | ||||
|  		use_privsep = PRIVSEP_NOSANDBOX; | ||||
| @@ -371,7 +374,7 @@ typedef enum {
 | ||||
|  	sBanner, sShowPatchLevel, sUseDNS, sHostbasedAuthentication, | ||||
|  	sHostbasedUsesNameFromPacketOnly, sClientAliveInterval, | ||||
|  	sClientAliveCountMax, sAuthorizedKeysFile, | ||||
| @ -49,7 +49,7 @@ index d482e79..ad5869b 100644 | ||||
|  	sGssKeyEx, sGssStoreRekey, sAcceptEnv, sPermitTunnel, | ||||
|  	sMatch, sPermitOpen, sForceCommand, sChrootDirectory, | ||||
|  	sUsePrivilegeSeparation, sAllowAgentForwarding, | ||||
| @@ -430,6 +433,7 @@ static struct {
 | ||||
| @@ -447,6 +450,7 @@ static struct {
 | ||||
|  	{ "gssapistrictacceptorcheck", sGssStrictAcceptor, SSHCFG_GLOBAL }, | ||||
|  	{ "gssapikeyexchange", sGssKeyEx, SSHCFG_GLOBAL }, | ||||
|  	{ "gssapistorecredentialsonrekey", sGssStoreRekey, SSHCFG_GLOBAL }, | ||||
| @ -57,7 +57,7 @@ index d482e79..ad5869b 100644 | ||||
|  #else | ||||
|  	{ "gssapiauthentication", sUnsupported, SSHCFG_ALL }, | ||||
|  	{ "gssapicleanupcredentials", sUnsupported, SSHCFG_GLOBAL }, | ||||
| @@ -437,6 +441,7 @@ static struct {
 | ||||
| @@ -454,6 +458,7 @@ static struct {
 | ||||
|  	{ "gssapistrictacceptorcheck", sUnsupported, SSHCFG_GLOBAL }, | ||||
|  	{ "gssapikeyexchange", sUnsupported, SSHCFG_GLOBAL }, | ||||
|  	{ "gssapistorecredentialsonrekey", sUnsupported, SSHCFG_GLOBAL }, | ||||
| @ -65,7 +65,7 @@ index d482e79..ad5869b 100644 | ||||
|  #endif | ||||
|  	{ "gssusesessionccache", sUnsupported, SSHCFG_GLOBAL }, | ||||
|  	{ "gssapiusesessioncredcache", sUnsupported, SSHCFG_GLOBAL }, | ||||
| @@ -1536,6 +1541,10 @@ process_server_config_line(ServerOptions *options, char *line,
 | ||||
| @@ -1566,6 +1571,10 @@ process_server_config_line(ServerOptions *options, char *line,
 | ||||
|  		intptr = &options->use_kuserok; | ||||
|  		goto parse_flag; | ||||
|   | ||||
| @ -76,7 +76,7 @@ index d482e79..ad5869b 100644 | ||||
|  	case sPermitOpen: | ||||
|  		arg = strdelim(&cp); | ||||
|  		if (!arg || *arg == '\0') | ||||
| @@ -1824,6 +1833,7 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
 | ||||
| @@ -1884,6 +1893,7 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
 | ||||
|  	M_CP_INTOPT(ip_qos_interactive); | ||||
|  	M_CP_INTOPT(ip_qos_bulk); | ||||
|  	M_CP_INTOPT(use_kuserok); | ||||
| @ -84,19 +84,19 @@ index d482e79..ad5869b 100644 | ||||
|  	M_CP_INTOPT(rekey_limit); | ||||
|  	M_CP_INTOPT(rekey_interval); | ||||
|   | ||||
| @@ -2076,6 +2086,7 @@ dump_config(ServerOptions *o)
 | ||||
|  	dump_cfg_fmtint(sAllowTcpForwarding, o->allow_tcp_forwarding); | ||||
| @@ -2143,6 +2153,7 @@ dump_config(ServerOptions *o)
 | ||||
|  	dump_cfg_fmtint(sUsePrivilegeSeparation, use_privsep); | ||||
|  	dump_cfg_fmtint(sFingerprintHash, o->fingerprint_hash); | ||||
|  	dump_cfg_fmtint(sKerberosUseKuserok, o->use_kuserok); | ||||
| +	dump_cfg_fmtint(sGssEnablek5users, o->enable_k5users);
 | ||||
|   | ||||
|  	/* string arguments */ | ||||
|  	dump_cfg_string(sPidFile, o->pid_file); | ||||
| diff --git a/servconf.h b/servconf.h
 | ||||
| index 5117dfa..d63cb71 100644
 | ||||
| index cf2a505..070a8ed 100644
 | ||||
| --- a/servconf.h
 | ||||
| +++ b/servconf.h
 | ||||
| @@ -173,7 +173,8 @@ typedef struct {
 | ||||
| @@ -175,7 +175,8 @@ typedef struct {
 | ||||
|   | ||||
|  	int	num_permitted_opens; | ||||
|   | ||||
| @ -107,7 +107,7 @@ index 5117dfa..d63cb71 100644 | ||||
|  	char   *revoked_keys_file; | ||||
|  	char   *trusted_user_ca_keys; | ||||
| diff --git a/sshd_config b/sshd_config
 | ||||
| index 43671f6..6ab00ed 100644
 | ||||
| index 0d9454d..e731de1 100644
 | ||||
| --- a/sshd_config
 | ||||
| +++ b/sshd_config
 | ||||
| @@ -94,6 +94,7 @@ GSSAPIAuthentication yes
 | ||||
| @ -119,10 +119,10 @@ index 43671f6..6ab00ed 100644 | ||||
|  # Set this to 'yes' to enable PAM authentication, account processing, | ||||
|  # and session processing. If this is enabled, PAM authentication will | ||||
| diff --git a/sshd_config.5 b/sshd_config.5
 | ||||
| index e0e5fff..aa9525d 100644
 | ||||
| index eb4dd9e..ce1229b 100644
 | ||||
| --- a/sshd_config.5
 | ||||
| +++ b/sshd_config.5
 | ||||
| @@ -505,6 +505,12 @@ on logout.
 | ||||
| @@ -548,6 +548,12 @@ on logout.
 | ||||
|  The default is | ||||
|  .Dq yes . | ||||
|  Note that this option applies to protocol version 2 only. | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| diff --git a/Makefile.in b/Makefile.in
 | ||||
| index 4ab6717..581b121 100644
 | ||||
| index b225217..bbc3034 100644
 | ||||
| --- a/Makefile.in
 | ||||
| +++ b/Makefile.in
 | ||||
| @@ -28,6 +28,7 @@ SSH_KEYSIGN=$(libexecdir)/ssh-keysign
 | ||||
| @ -10,16 +10,16 @@ index 4ab6717..581b121 100644 | ||||
|  SSH_PKCS11_HELPER=$(libexecdir)/ssh-pkcs11-helper | ||||
|  PRIVSEP_PATH=@PRIVSEP_PATH@ | ||||
|  SSH_PRIVSEP_USER=@SSH_PRIVSEP_USER@ | ||||
| @@ -65,7 +66,7 @@ EXEEXT=@EXEEXT@
 | ||||
| @@ -66,7 +67,7 @@ EXEEXT=@EXEEXT@
 | ||||
|  MANFMT=@MANFMT@ | ||||
|  INSTALL_SSH_LDAP_HELPER=@INSTALL_SSH_LDAP_HELPER@ | ||||
|   | ||||
| -TARGETS=ssh$(EXEEXT) sshd$(EXEEXT) ssh-add$(EXEEXT) ssh-keygen$(EXEEXT) ssh-keyscan${EXEEXT} ssh-keysign${EXEEXT} ssh-pkcs11-helper$(EXEEXT) ssh-agent$(EXEEXT) scp$(EXEEXT) sftp-server$(EXEEXT) sftp$(EXEEXT) ssh-ldap-helper$(EXEEXT) ssh-keycat$(EXEEXT) 
 | ||||
| +TARGETS=ssh$(EXEEXT) sshd$(EXEEXT) ssh-add$(EXEEXT) ssh-keygen$(EXEEXT) ssh-keyscan${EXEEXT} ssh-keysign${EXEEXT} ssh-pkcs11-helper$(EXEEXT) ssh-agent$(EXEEXT) scp$(EXEEXT) sftp-server$(EXEEXT) sftp$(EXEEXT) ssh-ldap-helper$(EXEEXT) ssh-keycat$(EXEEXT) ctr-cavstest$(EXEEXT)
 | ||||
|   | ||||
|  LIBSSH_OBJS=authfd.o authfile.o bufaux.o bufbn.o buffer.o \ | ||||
|  	canohost.o channels.o cipher.o cipher-aes.o \ | ||||
| @@ -180,6 +181,9 @@ ssh-ldap-helper$(EXEEXT): $(LIBCOMPAT) libssh.a ldapconf.o ldapbody.o ldapmisc.o
 | ||||
|  LIBOPENSSH_OBJS=\ | ||||
|  	ssherr.o \ | ||||
| @@ -190,6 +191,9 @@ ssh-ldap-helper$(EXEEXT): $(LIBCOMPAT) libssh.a ldapconf.o ldapbody.o ldapmisc.o
 | ||||
|  ssh-keycat$(EXEEXT): $(LIBCOMPAT) $(SSHDOBJS) libssh.a ssh-keycat.o | ||||
|  	$(LD) -o $@ ssh-keycat.o bufaux.o $(LDFLAGS) -lssh -lopenbsd-compat -lfipscheck $(SSHDLIBS) $(SSHLIBS) | ||||
|   | ||||
| @ -29,7 +29,7 @@ index 4ab6717..581b121 100644 | ||||
|  ssh-keyscan$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keyscan.o roaming_dummy.o | ||||
|  	$(LD) -o $@ ssh-keyscan.o roaming_dummy.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) | ||||
|   | ||||
| @@ -288,6 +292,7 @@ install-files:
 | ||||
| @@ -310,6 +314,7 @@ install-files:
 | ||||
|  		$(INSTALL) -m 0700 ssh-ldap-wrapper $(DESTDIR)$(SSH_LDAP_WRAPPER) ; \ | ||||
|  	fi | ||||
|  	$(INSTALL) -m 0755 $(STRIP_OPT) ssh-keycat$(EXEEXT) $(DESTDIR)$(libexecdir)/ssh-keycat$(EXEEXT) | ||||
|  | ||||
| @ -1,8 +1,8 @@ | ||||
| diff --git a/entropy.c b/entropy.c
 | ||||
| index 2d483b3..b361a04 100644
 | ||||
| index 1e9d52a..d24e724 100644
 | ||||
| --- a/entropy.c
 | ||||
| +++ b/entropy.c
 | ||||
| @@ -234,6 +234,9 @@ seed_rng(void)
 | ||||
| @@ -227,6 +227,9 @@ seed_rng(void)
 | ||||
|  	memset(buf, '\0', sizeof(buf)); | ||||
|   | ||||
|  #endif /* OPENSSL_PRNG_ONLY */ | ||||
| @ -13,12 +13,12 @@ index 2d483b3..b361a04 100644 | ||||
|  		fatal("PRNG is not seeded"); | ||||
|  } | ||||
| diff --git a/openbsd-compat/Makefile.in b/openbsd-compat/Makefile.in
 | ||||
| index b912dbe..9206337 100644
 | ||||
| index 843225d..041bbab 100644
 | ||||
| --- a/openbsd-compat/Makefile.in
 | ||||
| +++ b/openbsd-compat/Makefile.in
 | ||||
| @@ -20,7 +20,7 @@ OPENBSD=base64.o basename.o bcrypt_pbkdf.o bindresvport.o blowfish.o daemon.o di
 | ||||
|   | ||||
|  COMPAT=arc4random.o bsd-asprintf.o bsd-closefrom.o bsd-cray.o bsd-cygwin_util.o bsd-getpeereid.o getrrsetbyname-ldns.o bsd-misc.o bsd-nextstep.o bsd-openpty.o bsd-poll.o bsd-setres_id.o bsd-snprintf.o bsd-statvfs.o bsd-waitpid.o fake-rfc2553.o openssl-compat.o xmmap.o xcrypt.o | ||||
|  COMPAT=arc4random.o bsd-asprintf.o bsd-closefrom.o bsd-cray.o bsd-cygwin_util.o bsd-getpeereid.o getrrsetbyname-ldns.o bsd-misc.o bsd-nextstep.o bsd-openpty.o bsd-poll.o bsd-setres_id.o bsd-snprintf.o bsd-statvfs.o bsd-waitpid.o fake-rfc2553.o openssl-compat.o xmmap.o xcrypt.o kludge-fd_set.o | ||||
|   | ||||
| -PORTS=port-aix.o port-irix.o port-linux.o port-linux-sshd.o port-solaris.o port-tun.o port-uw.o
 | ||||
| +PORTS=port-aix.o port-irix.o port-linux.o port-linux-sshd.o port-linux-prng.o port-solaris.o port-tun.o port-uw.o
 | ||||
| @ -27,7 +27,7 @@ index b912dbe..9206337 100644 | ||||
|  	$(CC) $(CFLAGS) $(CPPFLAGS) -c $< | ||||
| diff --git a/openbsd-compat/port-linux-prng.c b/openbsd-compat/port-linux-prng.c
 | ||||
| new file mode 100644 | ||||
| index 0000000..92a617c
 | ||||
| index 0000000..da84bf2
 | ||||
| --- /dev/null
 | ||||
| +++ b/openbsd-compat/port-linux-prng.c
 | ||||
| @@ -0,0 +1,59 @@
 | ||||
| @ -63,6 +63,7 @@ index 0000000..92a617c | ||||
| +
 | ||||
| +#include "log.h"
 | ||||
| +#include "xmalloc.h"
 | ||||
| +#include "misc.h"      /* servconf.h needs misc.h for struct ForwardOptions */
 | ||||
| +#include "servconf.h"
 | ||||
| +#include "port-linux.h"
 | ||||
| +#include "key.h"
 | ||||
| @ -72,10 +73,9 @@ index 0000000..92a617c | ||||
| +void
 | ||||
| +linux_seed(void)
 | ||||
| +{
 | ||||
| +	int len;
 | ||||
| +	char *env = getenv("SSH_USE_STRONG_RNG");
 | ||||
| +	char *random = "/dev/random";
 | ||||
| +	size_t ienv, randlen = 14;
 | ||||
| +	size_t len, ienv, randlen = 14;
 | ||||
| +
 | ||||
| +	if (!env || !strcmp(env, "0"))
 | ||||
| +		random = "/dev/urandom";
 | ||||
| @ -91,7 +91,7 @@ index 0000000..92a617c | ||||
| +	}
 | ||||
| +}
 | ||||
| diff --git a/ssh-add.0 b/ssh-add.0
 | ||||
| index ba43fee..0b2629a 100644
 | ||||
| index f16165a..17d22cf 100644
 | ||||
| --- a/ssh-add.0
 | ||||
| +++ b/ssh-add.0
 | ||||
| @@ -82,6 +82,16 @@ ENVIRONMENT
 | ||||
| @ -112,10 +112,10 @@ index ba43fee..0b2629a 100644 | ||||
|       ~/.ssh/identity | ||||
|               Contains the protocol version 1 RSA authentication identity of | ||||
| diff --git a/ssh-add.1 b/ssh-add.1
 | ||||
| index 4812448..16305bf 100644
 | ||||
| index 04d1840..db883a4 100644
 | ||||
| --- a/ssh-add.1
 | ||||
| +++ b/ssh-add.1
 | ||||
| @@ -161,6 +161,20 @@ to make this work.)
 | ||||
| @@ -170,6 +170,20 @@ to make this work.)
 | ||||
|  Identifies the path of a | ||||
|  .Ux Ns -domain | ||||
|  socket used to communicate with the agent. | ||||
| @ -137,10 +137,10 @@ index 4812448..16305bf 100644 | ||||
|  .Sh FILES | ||||
|  .Bl -tag -width Ds | ||||
| diff --git a/ssh-agent.1 b/ssh-agent.1
 | ||||
| index 281ecbd..1a9a635 100644
 | ||||
| index d7e791b..7332f0d 100644
 | ||||
| --- a/ssh-agent.1
 | ||||
| +++ b/ssh-agent.1
 | ||||
| @@ -201,6 +201,24 @@ sockets used to contain the connection to the authentication agent.
 | ||||
| @@ -189,6 +189,24 @@ sockets used to contain the connection to the authentication agent.
 | ||||
|  These sockets should only be readable by the owner. | ||||
|  The sockets should get automatically removed when the agent exits. | ||||
|  .El | ||||
| @ -166,10 +166,10 @@ index 281ecbd..1a9a635 100644 | ||||
|  .Xr ssh 1 , | ||||
|  .Xr ssh-add 1 , | ||||
| diff --git a/ssh-keygen.1 b/ssh-keygen.1
 | ||||
| index 12e00d4..1b51a4a 100644
 | ||||
| index 276dacc..a09d9b1 100644
 | ||||
| --- a/ssh-keygen.1
 | ||||
| +++ b/ssh-keygen.1
 | ||||
| @@ -832,6 +832,24 @@ Contains Diffie-Hellman groups used for DH-GEX.
 | ||||
| @@ -841,6 +841,24 @@ Contains Diffie-Hellman groups used for DH-GEX.
 | ||||
|  The file format is described in | ||||
|  .Xr moduli 5 . | ||||
|  .El | ||||
| @ -224,10 +224,10 @@ index 69d0829..02d79f8 100644 | ||||
|  .Xr ssh 1 , | ||||
|  .Xr ssh-keygen 1 , | ||||
| diff --git a/ssh.1 b/ssh.1
 | ||||
| index 929904b..f65e42f 100644
 | ||||
| index 4a476c2..410a04a 100644
 | ||||
| --- a/ssh.1
 | ||||
| +++ b/ssh.1
 | ||||
| @@ -1309,6 +1309,23 @@ For more information, see the
 | ||||
| @@ -1299,6 +1299,23 @@ For more information, see the
 | ||||
|  .Cm PermitUserEnvironment | ||||
|  option in | ||||
|  .Xr sshd_config 5 . | ||||
| @ -252,10 +252,10 @@ index 929904b..f65e42f 100644 | ||||
|  .Bl -tag -width Ds -compact | ||||
|  .It Pa ~/.rhosts | ||||
| diff --git a/sshd.8 b/sshd.8
 | ||||
| index c2c237f..058d37a 100644
 | ||||
| index cb866b5..adcaaf9 100644
 | ||||
| --- a/sshd.8
 | ||||
| +++ b/sshd.8
 | ||||
| @@ -951,6 +951,24 @@ concurrently for different ports, this contains the process ID of the one
 | ||||
| @@ -945,6 +945,24 @@ concurrently for different ports, this contains the process ID of the one
 | ||||
|  started last). | ||||
|  The content of this file is not sensitive; it can be world-readable. | ||||
|  .El | ||||
|  | ||||
| @ -1,415 +0,0 @@ | ||||
| diff --git a/auth.c b/auth.c
 | ||||
| index 9a36f1d..420a85b 100644
 | ||||
| --- a/auth.c
 | ||||
| +++ b/auth.c
 | ||||
| @@ -685,9 +685,10 @@ auth_key_is_revoked(Key *key)
 | ||||
|  	case 1: | ||||
|   revoked: | ||||
|  		/* Key revoked */ | ||||
| -		key_fp = key_fingerprint(key, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| +		key_fp = key_selected_fingerprint(key, SSH_FP_HEX);
 | ||||
|  		error("WARNING: authentication attempt with a revoked " | ||||
| -		    "%s key %s ", key_type(key), key_fp);
 | ||||
| +		    "%s key %s%s ", key_type(key),
 | ||||
| +		    key_fingerprint_prefix(), key_fp);
 | ||||
|  		free(key_fp); | ||||
|  		return 1; | ||||
|  	} | ||||
| diff --git a/auth2-hostbased.c b/auth2-hostbased.c
 | ||||
| index 488008f..eca0069 100644
 | ||||
| --- a/auth2-hostbased.c
 | ||||
| +++ b/auth2-hostbased.c
 | ||||
| @@ -206,16 +206,18 @@ hostbased_key_allowed(struct passwd *pw, const char *cuser, char *chost,
 | ||||
|   | ||||
|  	if (host_status == HOST_OK) { | ||||
|  		if (key_is_cert(key)) { | ||||
| -			fp = key_fingerprint(key->cert->signature_key,
 | ||||
| -			    SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| +			fp = key_selected_fingerprint(key->cert->signature_key,
 | ||||
| +			    SSH_FP_HEX);		
 | ||||
|  			verbose("Accepted certificate ID \"%s\" signed by " | ||||
| -			    "%s CA %s from %s@%s", key->cert->key_id,
 | ||||
| -			    key_type(key->cert->signature_key), fp,
 | ||||
| +			    "%s CA %s%s from %s@%s", key->cert->key_id,
 | ||||
| +			    key_type(key->cert->signature_key),
 | ||||
| +			    key_fingerprint_prefix(), fp,
 | ||||
|  			    cuser, lookup); | ||||
|  		} else { | ||||
| -			fp = key_fingerprint(key, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| -			verbose("Accepted %s public key %s from %s@%s",
 | ||||
| -			    key_type(key), fp, cuser, lookup);
 | ||||
| +			fp = key_selected_fingerprint(key, SSH_FP_HEX);
 | ||||
| +			verbose("Accepted %s public key %s%s from %s@%s",
 | ||||
| +			    key_type(key), key_fingerprint_prefix(),
 | ||||
| +			    fp, cuser, lookup);
 | ||||
|  		} | ||||
|  		free(fp); | ||||
|  	} | ||||
| diff --git a/auth2-pubkey.c b/auth2-pubkey.c
 | ||||
| index 0fd27bb..749b11a 100644
 | ||||
| --- a/auth2-pubkey.c
 | ||||
| +++ b/auth2-pubkey.c
 | ||||
| @@ -365,10 +365,10 @@ check_authkeys_file(FILE *f, char *file, Key* key, struct passwd *pw)
 | ||||
|  				continue; | ||||
|  			if (!key_is_cert_authority) | ||||
|  				continue; | ||||
| -			fp = key_fingerprint(found, SSH_FP_MD5,
 | ||||
| -			    SSH_FP_HEX);
 | ||||
| -			debug("matching CA found: file %s, line %lu, %s %s",
 | ||||
| -			    file, linenum, key_type(found), fp);
 | ||||
| +			fp = key_selected_fingerprint(found, SSH_FP_HEX);
 | ||||
| +			debug("matching CA found: file %s, line %lu, %s %s%s",
 | ||||
| +			    file, linenum, key_type(found),
 | ||||
| +			    key_fingerprint_prefix(), fp);
 | ||||
|  			/* | ||||
|  			 * If the user has specified a list of principals as | ||||
|  			 * a key option, then prefer that list to matching | ||||
| @@ -406,9 +406,9 @@ check_authkeys_file(FILE *f, char *file, Key* key, struct passwd *pw)
 | ||||
|  			if (key_is_cert_authority) | ||||
|  				continue; | ||||
|  			found_key = 1; | ||||
| -			fp = key_fingerprint(found, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| -			debug("matching key found: file %s, line %lu %s %s",
 | ||||
| -			    file, linenum, key_type(found), fp);
 | ||||
| +			fp = key_selected_fingerprint(found, SSH_FP_HEX);
 | ||||
| +			verbose("Found matching %s key: %s%s",
 | ||||
| +			    key_type(found), key_fingerprint_prefix(), fp);
 | ||||
|  			free(fp); | ||||
|  			break; | ||||
|  		} | ||||
| @@ -431,13 +431,13 @@ user_cert_trusted_ca(struct passwd *pw, Key *key)
 | ||||
|  	if (!key_is_cert(key) || options.trusted_user_ca_keys == NULL) | ||||
|  		return 0; | ||||
|   | ||||
| -	ca_fp = key_fingerprint(key->cert->signature_key,
 | ||||
| -	    SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| +	ca_fp = key_selected_fingerprint(key->cert->signature_key, SSH_FP_HEX);
 | ||||
|   | ||||
|  	if (key_in_file(key->cert->signature_key, | ||||
|  	    options.trusted_user_ca_keys, 1) != 1) { | ||||
| -		debug2("%s: CA %s %s is not listed in %s", __func__,
 | ||||
| -		    key_type(key->cert->signature_key), ca_fp,
 | ||||
| +		debug2("%s: CA %s%s %s is not listed in %s", __func__,
 | ||||
| +		    key_type(key->cert->signature_key),
 | ||||
| +		    key_fingerprint_prefix(), ca_fp,
 | ||||
|  		    options.trusted_user_ca_keys); | ||||
|  		goto out; | ||||
|  	} | ||||
| diff --git a/key.c b/key.c
 | ||||
| index 168e1b7..eb98ea8 100644
 | ||||
| --- a/key.c
 | ||||
| +++ b/key.c
 | ||||
| @@ -628,6 +628,34 @@ key_fingerprint(const Key *k, enum fp_type dgst_type, enum fp_rep dgst_rep)
 | ||||
|  	return retval; | ||||
|  } | ||||
|   | ||||
| +enum fp_type
 | ||||
| +key_fingerprint_selection(void)
 | ||||
| +{
 | ||||
| +	static enum fp_type rv;
 | ||||
| +	static char rv_defined = 0;
 | ||||
| +	char *env;
 | ||||
| +
 | ||||
| +	if (!rv_defined) {
 | ||||
| +		env = getenv("SSH_FINGERPRINT_TYPE");
 | ||||
| +		rv = (env && !strcmp (env, "sha")) ?
 | ||||
| +			SSH_FP_SHA1 : SSH_FP_MD5;
 | ||||
| +		rv_defined = 1;
 | ||||
| +	}
 | ||||
| +	return rv;
 | ||||
| +}
 | ||||
| +
 | ||||
| +char *
 | ||||
| +key_selected_fingerprint(Key *k, enum fp_rep dgst_rep)
 | ||||
| +{
 | ||||
| +	return key_fingerprint(k, key_fingerprint_selection(), dgst_rep);
 | ||||
| +}
 | ||||
| +
 | ||||
| +char *
 | ||||
| +key_fingerprint_prefix(void)
 | ||||
| +{
 | ||||
| +	return key_fingerprint_selection() == SSH_FP_SHA1 ? "sha1:" : "";
 | ||||
| +}
 | ||||
| +
 | ||||
|  /* | ||||
|   * Reads a multiple-precision integer in decimal from the buffer, and advances | ||||
|   * the pointer.  The integer must already be initialized.  This function is | ||||
| diff --git a/key.h b/key.h
 | ||||
| index d8ad13d..0e3eea5 100644
 | ||||
| --- a/key.h
 | ||||
| +++ b/key.h
 | ||||
| @@ -104,6 +104,9 @@ int		 key_equal_public(const Key *, const Key *);
 | ||||
|  int		 key_equal(const Key *, const Key *); | ||||
|  char		*key_fingerprint(const Key *, enum fp_type, enum fp_rep); | ||||
|  u_char		*key_fingerprint_raw(const Key *, enum fp_type, u_int *); | ||||
| +enum fp_type	 key_fingerprint_selection(void);
 | ||||
| +char		*key_selected_fingerprint(Key *, enum fp_rep);
 | ||||
| +char		*key_fingerprint_prefix(void);
 | ||||
|  const char	*key_type(const Key *); | ||||
|  const char	*key_cert_type(const Key *); | ||||
|  int		 key_write(const Key *, FILE *); | ||||
| diff --git a/ssh-add.c b/ssh-add.c
 | ||||
| index 3421452..691949f 100644
 | ||||
| --- a/ssh-add.c
 | ||||
| +++ b/ssh-add.c
 | ||||
| @@ -330,10 +330,10 @@ list_identities(AuthenticationConnection *ac, int do_fp)
 | ||||
|  		    key = ssh_get_next_identity(ac, &comment, version)) { | ||||
|  			had_identities = 1; | ||||
|  			if (do_fp) { | ||||
| -				fp = key_fingerprint(key, SSH_FP_MD5,
 | ||||
| -				    SSH_FP_HEX);
 | ||||
| -				printf("%d %s %s (%s)\n",
 | ||||
| -				    key_size(key), fp, comment, key_type(key));
 | ||||
| +				fp = key_selected_fingerprint(key, SSH_FP_HEX);
 | ||||
| +				printf("%d %s%s %s (%s)\n",
 | ||||
| +				    key_size(key), key_fingerprint_prefix(),
 | ||||
| +				    fp, comment, key_type(key));
 | ||||
|  				free(fp); | ||||
|  			} else { | ||||
|  				if (!key_write(key, stdout)) | ||||
| diff --git a/ssh-agent.c b/ssh-agent.c
 | ||||
| index ba24612..117fdde 100644
 | ||||
| --- a/ssh-agent.c
 | ||||
| +++ b/ssh-agent.c
 | ||||
| @@ -198,9 +198,9 @@ confirm_key(Identity *id)
 | ||||
|  	char *p; | ||||
|  	int ret = -1; | ||||
|   | ||||
| -	p = key_fingerprint(id->key, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| -	if (ask_permission("Allow use of key %s?\nKey fingerprint %s.",
 | ||||
| -	    id->comment, p))
 | ||||
| +	p = key_selected_fingerprint(id->key, SSH_FP_HEX);
 | ||||
| +	if (ask_permission("Allow use of key %s?\nKey fingerprint %s%s.",
 | ||||
| +	    id->comment, key_fingerprint_prefix(), p))
 | ||||
|  		ret = 0; | ||||
|  	free(p); | ||||
|   | ||||
| diff --git a/ssh-keygen.c b/ssh-keygen.c
 | ||||
| index 2a316bc..482dc1c 100644
 | ||||
| --- a/ssh-keygen.c
 | ||||
| +++ b/ssh-keygen.c
 | ||||
| @@ -783,13 +783,14 @@ do_fingerprint(struct passwd *pw)
 | ||||
|  { | ||||
|  	FILE *f; | ||||
|  	Key *public; | ||||
| -	char *comment = NULL, *cp, *ep, line[16*1024], *fp, *ra;
 | ||||
| +	char *comment = NULL, *cp, *ep, line[16*1024], *fp, *ra, *pfx;
 | ||||
|  	int i, skip = 0, num = 0, invalid = 1; | ||||
|  	enum fp_rep rep; | ||||
|  	enum fp_type fptype; | ||||
|  	struct stat st; | ||||
|   | ||||
| -	fptype = print_bubblebabble ? SSH_FP_SHA1 : SSH_FP_MD5;
 | ||||
| +	fptype = print_bubblebabble ? SSH_FP_SHA1 : key_fingerprint_selection();
 | ||||
| +	pfx =	 print_bubblebabble ? "" : key_fingerprint_prefix();
 | ||||
|  	rep =    print_bubblebabble ? SSH_FP_BUBBLEBABBLE : SSH_FP_HEX; | ||||
|   | ||||
|  	if (!have_identity) | ||||
| @@ -801,8 +802,8 @@ do_fingerprint(struct passwd *pw)
 | ||||
|  	public = key_load_public(identity_file, &comment); | ||||
|  	if (public != NULL) { | ||||
|  		fp = key_fingerprint(public, fptype, rep); | ||||
| -		ra = key_fingerprint(public, SSH_FP_MD5, SSH_FP_RANDOMART);
 | ||||
| -		printf("%u %s %s (%s)\n", key_size(public), fp, comment,
 | ||||
| +		ra = key_selected_fingerprint(public, SSH_FP_RANDOMART);
 | ||||
| +		printf("%u %s%s %s (%s)\n", key_size(public), pfx, fp, comment,
 | ||||
|  		    key_type(public)); | ||||
|  		if (log_level >= SYSLOG_LEVEL_VERBOSE) | ||||
|  			printf("%s\n", ra); | ||||
| @@ -867,8 +868,8 @@ do_fingerprint(struct passwd *pw)
 | ||||
|  		} | ||||
|  		comment = *cp ? cp : comment; | ||||
|  		fp = key_fingerprint(public, fptype, rep); | ||||
| -		ra = key_fingerprint(public, SSH_FP_MD5, SSH_FP_RANDOMART);
 | ||||
| -		printf("%u %s %s (%s)\n", key_size(public), fp,
 | ||||
| +		ra = key_selected_fingerprint(public, SSH_FP_RANDOMART);
 | ||||
| +		printf("%u %s%s %s (%s)\n", key_size(public), pfx, fp,
 | ||||
|  		    comment ? comment : "no comment", key_type(public)); | ||||
|  		if (log_level >= SYSLOG_LEVEL_VERBOSE) | ||||
|  			printf("%s\n", ra); | ||||
| @@ -986,13 +987,15 @@ printhost(FILE *f, const char *name, Key *public, int ca, int hash)
 | ||||
|  	if (print_fingerprint) { | ||||
|  		enum fp_rep rep; | ||||
|  		enum fp_type fptype; | ||||
| -		char *fp, *ra;
 | ||||
| +		char *fp, *ra, *pfx;
 | ||||
|   | ||||
| -		fptype = print_bubblebabble ? SSH_FP_SHA1 : SSH_FP_MD5;
 | ||||
| +		fptype = print_bubblebabble ? SSH_FP_SHA1 : key_fingerprint_selection();
 | ||||
| +		pfx =	 print_bubblebabble ? "" : key_fingerprint_prefix();
 | ||||
|  		rep =    print_bubblebabble ? SSH_FP_BUBBLEBABBLE : SSH_FP_HEX; | ||||
| +
 | ||||
|  		fp = key_fingerprint(public, fptype, rep); | ||||
| -		ra = key_fingerprint(public, SSH_FP_MD5, SSH_FP_RANDOMART);
 | ||||
| -		printf("%u %s %s (%s)\n", key_size(public), fp, name,
 | ||||
| +		ra = key_selected_fingerprint(public, SSH_FP_RANDOMART);
 | ||||
| +		printf("%u %s%s %s (%s)\n", key_size(public), pfx, fp, name,
 | ||||
|  		    key_type(public)); | ||||
|  		if (log_level >= SYSLOG_LEVEL_VERBOSE) | ||||
|  			printf("%s\n", ra); | ||||
| @@ -1878,16 +1881,17 @@ do_show_cert(struct passwd *pw)
 | ||||
|  		fatal("%s is not a certificate", identity_file); | ||||
|  	v00 = key->type == KEY_RSA_CERT_V00 || key->type == KEY_DSA_CERT_V00; | ||||
|   | ||||
| -	key_fp = key_fingerprint(key, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| -	ca_fp = key_fingerprint(key->cert->signature_key,
 | ||||
| -	    SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| +	key_fp = key_selected_fingerprint(key, SSH_FP_HEX);
 | ||||
| +	ca_fp = key_selected_fingerprint(key->cert->signature_key, SSH_FP_HEX);
 | ||||
|   | ||||
|  	printf("%s:\n", identity_file); | ||||
|  	printf("        Type: %s %s certificate\n", key_ssh_name(key), | ||||
|  	    key_cert_type(key)); | ||||
| -	printf("        Public key: %s %s\n", key_type(key), key_fp);
 | ||||
| -	printf("        Signing CA: %s %s\n",
 | ||||
| -	    key_type(key->cert->signature_key), ca_fp);
 | ||||
| +	printf("        Public key: %s %s%s\n", key_type(key),
 | ||||
| +	    key_fingerprint_prefix(), key_fp);
 | ||||
| +	printf("        Signing CA: %s %s%s\n",
 | ||||
| +	    key_type(key->cert->signature_key),
 | ||||
| +	    key_fingerprint_prefix(), ca_fp);
 | ||||
|  	printf("        Key ID: \"%s\"\n", key->cert->key_id); | ||||
|  	if (!v00) { | ||||
|  		printf("        Serial: %llu\n", | ||||
| @@ -2686,13 +2690,12 @@ passphrase_again:
 | ||||
|  	fclose(f); | ||||
|   | ||||
|  	if (!quiet) { | ||||
| -		char *fp = key_fingerprint(public, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| -		char *ra = key_fingerprint(public, SSH_FP_MD5,
 | ||||
| -		    SSH_FP_RANDOMART);
 | ||||
| +		char *fp = key_selected_fingerprint(public, SSH_FP_HEX);
 | ||||
| +		char *ra = key_selected_fingerprint(public, SSH_FP_RANDOMART);
 | ||||
|  		printf("Your public key has been saved in %s.\n", | ||||
|  		    identity_file); | ||||
|  		printf("The key fingerprint is:\n"); | ||||
| -		printf("%s %s\n", fp, comment);
 | ||||
| +		printf("%s%s %s\n", key_fingerprint_prefix(), fp, comment);
 | ||||
|  		printf("The key's randomart image is:\n"); | ||||
|  		printf("%s\n", ra); | ||||
|  		free(ra); | ||||
| diff --git a/sshconnect.c b/sshconnect.c
 | ||||
| index 573d7a8..394cca8 100644
 | ||||
| --- a/sshconnect.c
 | ||||
| +++ b/sshconnect.c
 | ||||
| @@ -914,10 +914,10 @@ check_host_key(char *hostname, struct sockaddr *hostaddr, u_short port,
 | ||||
|  				    "key for IP address '%.128s' to the list " | ||||
|  				    "of known hosts.", type, ip); | ||||
|  		} else if (options.visual_host_key) { | ||||
| -			fp = key_fingerprint(host_key, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| -			ra = key_fingerprint(host_key, SSH_FP_MD5,
 | ||||
| -			    SSH_FP_RANDOMART);
 | ||||
| -			logit("Host key fingerprint is %s\n%s\n", fp, ra);
 | ||||
| +			fp = key_selected_fingerprint(host_key, SSH_FP_HEX);
 | ||||
| +			ra = key_selected_fingerprint(host_key, SSH_FP_RANDOMART);
 | ||||
| +			logit("Host key fingerprint is %s%s\n%s\n",
 | ||||
| +			    key_fingerprint_prefix(), fp, ra);
 | ||||
|  			free(ra); | ||||
|  			free(fp); | ||||
|  		} | ||||
| @@ -955,9 +955,8 @@ check_host_key(char *hostname, struct sockaddr *hostaddr, u_short port,
 | ||||
|  			else | ||||
|  				snprintf(msg1, sizeof(msg1), "."); | ||||
|  			/* The default */ | ||||
| -			fp = key_fingerprint(host_key, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| -			ra = key_fingerprint(host_key, SSH_FP_MD5,
 | ||||
| -			    SSH_FP_RANDOMART);
 | ||||
| +			fp = key_selected_fingerprint(host_key, SSH_FP_HEX);
 | ||||
| +			ra = key_selected_fingerprint(host_key, SSH_FP_RANDOMART);
 | ||||
|  			msg2[0] = '\0'; | ||||
|  			if (options.verify_host_key_dns) { | ||||
|  				if (matching_host_key_dns) | ||||
| @@ -972,10 +971,11 @@ check_host_key(char *hostname, struct sockaddr *hostaddr, u_short port,
 | ||||
|  			snprintf(msg, sizeof(msg), | ||||
|  			    "The authenticity of host '%.200s (%s)' can't be " | ||||
|  			    "established%s\n" | ||||
| -			    "%s key fingerprint is %s.%s%s\n%s"
 | ||||
| +			    "%s key fingerprint is %s%s.%s%s\n%s"
 | ||||
|  			    "Are you sure you want to continue connecting " | ||||
|  			    "(yes/no)? ", | ||||
| -			    host, ip, msg1, type, fp,
 | ||||
| +			    host, ip, msg1, type,
 | ||||
| +			    key_fingerprint_prefix(), fp,
 | ||||
|  			    options.visual_host_key ? "\n" : "", | ||||
|  			    options.visual_host_key ? ra : "", | ||||
|  			    msg2); | ||||
| @@ -1220,8 +1220,9 @@ verify_host_key(char *host, struct sockaddr *hostaddr, Key *host_key)
 | ||||
|  	int flags = 0; | ||||
|  	char *fp; | ||||
|   | ||||
| -	fp = key_fingerprint(host_key, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| -	debug("Server host key: %s %s", key_type(host_key), fp);
 | ||||
| +	fp = key_selected_fingerprint(host_key, SSH_FP_HEX);
 | ||||
| +	debug("Server host key: %s %s%s", key_type(host_key),
 | ||||
| +	    key_fingerprint_prefix(), fp);
 | ||||
|  	free(fp); | ||||
|   | ||||
|  	/* XXX certs are not yet supported for DNS */ | ||||
| @@ -1327,14 +1328,15 @@ show_other_keys(struct hostkeys *hostkeys, Key *key)
 | ||||
|  			continue; | ||||
|  		if (!lookup_key_in_hostkeys_by_type(hostkeys, type[i], &found)) | ||||
|  			continue; | ||||
| -		fp = key_fingerprint(found->key, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| -		ra = key_fingerprint(found->key, SSH_FP_MD5, SSH_FP_RANDOMART);
 | ||||
| +		fp = key_selected_fingerprint(found->key, SSH_FP_HEX);
 | ||||
| +		ra = key_selected_fingerprint(found->key, SSH_FP_RANDOMART);
 | ||||
|  		logit("WARNING: %s key found for host %s\n" | ||||
|  		    "in %s:%lu\n" | ||||
| -		    "%s key fingerprint %s.",
 | ||||
| +		    "%s key fingerprint %s%s.",
 | ||||
|  		    key_type(found->key), | ||||
|  		    found->host, found->file, found->line, | ||||
| -		    key_type(found->key), fp);
 | ||||
| +		    key_type(found->key),
 | ||||
| +		    key_fingerprint_prefix(), fp);
 | ||||
|  		if (options.visual_host_key) | ||||
|  			logit("%s", ra); | ||||
|  		free(ra); | ||||
| @@ -1349,7 +1351,7 @@ warn_changed_key(Key *host_key)
 | ||||
|  { | ||||
|  	char *fp; | ||||
|   | ||||
| -	fp = key_fingerprint(host_key, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| +	fp = key_selected_fingerprint(host_key, SSH_FP_HEX);
 | ||||
|   | ||||
|  	error("@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@"); | ||||
|  	error("@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @"); | ||||
| @@ -1357,8 +1359,8 @@ warn_changed_key(Key *host_key)
 | ||||
|  	error("IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!"); | ||||
|  	error("Someone could be eavesdropping on you right now (man-in-the-middle attack)!"); | ||||
|  	error("It is also possible that a host key has just been changed."); | ||||
| -	error("The fingerprint for the %s key sent by the remote host is\n%s.",
 | ||||
| -	    key_type(host_key), fp);
 | ||||
| +	error("The fingerprint for the %s key sent by the remote host is\n%s%s.",
 | ||||
| +	    key_type(host_key),key_fingerprint_prefix(),  fp);
 | ||||
|  	error("Please contact your system administrator."); | ||||
|   | ||||
|  	free(fp); | ||||
| diff --git a/sshconnect2.c b/sshconnect2.c
 | ||||
| index 7f4ff41..adbbfc7 100644
 | ||||
| --- a/sshconnect2.c
 | ||||
| +++ b/sshconnect2.c
 | ||||
| @@ -577,8 +577,9 @@ input_userauth_pk_ok(int type, u_int32_t seq, void *ctxt)
 | ||||
|  		    key->type, pktype); | ||||
|  		goto done; | ||||
|  	} | ||||
| -	fp = key_fingerprint(key, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| -	debug2("input_userauth_pk_ok: fp %s", fp);
 | ||||
| +	fp = key_selected_fingerprint(key, SSH_FP_HEX);
 | ||||
| +	debug2("input_userauth_pk_ok: fp %s%s",
 | ||||
| +	    key_fingerprint_prefix(), fp);
 | ||||
|  	free(fp); | ||||
|   | ||||
|  	/* | ||||
| @@ -986,8 +987,9 @@ sign_and_send_pubkey(Authctxt *authctxt, Identity *id)
 | ||||
|  	int have_sig = 1; | ||||
|  	char *fp; | ||||
|   | ||||
| -	fp = key_fingerprint(id->key, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| -	debug3("sign_and_send_pubkey: %s %s", key_type(id->key), fp);
 | ||||
| +	fp = key_selected_fingerprint(id->key, SSH_FP_HEX);
 | ||||
| +	debug3("sign_and_send_pubkey: %s %s%s", key_type(id->key),
 | ||||
| +	    key_fingerprint_prefix(), fp);
 | ||||
|  	free(fp); | ||||
|   | ||||
|  	if (key_to_blob(id->key, &blob, &bloblen) == 0) { | ||||
| @ -1,5 +1,5 @@ | ||||
| diff --git a/gss-serv-krb5.c b/gss-serv-krb5.c
 | ||||
| index 42de994..60de320 100644
 | ||||
| index 413b845..54dd383 100644
 | ||||
| --- a/gss-serv-krb5.c
 | ||||
| +++ b/gss-serv-krb5.c
 | ||||
| @@ -32,7 +32,9 @@
 | ||||
| @ -12,12 +12,7 @@ index 42de994..60de320 100644 | ||||
|   | ||||
|  #include "xmalloc.h" | ||||
|  #include "key.h" | ||||
| @@ -40,10 +42,12 @@
 | ||||
|  #include "auth.h" | ||||
|  #include "log.h" | ||||
|  #include "servconf.h" | ||||
| +#include "misc.h"
 | ||||
|   | ||||
| @@ -45,6 +47,7 @@
 | ||||
|  #include "buffer.h" | ||||
|  #include "ssh-gss.h" | ||||
|   | ||||
| @ -25,7 +20,7 @@ index 42de994..60de320 100644 | ||||
|  extern ServerOptions options; | ||||
|   | ||||
|  #ifdef HEIMDAL | ||||
| @@ -55,6 +59,13 @@ extern ServerOptions options;
 | ||||
| @@ -56,6 +59,13 @@ extern ServerOptions options;
 | ||||
|  # include <gssapi/gssapi_krb5.h> | ||||
|  #endif | ||||
|   | ||||
| @ -39,7 +34,7 @@ index 42de994..60de320 100644 | ||||
|  static krb5_context krb_context = NULL; | ||||
|   | ||||
|  /* Initialise the krb5 library, for the stuff that GSSAPI won't do */ | ||||
| @@ -87,6 +98,7 @@ ssh_gssapi_krb5_userok(ssh_gssapi_client *client, char *name)
 | ||||
| @@ -88,6 +98,7 @@ ssh_gssapi_krb5_userok(ssh_gssapi_client *client, char *name)
 | ||||
|  	krb5_principal princ; | ||||
|  	int retval; | ||||
|  	const char *errmsg; | ||||
| @ -47,7 +42,7 @@ index 42de994..60de320 100644 | ||||
|   | ||||
|  	if (ssh_gssapi_krb5_init() == 0) | ||||
|  		return 0; | ||||
| @@ -98,10 +110,22 @@ ssh_gssapi_krb5_userok(ssh_gssapi_client *client, char *name)
 | ||||
| @@ -99,10 +110,22 @@ ssh_gssapi_krb5_userok(ssh_gssapi_client *client, char *name)
 | ||||
|  		krb5_free_error_message(krb_context, errmsg); | ||||
|  		return 0; | ||||
|  	} | ||||
| @ -71,7 +66,7 @@ index 42de994..60de320 100644 | ||||
|  	} else | ||||
|  		retval = 0; | ||||
|   | ||||
| @@ -109,6 +133,135 @@ ssh_gssapi_krb5_userok(ssh_gssapi_client *client, char *name)
 | ||||
| @@ -110,6 +133,135 @@ ssh_gssapi_krb5_userok(ssh_gssapi_client *client, char *name)
 | ||||
|  	return retval; | ||||
|  } | ||||
|   | ||||
| @ -208,10 +203,10 @@ index 42de994..60de320 100644 | ||||
|  /* This writes out any forwarded credentials from the structure populated | ||||
|   * during userauth. Called after we have setuid to the user */ | ||||
| diff --git a/session.c b/session.c
 | ||||
| index b5dc144..ba4589b 100644
 | ||||
| index 28659ec..9c94d8e 100644
 | ||||
| --- a/session.c
 | ||||
| +++ b/session.c
 | ||||
| @@ -806,6 +806,29 @@ do_exec(Session *s, const char *command)
 | ||||
| @@ -789,6 +789,29 @@ do_exec(Session *s, const char *command)
 | ||||
|  		command = forced_command; | ||||
|  		forced = "(key-option)"; | ||||
|  	} | ||||
| @ -257,10 +252,10 @@ index 0374c88..509109a 100644 | ||||
|   | ||||
|  /* draft-ietf-secsh-gsskeyex-06 */ | ||||
| diff --git a/sshd.8 b/sshd.8
 | ||||
| index 058d37a..5c4f15b 100644
 | ||||
| index adcaaf9..824163b 100644
 | ||||
| --- a/sshd.8
 | ||||
| +++ b/sshd.8
 | ||||
| @@ -327,6 +327,7 @@ Finally, the server and the client enter an authentication dialog.
 | ||||
| @@ -324,6 +324,7 @@ Finally, the server and the client enter an authentication dialog.
 | ||||
|  The client tries to authenticate itself using | ||||
|  host-based authentication, | ||||
|  public key authentication, | ||||
|  | ||||
| @ -1,8 +1,8 @@ | ||||
| diff --git a/Makefile.in b/Makefile.in
 | ||||
| index 581b121..2ad26ff 100644
 | ||||
| index bbc3034..c9891e0 100644
 | ||||
| --- a/Makefile.in
 | ||||
| +++ b/Makefile.in
 | ||||
| @@ -77,6 +77,7 @@ LIBSSH_OBJS=authfd.o authfile.o bufaux.o bufbn.o buffer.o \
 | ||||
| @@ -87,6 +87,7 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \
 | ||||
|  	atomicio.o key.o dispatch.o kex.o mac.o uidswap.o uuencode.o misc.o \ | ||||
|  	monitor_fdpass.o rijndael.o ssh-dss.o ssh-ecdsa.o ssh-rsa.o dh.o \ | ||||
|  	kexdh.o kexgex.o kexdhc.o kexgexc.o bufec.o kexecdh.o kexecdhc.o \ | ||||
| @ -10,7 +10,7 @@ index 581b121..2ad26ff 100644 | ||||
|  	msg.o progressmeter.o dns.o entropy.o gss-genr.o umac.o umac128.o \ | ||||
|  	ssh-pkcs11.o krl.o smult_curve25519_ref.o \ | ||||
|  	kexc25519.o kexc25519c.o poly1305.o chacha.o cipher-chachapoly.o \ | ||||
| @@ -96,7 +97,7 @@ SSHDOBJS=sshd.o auth-rhosts.o auth-passwd.o auth-rsa.o auth-rh-rsa.o \
 | ||||
| @@ -106,7 +107,7 @@ SSHDOBJS=sshd.o auth-rhosts.o auth-passwd.o auth-rsa.o auth-rh-rsa.o \
 | ||||
|  	auth2-none.o auth2-passwd.o auth2-pubkey.o \ | ||||
|  	monitor_mm.o monitor.o monitor_wrap.o kexdhs.o kexgexs.o kexecdhs.o \ | ||||
|  	kexc25519s.o auth-krb5.o \ | ||||
| @ -20,10 +20,10 @@ index 581b121..2ad26ff 100644 | ||||
|  	sftp-server.o sftp-common.o \ | ||||
|  	roaming_common.o roaming_serv.o \ | ||||
| diff --git a/auth2-gss.c b/auth2-gss.c
 | ||||
| index 4756dd7..ad65059 100644
 | ||||
| index 4803e7e..222e3e0 100644
 | ||||
| --- a/auth2-gss.c
 | ||||
| +++ b/auth2-gss.c
 | ||||
| @@ -52,6 +52,40 @@ static void input_gssapi_mic(int type, u_int32_t plen, void *ctxt);
 | ||||
| @@ -53,6 +53,40 @@ static void input_gssapi_mic(int type, u_int32_t plen, void *ctxt);
 | ||||
|  static void input_gssapi_exchange_complete(int type, u_int32_t plen, void *ctxt); | ||||
|  static void input_gssapi_errtok(int, u_int32_t, void *); | ||||
|   | ||||
| @ -64,7 +64,7 @@ index 4756dd7..ad65059 100644 | ||||
|  /* | ||||
|   * We only support those mechanisms that we know about (ie ones that we know | ||||
|   * how to check local user kuserok and the like) | ||||
| @@ -235,7 +269,8 @@ input_gssapi_exchange_complete(int type, u_int32_t plen, void *ctxt)
 | ||||
| @@ -236,7 +270,8 @@ input_gssapi_exchange_complete(int type, u_int32_t plen, void *ctxt)
 | ||||
|   | ||||
|  	packet_check_eom(); | ||||
|   | ||||
| @ -74,7 +74,7 @@ index 4756dd7..ad65059 100644 | ||||
|   | ||||
|  	authctxt->postponed = 0; | ||||
|  	dispatch_set(SSH2_MSG_USERAUTH_GSSAPI_TOKEN, NULL); | ||||
| @@ -277,7 +312,8 @@ input_gssapi_mic(int type, u_int32_t plen, void *ctxt)
 | ||||
| @@ -278,7 +313,8 @@ input_gssapi_mic(int type, u_int32_t plen, void *ctxt)
 | ||||
|  	gssbuf.length = buffer_len(&b); | ||||
|   | ||||
|  	if (!GSS_ERROR(PRIVSEP(ssh_gssapi_checkmic(gssctxt, &gssbuf, &mic)))) | ||||
| @ -84,7 +84,7 @@ index 4756dd7..ad65059 100644 | ||||
|  	else | ||||
|  		logit("GSSAPI MIC check failed"); | ||||
|   | ||||
| @@ -294,6 +330,12 @@ input_gssapi_mic(int type, u_int32_t plen, void *ctxt)
 | ||||
| @@ -295,6 +331,12 @@ input_gssapi_mic(int type, u_int32_t plen, void *ctxt)
 | ||||
|  	userauth_finish(authctxt, authenticated, "gssapi-with-mic", NULL); | ||||
|  } | ||||
|   | ||||
| @ -98,10 +98,10 @@ index 4756dd7..ad65059 100644 | ||||
|  	"gssapi-with-mic", | ||||
|  	userauth_gssapi, | ||||
| diff --git a/auth2.c b/auth2.c
 | ||||
| index 5f4f26f..0f52b68 100644
 | ||||
| index d6fbc93..124d02b 100644
 | ||||
| --- a/auth2.c
 | ||||
| +++ b/auth2.c
 | ||||
| @@ -69,6 +69,7 @@ extern Authmethod method_passwd;
 | ||||
| @@ -70,6 +70,7 @@ extern Authmethod method_passwd;
 | ||||
|  extern Authmethod method_kbdint; | ||||
|  extern Authmethod method_hostbased; | ||||
|  #ifdef GSSAPI | ||||
| @ -109,7 +109,7 @@ index 5f4f26f..0f52b68 100644 | ||||
|  extern Authmethod method_gssapi; | ||||
|  #endif | ||||
|   | ||||
| @@ -76,6 +77,7 @@ Authmethod *authmethods[] = {
 | ||||
| @@ -77,6 +78,7 @@ Authmethod *authmethods[] = {
 | ||||
|  	&method_none, | ||||
|  	&method_pubkey, | ||||
|  #ifdef GSSAPI | ||||
| @ -118,7 +118,7 @@ index 5f4f26f..0f52b68 100644 | ||||
|  #endif | ||||
|  	&method_passwd, | ||||
| diff --git a/clientloop.c b/clientloop.c
 | ||||
| index 59ad3a2..9c60108 100644
 | ||||
| index 397c965..20ce0b5 100644
 | ||||
| --- a/clientloop.c
 | ||||
| +++ b/clientloop.c
 | ||||
| @@ -111,6 +111,10 @@
 | ||||
| @ -132,7 +132,7 @@ index 59ad3a2..9c60108 100644 | ||||
|  /* import options */ | ||||
|  extern Options options; | ||||
|   | ||||
| @@ -1608,6 +1612,15 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
 | ||||
| @@ -1596,6 +1600,15 @@ client_loop(int have_pty, int escape_char_arg, int ssh2_chan_id)
 | ||||
|  		/* Do channel operations unless rekeying in progress. */ | ||||
|  		if (!rekeying) { | ||||
|  			channel_after_select(readset, writeset); | ||||
| @ -149,7 +149,7 @@ index 59ad3a2..9c60108 100644 | ||||
|  				debug("need rekeying"); | ||||
|  				xxx_kex->done = 0; | ||||
| diff --git a/configure.ac b/configure.ac
 | ||||
| index 74e77db..9bde04e 100644
 | ||||
| index 8dedb95..2c4adac 100644
 | ||||
| --- a/configure.ac
 | ||||
| +++ b/configure.ac
 | ||||
| @@ -584,6 +584,30 @@ main() { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16))
 | ||||
| @ -526,10 +526,10 @@ index b39281b..a3a2289 100644 | ||||
| +
 | ||||
|  #endif /* GSSAPI */ | ||||
| diff --git a/gss-serv-krb5.c b/gss-serv-krb5.c
 | ||||
| index 759fa10..42de994 100644
 | ||||
| index 795992d..413b845 100644
 | ||||
| --- a/gss-serv-krb5.c
 | ||||
| +++ b/gss-serv-krb5.c
 | ||||
| @@ -120,7 +120,7 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_client *client)
 | ||||
| @@ -121,7 +121,7 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_client *client)
 | ||||
|  	krb5_error_code problem; | ||||
|  	krb5_principal princ; | ||||
|  	OM_uint32 maj_status, min_status; | ||||
| @ -538,7 +538,7 @@ index 759fa10..42de994 100644 | ||||
|  	const char *errmsg; | ||||
|   | ||||
|  	if (client->creds == NULL) { | ||||
| @@ -180,11 +180,26 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_client *client)
 | ||||
| @@ -181,11 +181,26 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_client *client)
 | ||||
|  		return; | ||||
|  	} | ||||
|   | ||||
| @ -569,7 +569,7 @@ index 759fa10..42de994 100644 | ||||
|   | ||||
|  #ifdef USE_PAM | ||||
|  	if (options.use_pam) | ||||
| @@ -193,9 +208,76 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_client *client)
 | ||||
| @@ -194,9 +209,76 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_client *client)
 | ||||
|   | ||||
|  	krb5_cc_close(krb_context, ccache); | ||||
|   | ||||
| @ -646,7 +646,7 @@ index 759fa10..42de994 100644 | ||||
|  ssh_gssapi_mech gssapi_kerberos_mech = { | ||||
|  	"toWM5Slw5Ew8Mqkay+al2g==", | ||||
|  	"Kerberos", | ||||
| @@ -203,7 +285,8 @@ ssh_gssapi_mech gssapi_kerberos_mech = {
 | ||||
| @@ -204,7 +286,8 @@ ssh_gssapi_mech gssapi_kerberos_mech = {
 | ||||
|  	NULL, | ||||
|  	&ssh_gssapi_krb5_userok, | ||||
|  	NULL, | ||||
| @ -657,7 +657,7 @@ index 759fa10..42de994 100644 | ||||
|   | ||||
|  #endif /* KRB5 */ | ||||
| diff --git a/gss-serv.c b/gss-serv.c
 | ||||
| index e61b37b..14f540e 100644
 | ||||
| index 5c59924..2289e8e 100644
 | ||||
| --- a/gss-serv.c
 | ||||
| +++ b/gss-serv.c
 | ||||
| @@ -45,15 +45,20 @@
 | ||||
| @ -684,7 +684,7 @@ index e61b37b..14f540e 100644 | ||||
|  #ifdef KRB5 | ||||
|  extern ssh_gssapi_mech gssapi_kerberos_mech; | ||||
| @@ -100,25 +105,32 @@ ssh_gssapi_acquire_cred(Gssctxt *ctx)
 | ||||
|  	char lname[MAXHOSTNAMELEN]; | ||||
|  	char lname[NI_MAXHOST]; | ||||
|  	gss_OID_set oidset; | ||||
|   | ||||
| -	gss_create_empty_oid_set(&status, &oidset);
 | ||||
| @ -693,11 +693,11 @@ index e61b37b..14f540e 100644 | ||||
| +		gss_create_empty_oid_set(&status, &oidset);
 | ||||
| +		gss_add_oid_set_member(&status, ctx->oid, &oidset);
 | ||||
|   | ||||
| -	if (gethostname(lname, MAXHOSTNAMELEN)) {
 | ||||
| -	if (gethostname(lname, sizeof(lname))) {
 | ||||
| -		gss_release_oid_set(&status, &oidset);
 | ||||
| -		return (-1);
 | ||||
| -	}
 | ||||
| +		if (gethostname(lname, MAXHOSTNAMELEN)) {
 | ||||
| +		if (gethostname(lname, sizeof(lname))) {
 | ||||
| +			gss_release_oid_set(&status, &oidset);
 | ||||
| +			return (-1);
 | ||||
| +		}
 | ||||
| @ -708,25 +708,25 @@ index e61b37b..14f540e 100644 | ||||
| +		}
 | ||||
| +	
 | ||||
| +		if ((ctx->major = gss_acquire_cred(&ctx->minor,
 | ||||
| +		    ctx->name, 0, oidset, GSS_C_ACCEPT, &ctx->creds, 
 | ||||
| +		    NULL, NULL)))
 | ||||
| +		    ctx->name, 0, oidset, GSS_C_ACCEPT, &ctx->creds, NULL, NULL)))
 | ||||
| +			ssh_gssapi_error(ctx);
 | ||||
|   | ||||
| -	if (GSS_ERROR(ssh_gssapi_import_name(ctx, lname))) {
 | ||||
|  		gss_release_oid_set(&status, &oidset); | ||||
|  		return (ctx->major); | ||||
| +	} else {
 | ||||
| +		ctx->name = GSS_C_NO_NAME;
 | ||||
| +		ctx->creds = GSS_C_NO_CREDENTIAL;
 | ||||
|  	} | ||||
| -	}
 | ||||
| -
 | ||||
| -	if ((ctx->major = gss_acquire_cred(&ctx->minor,
 | ||||
| -	    ctx->name, 0, oidset, GSS_C_ACCEPT, &ctx->creds, NULL, NULL)))
 | ||||
| -		ssh_gssapi_error(ctx);
 | ||||
| -
 | ||||
| +	} else {
 | ||||
| +		ctx->name = GSS_C_NO_NAME;
 | ||||
| +		ctx->creds = GSS_C_NO_CREDENTIAL;
 | ||||
| +		return GSS_S_COMPLETE;
 | ||||
| + 	}
 | ||||
|   | ||||
| -	gss_release_oid_set(&status, &oidset);
 | ||||
| -	return (ctx->major);
 | ||||
| +	return GSS_S_COMPLETE;
 | ||||
|  } | ||||
|   | ||||
|  /* Privileged */ | ||||
| @ -796,8 +796,7 @@ index e61b37b..14f540e 100644 | ||||
| +
 | ||||
| +		ctx->major = gss_compare_name(&ctx->minor, client->name, 
 | ||||
| +		    new_name, &equal);
 | ||||
|   | ||||
| -	gss_buffer_desc ename;
 | ||||
| +
 | ||||
| +		if (GSS_ERROR(ctx->major)) {
 | ||||
| +			ssh_gssapi_error(ctx);
 | ||||
| +			return (ctx->major);
 | ||||
| @ -809,7 +808,8 @@ index e61b37b..14f540e 100644 | ||||
| +		}
 | ||||
| +
 | ||||
| +		debug("Marking rekeyed credentials for export");
 | ||||
| +
 | ||||
|   | ||||
| -	gss_buffer_desc ename;
 | ||||
| +		gss_release_name(&ctx->minor, &client->name);
 | ||||
| +		gss_release_cred(&ctx->minor, &client->creds);
 | ||||
| +		client->name = new_name;
 | ||||
| @ -991,10 +991,10 @@ index e61b37b..14f540e 100644 | ||||
|   | ||||
|  #endif | ||||
| diff --git a/kex.c b/kex.c
 | ||||
| index 74e2b86..bce2ab8 100644
 | ||||
| index a173e70..4563920 100644
 | ||||
| --- a/kex.c
 | ||||
| +++ b/kex.c
 | ||||
| @@ -51,6 +51,10 @@
 | ||||
| @@ -53,6 +53,10 @@
 | ||||
|  #include "roaming.h" | ||||
|  #include "digest.h" | ||||
|   | ||||
| @ -1005,10 +1005,10 @@ index 74e2b86..bce2ab8 100644 | ||||
|  #if OPENSSL_VERSION_NUMBER >= 0x00907000L | ||||
|  # if defined(HAVE_EVP_SHA256) | ||||
|  # define evp_ssh_sha256 EVP_sha256 | ||||
| @@ -90,6 +94,11 @@ static const struct kexalg kexalgs[] = {
 | ||||
| @@ -94,6 +98,11 @@ static const struct kexalg kexalgs[] = {
 | ||||
|  #ifdef HAVE_EVP_SHA256 | ||||
|  	{ KEX_CURVE25519_SHA256, KEX_C25519_SHA256, 0, SSH_DIGEST_SHA256 }, | ||||
|  #endif | ||||
|  #endif /* HAVE_EVP_SHA256 */ | ||||
| +#ifdef GSSAPI
 | ||||
| +	{ 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 },
 | ||||
| @ -1017,7 +1017,7 @@ index 74e2b86..bce2ab8 100644 | ||||
|  	{ NULL, -1, -1, -1}, | ||||
|  }; | ||||
|   | ||||
| @@ -119,6 +128,12 @@ kex_alg_by_name(const char *name)
 | ||||
| @@ -123,6 +132,12 @@ kex_alg_by_name(const char *name)
 | ||||
|  	for (k = kexalgs; k->name != NULL; k++) { | ||||
|  		if (strcmp(k->name, name) == 0) | ||||
|  			return k; | ||||
| @ -1031,7 +1031,7 @@ index 74e2b86..bce2ab8 100644 | ||||
|  	return NULL; | ||||
|  } | ||||
| diff --git a/kex.h b/kex.h
 | ||||
| index c85680e..313bb51 100644
 | ||||
| index 4c40ec8..1c76c08 100644
 | ||||
| --- a/kex.h
 | ||||
| +++ b/kex.h
 | ||||
| @@ -76,6 +76,11 @@ enum kex_exchange {
 | ||||
| @ -1412,10 +1412,10 @@ index 0000000..e90b567 | ||||
| +#endif /* GSSAPI */
 | ||||
| diff --git a/kexgsss.c b/kexgsss.c
 | ||||
| new file mode 100644 | ||||
| index 0000000..6d7518c
 | ||||
| index 0000000..b880998
 | ||||
| --- /dev/null
 | ||||
| +++ b/kexgsss.c
 | ||||
| @@ -0,0 +1,288 @@
 | ||||
| @@ -0,0 +1,289 @@
 | ||||
| +/*
 | ||||
| + * Copyright (c) 2001-2009 Simon Wilkinson. All rights reserved.
 | ||||
| + *
 | ||||
| @ -1460,6 +1460,7 @@ index 0000000..6d7518c | ||||
| +#include "dh.h"
 | ||||
| +#include "ssh-gss.h"
 | ||||
| +#include "monitor_wrap.h"
 | ||||
| +#include "misc.h"      /* servconf.h needs misc.h for struct ForwardOptions */
 | ||||
| +#include "servconf.h"
 | ||||
| +
 | ||||
| +extern ServerOptions options;
 | ||||
| @ -1704,35 +1705,11 @@ index 0000000..6d7518c | ||||
| +		ssh_gssapi_rekey_creds();
 | ||||
| +}
 | ||||
| +#endif /* GSSAPI */
 | ||||
| diff --git a/key.c b/key.c
 | ||||
| index eb98ea8..900b9e3 100644
 | ||||
| --- a/key.c
 | ||||
| +++ b/key.c
 | ||||
| @@ -1013,6 +1013,7 @@ static const struct keytype keytypes[] = {
 | ||||
|  	    KEY_DSA_CERT_V00, 0, 1 }, | ||||
|  	{ "ssh-ed25519-cert-v01@openssh.com", "ED25519-CERT", | ||||
|  	    KEY_ED25519_CERT, 0, 1 }, | ||||
| +	{ "null", "null", KEY_NULL, 0, 0 },
 | ||||
|  	{ NULL, NULL, -1, -1, 0 } | ||||
|  }; | ||||
|   | ||||
| diff --git a/key.h b/key.h
 | ||||
| index 0e3eea5..d51ed81 100644
 | ||||
| --- a/key.h
 | ||||
| +++ b/key.h
 | ||||
| @@ -46,6 +46,7 @@ enum types {
 | ||||
|  	KEY_ED25519_CERT, | ||||
|  	KEY_RSA_CERT_V00, | ||||
|  	KEY_DSA_CERT_V00, | ||||
| +	KEY_NULL,
 | ||||
|  	KEY_UNSPEC | ||||
|  }; | ||||
|  enum fp_type { | ||||
| diff --git a/monitor.c b/monitor.c
 | ||||
| index 229fada..aa70945 100644
 | ||||
| index d3f87e1..7ebc76e 100644
 | ||||
| --- a/monitor.c
 | ||||
| +++ b/monitor.c
 | ||||
| @@ -178,6 +178,8 @@ int mm_answer_gss_setup_ctx(int, Buffer *);
 | ||||
| @@ -181,6 +181,8 @@ int mm_answer_gss_setup_ctx(int, Buffer *);
 | ||||
|  int mm_answer_gss_accept_ctx(int, Buffer *); | ||||
|  int mm_answer_gss_userok(int, Buffer *); | ||||
|  int mm_answer_gss_checkmic(int, Buffer *); | ||||
| @ -1741,7 +1718,7 @@ index 229fada..aa70945 100644 | ||||
|  #endif | ||||
|   | ||||
|  #ifdef SSH_AUDIT_EVENTS | ||||
| @@ -253,11 +255,18 @@ struct mon_table mon_dispatch_proto20[] = {
 | ||||
| @@ -261,11 +263,18 @@ struct mon_table mon_dispatch_proto20[] = {
 | ||||
|      {MONITOR_REQ_GSSSTEP, MON_ISAUTH, mm_answer_gss_accept_ctx}, | ||||
|      {MONITOR_REQ_GSSUSEROK, MON_AUTH, mm_answer_gss_userok}, | ||||
|      {MONITOR_REQ_GSSCHECKMIC, MON_ISAUTH, mm_answer_gss_checkmic}, | ||||
| @ -1757,10 +1734,10 @@ index 229fada..aa70945 100644 | ||||
| +    {MONITOR_REQ_GSSSIGN, 0, mm_answer_gss_sign},
 | ||||
| +    {MONITOR_REQ_GSSUPCREDS, 0, mm_answer_gss_updatecreds},
 | ||||
| +#endif
 | ||||
|  #ifdef WITH_OPENSSL | ||||
|      {MONITOR_REQ_MODULI, 0, mm_answer_moduli}, | ||||
|      {MONITOR_REQ_SIGN, 0, mm_answer_sign}, | ||||
|      {MONITOR_REQ_PTY, 0, mm_answer_pty}, | ||||
| @@ -366,6 +375,10 @@ monitor_child_preauth(Authctxt *_authctxt, struct monitor *pmonitor)
 | ||||
|  #endif | ||||
| @@ -380,6 +389,10 @@ monitor_child_preauth(Authctxt *_authctxt, struct monitor *pmonitor)
 | ||||
|  		/* Permit requests for moduli and signatures */ | ||||
|  		monitor_permit(mon_dispatch, MONITOR_REQ_MODULI, 1); | ||||
|  		monitor_permit(mon_dispatch, MONITOR_REQ_SIGN, 1); | ||||
| @ -1771,7 +1748,7 @@ index 229fada..aa70945 100644 | ||||
|  	} else { | ||||
|  		mon_dispatch = mon_dispatch_proto15; | ||||
|   | ||||
| @@ -471,6 +484,10 @@ monitor_child_postauth(struct monitor *pmonitor)
 | ||||
| @@ -488,6 +501,10 @@ monitor_child_postauth(struct monitor *pmonitor)
 | ||||
|  		monitor_permit(mon_dispatch, MONITOR_REQ_MODULI, 1); | ||||
|  		monitor_permit(mon_dispatch, MONITOR_REQ_SIGN, 1); | ||||
|  		monitor_permit(mon_dispatch, MONITOR_REQ_TERM, 1); | ||||
| @ -1782,9 +1759,9 @@ index 229fada..aa70945 100644 | ||||
|  	} else { | ||||
|  		mon_dispatch = mon_dispatch_postauth15; | ||||
|  		monitor_permit(mon_dispatch, MONITOR_REQ_TERM, 1); | ||||
| @@ -1866,6 +1883,13 @@ mm_get_kex(Buffer *m)
 | ||||
|  	kex->kex[KEX_DH_GEX_SHA256] = kexgex_server; | ||||
| @@ -1893,6 +1910,13 @@ mm_get_kex(Buffer *m)
 | ||||
|  	kex->kex[KEX_ECDH_SHA2] = kexecdh_server; | ||||
|  #endif | ||||
|  	kex->kex[KEX_C25519_SHA256] = kexc25519_server; | ||||
| +#ifdef GSSAPI
 | ||||
| +	if (options.gss_keyex) {
 | ||||
| @ -1796,7 +1773,7 @@ index 229fada..aa70945 100644 | ||||
|  	kex->server = 1; | ||||
|  	kex->hostkey_type = buffer_get_int(m); | ||||
|  	kex->kex_type = buffer_get_int(m); | ||||
| @@ -2073,6 +2097,9 @@ mm_answer_gss_setup_ctx(int sock, Buffer *m)
 | ||||
| @@ -2100,6 +2124,9 @@ mm_answer_gss_setup_ctx(int sock, Buffer *m)
 | ||||
|  	OM_uint32 major; | ||||
|  	u_int len; | ||||
|   | ||||
| @ -1806,7 +1783,7 @@ index 229fada..aa70945 100644 | ||||
|  	goid.elements = buffer_get_string(m, &len); | ||||
|  	goid.length = len; | ||||
|   | ||||
| @@ -2100,6 +2127,9 @@ mm_answer_gss_accept_ctx(int sock, Buffer *m)
 | ||||
| @@ -2127,6 +2154,9 @@ mm_answer_gss_accept_ctx(int sock, Buffer *m)
 | ||||
|  	OM_uint32 flags = 0; /* GSI needs this */ | ||||
|  	u_int len; | ||||
|   | ||||
| @ -1816,7 +1793,7 @@ index 229fada..aa70945 100644 | ||||
|  	in.value = buffer_get_string(m, &len); | ||||
|  	in.length = len; | ||||
|  	major = ssh_gssapi_accept_ctx(gsscontext, &in, &out, &flags); | ||||
| @@ -2117,6 +2147,7 @@ mm_answer_gss_accept_ctx(int sock, Buffer *m)
 | ||||
| @@ -2144,6 +2174,7 @@ mm_answer_gss_accept_ctx(int sock, Buffer *m)
 | ||||
|  		monitor_permit(mon_dispatch, MONITOR_REQ_GSSSTEP, 0); | ||||
|  		monitor_permit(mon_dispatch, MONITOR_REQ_GSSUSEROK, 1); | ||||
|  		monitor_permit(mon_dispatch, MONITOR_REQ_GSSCHECKMIC, 1); | ||||
| @ -1824,7 +1801,7 @@ index 229fada..aa70945 100644 | ||||
|  	} | ||||
|  	return (0); | ||||
|  } | ||||
| @@ -2128,6 +2159,9 @@ mm_answer_gss_checkmic(int sock, Buffer *m)
 | ||||
| @@ -2155,6 +2186,9 @@ mm_answer_gss_checkmic(int sock, Buffer *m)
 | ||||
|  	OM_uint32 ret; | ||||
|  	u_int len; | ||||
|   | ||||
| @ -1834,7 +1811,7 @@ index 229fada..aa70945 100644 | ||||
|  	gssbuf.value = buffer_get_string(m, &len); | ||||
|  	gssbuf.length = len; | ||||
|  	mic.value = buffer_get_string(m, &len); | ||||
| @@ -2154,7 +2188,11 @@ mm_answer_gss_userok(int sock, Buffer *m)
 | ||||
| @@ -2181,7 +2215,11 @@ mm_answer_gss_userok(int sock, Buffer *m)
 | ||||
|  { | ||||
|  	int authenticated; | ||||
|   | ||||
| @ -1847,7 +1824,7 @@ index 229fada..aa70945 100644 | ||||
|   | ||||
|  	buffer_clear(m); | ||||
|  	buffer_put_int(m, authenticated); | ||||
| @@ -2167,5 +2205,73 @@ mm_answer_gss_userok(int sock, Buffer *m)
 | ||||
| @@ -2194,5 +2232,73 @@ mm_answer_gss_userok(int sock, Buffer *m)
 | ||||
|  	/* Monitor loop will terminate if authenticated */ | ||||
|  	return (authenticated); | ||||
|  } | ||||
| @ -1935,10 +1912,10 @@ index 20e2b4a..ff79fbb 100644 | ||||
|  	MONITOR_REQ_PAM_START = 100, | ||||
|  	MONITOR_REQ_PAM_ACCOUNT = 102, MONITOR_ANS_PAM_ACCOUNT = 103, | ||||
| diff --git a/monitor_wrap.c b/monitor_wrap.c
 | ||||
| index d1b6d99..d1e1caa 100644
 | ||||
| index 82f114c..7e991e6 100644
 | ||||
| --- a/monitor_wrap.c
 | ||||
| +++ b/monitor_wrap.c
 | ||||
| @@ -1290,7 +1290,7 @@ mm_ssh_gssapi_checkmic(Gssctxt *ctx, gss_buffer_t gssbuf, gss_buffer_t gssmic)
 | ||||
| @@ -1300,7 +1300,7 @@ mm_ssh_gssapi_checkmic(Gssctxt *ctx, gss_buffer_t gssbuf, gss_buffer_t gssmic)
 | ||||
|  } | ||||
|   | ||||
|  int | ||||
| @ -1947,7 +1924,7 @@ index d1b6d99..d1e1caa 100644 | ||||
|  { | ||||
|  	Buffer m; | ||||
|  	int authenticated = 0; | ||||
| @@ -1307,5 +1307,50 @@ mm_ssh_gssapi_userok(char *user)
 | ||||
| @@ -1317,5 +1317,50 @@ mm_ssh_gssapi_userok(char *user)
 | ||||
|  	debug3("%s: user %sauthenticated",__func__, authenticated ? "" : "not "); | ||||
|  	return (authenticated); | ||||
|  } | ||||
| @ -2015,10 +1992,10 @@ index 9d5e5ba..93929e0 100644 | ||||
|   | ||||
|  #ifdef USE_PAM | ||||
| diff --git a/readconf.c b/readconf.c
 | ||||
| index dc884c9..7613ff2 100644
 | ||||
| index 3f5c58b..1c07766 100644
 | ||||
| --- a/readconf.c
 | ||||
| +++ b/readconf.c
 | ||||
| @@ -141,6 +141,8 @@ typedef enum {
 | ||||
| @@ -143,6 +143,8 @@ typedef enum {
 | ||||
|  	oClearAllForwardings, oNoHostAuthenticationForLocalhost, | ||||
|  	oEnableSSHKeysign, oRekeyLimit, oVerifyHostKeyDNS, oConnectTimeout, | ||||
|  	oAddressFamily, oGssAuthentication, oGssDelegateCreds, | ||||
| @ -2027,7 +2004,7 @@ index dc884c9..7613ff2 100644 | ||||
|  	oServerAliveInterval, oServerAliveCountMax, oIdentitiesOnly, | ||||
|  	oSendEnv, oControlPath, oControlMaster, oControlPersist, | ||||
|  	oHashKnownHosts, | ||||
| @@ -183,10 +185,19 @@ static struct {
 | ||||
| @@ -187,10 +189,19 @@ static struct {
 | ||||
|  	{ "afstokenpassing", oUnsupported }, | ||||
|  #if defined(GSSAPI) | ||||
|  	{ "gssapiauthentication", oGssAuthentication }, | ||||
| @ -2047,7 +2024,7 @@ index dc884c9..7613ff2 100644 | ||||
|  #endif | ||||
|  	{ "fallbacktorsh", oDeprecated }, | ||||
|  	{ "usersh", oDeprecated }, | ||||
| @@ -841,10 +852,30 @@ parse_time:
 | ||||
| @@ -868,10 +879,30 @@ parse_time:
 | ||||
|  		intptr = &options->gss_authentication; | ||||
|  		goto parse_flag; | ||||
|   | ||||
| @ -2078,7 +2055,7 @@ index dc884c9..7613ff2 100644 | ||||
|  	case oBatchMode: | ||||
|  		intptr = &options->batch_mode; | ||||
|  		goto parse_flag; | ||||
| @@ -1497,7 +1528,12 @@ initialize_options(Options * options)
 | ||||
| @@ -1553,7 +1584,12 @@ initialize_options(Options * options)
 | ||||
|  	options->pubkey_authentication = -1; | ||||
|  	options->challenge_response_authentication = -1; | ||||
|  	options->gss_authentication = -1; | ||||
| @ -2091,7 +2068,7 @@ index dc884c9..7613ff2 100644 | ||||
|  	options->password_authentication = -1; | ||||
|  	options->kbd_interactive_authentication = -1; | ||||
|  	options->kbd_interactive_devices = NULL; | ||||
| @@ -1616,8 +1652,14 @@ fill_default_options(Options * options)
 | ||||
| @@ -1677,8 +1713,14 @@ fill_default_options(Options * options)
 | ||||
|  		options->challenge_response_authentication = 1; | ||||
|  	if (options->gss_authentication == -1) | ||||
|  		options->gss_authentication = 0; | ||||
| @ -2107,10 +2084,10 @@ index dc884c9..7613ff2 100644 | ||||
|  		options->password_authentication = 1; | ||||
|  	if (options->kbd_interactive_authentication == -1) | ||||
| diff --git a/readconf.h b/readconf.h
 | ||||
| index 75e3f8f..5cc97f0 100644
 | ||||
| index a028306..1dbe509 100644
 | ||||
| --- a/readconf.h
 | ||||
| +++ b/readconf.h
 | ||||
| @@ -54,7 +54,12 @@ typedef struct {
 | ||||
| @@ -45,7 +45,12 @@ typedef struct {
 | ||||
|  	int     challenge_response_authentication; | ||||
|  					/* Try S/Key or TIS, authentication. */ | ||||
|  	int     gss_authentication;	/* Try GSS authentication */ | ||||
| @ -2150,10 +2127,10 @@ index b093a91..4c8da00 100644 | ||||
|  type_has_legacy() { | ||||
|  	case $1 in | ||||
| diff --git a/regress/kextype.sh b/regress/kextype.sh
 | ||||
| index 8c2ac09..a2a87ca 100644
 | ||||
| index 6f952f4..bcb609b 100644
 | ||||
| --- a/regress/kextype.sh
 | ||||
| +++ b/regress/kextype.sh
 | ||||
| @@ -9,6 +9,9 @@ cp $OBJ/ssh_proxy $OBJ/ssh_proxy_bak
 | ||||
| @@ -14,6 +14,9 @@ echo "KexAlgorithms=$KEXOPT" >> $OBJ/sshd_proxy
 | ||||
|   | ||||
|  tries="1 2 3 4" | ||||
|  for k in `${SSH} -Q kex`; do | ||||
| @ -2164,10 +2141,10 @@ index 8c2ac09..a2a87ca 100644 | ||||
|  	for i in $tries; do | ||||
|  		${SSH} -F $OBJ/ssh_proxy -o KexAlgorithms=$k x true | ||||
| diff --git a/regress/rekey.sh b/regress/rekey.sh
 | ||||
| index cf9401e..31fb0f7 100644
 | ||||
| index fd452b0..1148197 100644
 | ||||
| --- a/regress/rekey.sh
 | ||||
| +++ b/regress/rekey.sh
 | ||||
| @@ -30,6 +30,9 @@ increase_datafile_size 300
 | ||||
| @@ -38,6 +38,9 @@ increase_datafile_size 300
 | ||||
|   | ||||
|  opts="" | ||||
|  for i in `${SSH} -Q kex`; do | ||||
| @ -2177,7 +2154,7 @@ index cf9401e..31fb0f7 100644 | ||||
|  	opts="$opts KexAlgorithms=$i" | ||||
|  done | ||||
|  for i in `${SSH} -Q cipher`; do | ||||
| @@ -48,6 +51,9 @@ done
 | ||||
| @@ -56,6 +59,9 @@ done
 | ||||
|  if ${SSH} -Q cipher-auth | grep '^.*$' >/dev/null 2>&1 ; then | ||||
|    for c in `${SSH} -Q cipher-auth`; do | ||||
|      for kex in `${SSH} -Q kex`; do | ||||
| @ -2185,13 +2162,13 @@ index cf9401e..31fb0f7 100644 | ||||
| +		continue
 | ||||
| +	fi
 | ||||
|  	verbose "client rekey $c $kex" | ||||
|  	ssh_data_rekeying -oRekeyLimit=256k -oCiphers=$c -oKexAlgorithms=$kex | ||||
|  	ssh_data_rekeying "KexAlgorithms=$kex" -oRekeyLimit=256k -oCiphers=$c | ||||
|      done | ||||
| diff --git a/servconf.c b/servconf.c
 | ||||
| index f763317..68fb9ef 100644
 | ||||
| index c8a3f28..179c20d 100644
 | ||||
| --- a/servconf.c
 | ||||
| +++ b/servconf.c
 | ||||
| @@ -108,7 +108,10 @@ initialize_server_options(ServerOptions *options)
 | ||||
| @@ -110,7 +110,10 @@ initialize_server_options(ServerOptions *options)
 | ||||
|  	options->kerberos_ticket_cleanup = -1; | ||||
|  	options->kerberos_get_afs_token = -1; | ||||
|  	options->gss_authentication=-1; | ||||
| @ -2202,7 +2179,7 @@ index f763317..68fb9ef 100644 | ||||
|  	options->password_authentication = -1; | ||||
|  	options->kbd_interactive_authentication = -1; | ||||
|  	options->challenge_response_authentication = -1; | ||||
| @@ -245,8 +248,14 @@ fill_default_server_options(ServerOptions *options)
 | ||||
| @@ -253,8 +256,14 @@ fill_default_server_options(ServerOptions *options)
 | ||||
|  		options->kerberos_get_afs_token = 0; | ||||
|  	if (options->gss_authentication == -1) | ||||
|  		options->gss_authentication = 0; | ||||
| @ -2217,7 +2194,7 @@ index f763317..68fb9ef 100644 | ||||
|  	if (options->password_authentication == -1) | ||||
|  		options->password_authentication = 1; | ||||
|  	if (options->kbd_interactive_authentication == -1) | ||||
| @@ -344,7 +353,8 @@ typedef enum {
 | ||||
| @@ -359,7 +368,8 @@ typedef enum {
 | ||||
|  	sBanner, sShowPatchLevel, sUseDNS, sHostbasedAuthentication, | ||||
|  	sHostbasedUsesNameFromPacketOnly, sClientAliveInterval, | ||||
|  	sClientAliveCountMax, sAuthorizedKeysFile, | ||||
| @ -2227,7 +2204,7 @@ index f763317..68fb9ef 100644 | ||||
|  	sMatch, sPermitOpen, sForceCommand, sChrootDirectory, | ||||
|  	sUsePrivilegeSeparation, sAllowAgentForwarding, | ||||
|  	sHostCertificate, | ||||
| @@ -411,10 +421,20 @@ static struct {
 | ||||
| @@ -428,10 +438,20 @@ static struct {
 | ||||
|  #ifdef GSSAPI | ||||
|  	{ "gssapiauthentication", sGssAuthentication, SSHCFG_ALL }, | ||||
|  	{ "gssapicleanupcredentials", sGssCleanupCreds, SSHCFG_GLOBAL }, | ||||
| @ -2248,7 +2225,7 @@ index f763317..68fb9ef 100644 | ||||
|  	{ "passwordauthentication", sPasswordAuthentication, SSHCFG_ALL }, | ||||
|  	{ "kbdinteractiveauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL }, | ||||
|  	{ "challengeresponseauthentication", sChallengeResponseAuthentication, SSHCFG_GLOBAL }, | ||||
| @@ -1091,10 +1111,22 @@ process_server_config_line(ServerOptions *options, char *line,
 | ||||
| @@ -1113,10 +1133,22 @@ process_server_config_line(ServerOptions *options, char *line,
 | ||||
|  		intptr = &options->gss_authentication; | ||||
|  		goto parse_flag; | ||||
|   | ||||
| @ -2271,7 +2248,7 @@ index f763317..68fb9ef 100644 | ||||
|  	case sPasswordAuthentication: | ||||
|  		intptr = &options->password_authentication; | ||||
|  		goto parse_flag; | ||||
| @@ -2005,6 +2037,9 @@ dump_config(ServerOptions *o)
 | ||||
| @@ -2070,6 +2102,9 @@ dump_config(ServerOptions *o)
 | ||||
|  #ifdef GSSAPI | ||||
|  	dump_cfg_fmtint(sGssAuthentication, o->gss_authentication); | ||||
|  	dump_cfg_fmtint(sGssCleanupCreds, o->gss_cleanup_creds); | ||||
| @ -2282,10 +2259,10 @@ index f763317..68fb9ef 100644 | ||||
|  	dump_cfg_fmtint(sPasswordAuthentication, o->password_authentication); | ||||
|  	dump_cfg_fmtint(sKbdInteractiveAuthentication, | ||||
| diff --git a/servconf.h b/servconf.h
 | ||||
| index 4572066..37cfa9b 100644
 | ||||
| index 21719e2..397698b 100644
 | ||||
| --- a/servconf.h
 | ||||
| +++ b/servconf.h
 | ||||
| @@ -112,7 +112,10 @@ typedef struct {
 | ||||
| @@ -113,7 +113,10 @@ typedef struct {
 | ||||
|  	int     kerberos_get_afs_token;		/* If true, try to get AFS token if | ||||
|  						 * authenticated with Kerberos. */ | ||||
|  	int     gss_authentication;	/* If true, permit GSSAPI authentication */ | ||||
| @ -2398,7 +2375,7 @@ index a99d7f0..0374c88 100644 | ||||
|   | ||||
|  #endif /* _SSH_GSS_H */ | ||||
| diff --git a/ssh_config b/ssh_config
 | ||||
| index 6d1abaf..b0d343b 100644
 | ||||
| index 3f83c40..4a0fb82 100644
 | ||||
| --- a/ssh_config
 | ||||
| +++ b/ssh_config
 | ||||
| @@ -26,6 +26,8 @@
 | ||||
| @ -2411,10 +2388,10 @@ index 6d1abaf..b0d343b 100644 | ||||
|  #   CheckHostIP yes | ||||
|  #   AddressFamily any | ||||
| diff --git a/ssh_config.5 b/ssh_config.5
 | ||||
| index b580392..e7accd6 100644
 | ||||
| index f9ede7a..e6649ac 100644
 | ||||
| --- a/ssh_config.5
 | ||||
| +++ b/ssh_config.5
 | ||||
| @@ -682,11 +682,43 @@ Specifies whether user authentication based on GSSAPI is allowed.
 | ||||
| @@ -701,11 +701,43 @@ Specifies whether user authentication based on GSSAPI is allowed.
 | ||||
|  The default is | ||||
|  .Dq no . | ||||
|  Note that this option applies to protocol version 2 only. | ||||
| @ -2460,11 +2437,11 @@ index b580392..e7accd6 100644 | ||||
|  Indicates that | ||||
|  .Xr ssh 1 | ||||
| diff --git a/sshconnect2.c b/sshconnect2.c
 | ||||
| index adbbfc7..cadf234 100644
 | ||||
| index 4724b66..703f8e4 100644
 | ||||
| --- a/sshconnect2.c
 | ||||
| +++ b/sshconnect2.c
 | ||||
| @@ -158,9 +158,34 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
|  { | ||||
| @@ -159,9 +159,34 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
|  	char *myproposal[PROPOSAL_MAX] = { KEX_CLIENT }; | ||||
|  	Kex *kex; | ||||
|   | ||||
| +#ifdef GSSAPI
 | ||||
| @ -2498,9 +2475,9 @@ index adbbfc7..cadf234 100644 | ||||
|  	if (options.ciphers == (char *)-1) { | ||||
|  		logit("No valid ciphers for protocol version 2 given, using defaults."); | ||||
|  		options.ciphers = NULL; | ||||
| @@ -196,6 +221,17 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
|  	if (options.kex_algorithms != NULL) | ||||
|  		myproposal[PROPOSAL_KEX_ALGS] = options.kex_algorithms; | ||||
| @@ -199,6 +224,17 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
|  	myproposal[PROPOSAL_KEX_ALGS] = compat_kex_proposal( | ||||
|  	    myproposal[PROPOSAL_KEX_ALGS]); | ||||
|   | ||||
| +#ifdef GSSAPI
 | ||||
| +	/* If we've got GSSAPI algorithms, then we also support the
 | ||||
| @ -2516,9 +2493,9 @@ index adbbfc7..cadf234 100644 | ||||
|  	if (options.rekey_limit || options.rekey_interval) | ||||
|  		packet_set_rekey_limits((u_int32_t)options.rekey_limit, | ||||
|  		    (time_t)options.rekey_interval); | ||||
| @@ -208,10 +244,30 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
|  	kex->kex[KEX_DH_GEX_SHA256] = kexgex_client; | ||||
| @@ -213,10 +249,30 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
|  	kex->kex[KEX_ECDH_SHA2] = kexecdh_client; | ||||
|  #endif | ||||
|  	kex->kex[KEX_C25519_SHA256] = kexc25519_client; | ||||
| +#ifdef GSSAPI
 | ||||
| +	if (options.gss_keyex) {
 | ||||
| @ -2547,7 +2524,7 @@ index adbbfc7..cadf234 100644 | ||||
|  	xxx_kex = kex; | ||||
|   | ||||
|  	dispatch_run(DISPATCH_BLOCK, &kex->done, kex); | ||||
| @@ -301,6 +357,7 @@ void	input_gssapi_token(int type, u_int32_t, void *);
 | ||||
| @@ -306,6 +362,7 @@ void	input_gssapi_token(int type, u_int32_t, void *);
 | ||||
|  void	input_gssapi_hash(int type, u_int32_t, void *); | ||||
|  void	input_gssapi_error(int, u_int32_t, void *); | ||||
|  void	input_gssapi_errtok(int, u_int32_t, void *); | ||||
| @ -2555,7 +2532,7 @@ index adbbfc7..cadf234 100644 | ||||
|  #endif | ||||
|   | ||||
|  void	userauth(Authctxt *, char *); | ||||
| @@ -316,6 +373,11 @@ static char *authmethods_get(void);
 | ||||
| @@ -321,6 +378,11 @@ static char *authmethods_get(void);
 | ||||
|   | ||||
|  Authmethod authmethods[] = { | ||||
|  #ifdef GSSAPI | ||||
| @ -2567,7 +2544,7 @@ index adbbfc7..cadf234 100644 | ||||
|  	{"gssapi-with-mic", | ||||
|  		userauth_gssapi, | ||||
|  		NULL, | ||||
| @@ -613,19 +675,31 @@ userauth_gssapi(Authctxt *authctxt)
 | ||||
| @@ -617,19 +679,31 @@ userauth_gssapi(Authctxt *authctxt)
 | ||||
|  	static u_int mech = 0; | ||||
|  	OM_uint32 min; | ||||
|  	int ok = 0; | ||||
| @ -2601,7 +2578,7 @@ index adbbfc7..cadf234 100644 | ||||
|  			ok = 1; /* Mechanism works */ | ||||
|  		} else { | ||||
|  			mech++; | ||||
| @@ -722,8 +796,8 @@ input_gssapi_response(int type, u_int32_t plen, void *ctxt)
 | ||||
| @@ -726,8 +800,8 @@ input_gssapi_response(int type, u_int32_t plen, void *ctxt)
 | ||||
|  { | ||||
|  	Authctxt *authctxt = ctxt; | ||||
|  	Gssctxt *gssctxt; | ||||
| @ -2612,7 +2589,7 @@ index adbbfc7..cadf234 100644 | ||||
|   | ||||
|  	if (authctxt == NULL) | ||||
|  		fatal("input_gssapi_response: no authentication context"); | ||||
| @@ -832,6 +906,48 @@ input_gssapi_error(int type, u_int32_t plen, void *ctxt)
 | ||||
| @@ -836,6 +910,48 @@ input_gssapi_error(int type, u_int32_t plen, void *ctxt)
 | ||||
|  	free(msg); | ||||
|  	free(lang); | ||||
|  } | ||||
| @ -2662,21 +2639,10 @@ index adbbfc7..cadf234 100644 | ||||
|   | ||||
|  int | ||||
| diff --git a/sshd.c b/sshd.c
 | ||||
| index 24ab272..e4e406e 100644
 | ||||
| index f7b8aba..2871fe9 100644
 | ||||
| --- a/sshd.c
 | ||||
| +++ b/sshd.c
 | ||||
| @@ -122,6 +122,10 @@
 | ||||
|  #include "ssh-sandbox.h" | ||||
|  #include "version.h" | ||||
|   | ||||
| +#ifdef USE_SECURITY_SESSION_API
 | ||||
| +#include <Security/AuthSession.h>
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #ifdef LIBWRAP | ||||
|  #include <tcpd.h> | ||||
|  #include <syslog.h> | ||||
| @@ -1744,10 +1748,13 @@ main(int ac, char **av)
 | ||||
| @@ -1761,10 +1761,13 @@ main(int ac, char **av)
 | ||||
|  		logit("Disabling protocol version 1. Could not load host key"); | ||||
|  		options.protocol &= ~SSH_PROTO_1; | ||||
|  	} | ||||
| @ -2690,7 +2656,7 @@ index 24ab272..e4e406e 100644 | ||||
|  	if (!(options.protocol & (SSH_PROTO_1|SSH_PROTO_2))) { | ||||
|  		logit("sshd: no hostkeys available -- exiting."); | ||||
|  		exit(1); | ||||
| @@ -2488,6 +2495,48 @@ do_ssh2_kex(void)
 | ||||
| @@ -2501,6 +2504,49 @@ do_ssh2_kex(void)
 | ||||
|  	myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = compat_pkalg_proposal( | ||||
|  	    list_hostkey_types()); | ||||
|   | ||||
| @ -2735,13 +2701,14 @@ index 24ab272..e4e406e 100644 | ||||
| +		fatal("No supported key exchange algorithms");
 | ||||
| +	}
 | ||||
| +#endif
 | ||||
| +
 | ||||
| +
 | ||||
|  	/* start key exchange */ | ||||
|  	kex = kex_setup(myproposal); | ||||
|  	kex->kex[KEX_DH_GRP1_SHA1] = kexdh_server; | ||||
| @@ -2496,6 +2545,13 @@ do_ssh2_kex(void)
 | ||||
|  	kex->kex[KEX_DH_GEX_SHA256] = kexgex_server; | ||||
|  #ifdef WITH_OPENSSL | ||||
| @@ -2511,6 +2557,13 @@ do_ssh2_kex(void)
 | ||||
|  	kex->kex[KEX_ECDH_SHA2] = kexecdh_server; | ||||
|  #endif | ||||
|  	kex->kex[KEX_C25519_SHA256] = kexc25519_server; | ||||
| +#ifdef GSSAPI
 | ||||
| +	if (options.gss_keyex) {
 | ||||
| @ -2754,7 +2721,7 @@ index 24ab272..e4e406e 100644 | ||||
|  	kex->client_version_string=client_version_string; | ||||
|  	kex->server_version_string=server_version_string; | ||||
| diff --git a/sshd_config b/sshd_config
 | ||||
| index c1b7c03..adfd7b1 100644
 | ||||
| index 7061f75..f4796fc 100644
 | ||||
| --- a/sshd_config
 | ||||
| +++ b/sshd_config
 | ||||
| @@ -91,6 +91,8 @@ ChallengeResponseAuthentication no
 | ||||
| @ -2767,10 +2734,10 @@ index c1b7c03..adfd7b1 100644 | ||||
|  # Set this to 'yes' to enable PAM authentication, account processing, | ||||
|  # and session processing. If this is enabled, PAM authentication will | ||||
| diff --git a/sshd_config.5 b/sshd_config.5
 | ||||
| index 95b5f8c..1fb002d 100644
 | ||||
| index cccb310..8ad79d9 100644
 | ||||
| --- a/sshd_config.5
 | ||||
| +++ b/sshd_config.5
 | ||||
| @@ -493,12 +493,40 @@ Specifies whether user authentication based on GSSAPI is allowed.
 | ||||
| @@ -536,12 +536,40 @@ Specifies whether user authentication based on GSSAPI is allowed.
 | ||||
|  The default is | ||||
|  .Dq no . | ||||
|  Note that this option applies to protocol version 2 only. | ||||
|  | ||||
| @ -17,7 +17,7 @@ index 0000000..630ec62 | ||||
| +
 | ||||
| +
 | ||||
| diff --git a/Makefile.in b/Makefile.in
 | ||||
| index 411eadb..4ab6717 100644
 | ||||
| index f02aa1e..b225217 100644
 | ||||
| --- a/Makefile.in
 | ||||
| +++ b/Makefile.in
 | ||||
| @@ -27,6 +27,7 @@ SFTP_SERVER=$(libexecdir)/sftp-server
 | ||||
| @ -28,16 +28,16 @@ index 411eadb..4ab6717 100644 | ||||
|  SSH_PKCS11_HELPER=$(libexecdir)/ssh-pkcs11-helper | ||||
|  PRIVSEP_PATH=@PRIVSEP_PATH@ | ||||
|  SSH_PRIVSEP_USER=@SSH_PRIVSEP_USER@ | ||||
| @@ -64,7 +65,7 @@ EXEEXT=@EXEEXT@
 | ||||
| @@ -65,7 +66,7 @@ EXEEXT=@EXEEXT@
 | ||||
|  MANFMT=@MANFMT@ | ||||
|  INSTALL_SSH_LDAP_HELPER=@INSTALL_SSH_LDAP_HELPER@ | ||||
|   | ||||
| -TARGETS=ssh$(EXEEXT) sshd$(EXEEXT) ssh-add$(EXEEXT) ssh-keygen$(EXEEXT) ssh-keyscan${EXEEXT} ssh-keysign${EXEEXT} ssh-pkcs11-helper$(EXEEXT) ssh-agent$(EXEEXT) scp$(EXEEXT) sftp-server$(EXEEXT) sftp$(EXEEXT) ssh-ldap-helper$(EXEEXT)
 | ||||
| +TARGETS=ssh$(EXEEXT) sshd$(EXEEXT) ssh-add$(EXEEXT) ssh-keygen$(EXEEXT) ssh-keyscan${EXEEXT} ssh-keysign${EXEEXT} ssh-pkcs11-helper$(EXEEXT) ssh-agent$(EXEEXT) scp$(EXEEXT) sftp-server$(EXEEXT) sftp$(EXEEXT) ssh-ldap-helper$(EXEEXT) ssh-keycat$(EXEEXT) 
 | ||||
|   | ||||
|  LIBSSH_OBJS=authfd.o authfile.o bufaux.o bufbn.o buffer.o \ | ||||
|  	canohost.o channels.o cipher.o cipher-aes.o \ | ||||
| @@ -176,6 +177,9 @@ ssh-pkcs11-helper$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-pkcs11-helper.o ssh-pkcs11
 | ||||
|  LIBOPENSSH_OBJS=\ | ||||
|  	ssherr.o \ | ||||
| @@ -186,6 +187,9 @@ ssh-pkcs11-helper$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-pkcs11-helper.o ssh-pkcs11
 | ||||
|  ssh-ldap-helper$(EXEEXT): $(LIBCOMPAT) libssh.a ldapconf.o ldapbody.o ldapmisc.o ldap-helper.o | ||||
|  	$(LD) -o $@ ldapconf.o ldapbody.o ldapmisc.o ldap-helper.o $(LDFLAGS) -lssh -lopenbsd-compat -lfipscheck $(LIBS) | ||||
|   | ||||
| @ -47,7 +47,7 @@ index 411eadb..4ab6717 100644 | ||||
|  ssh-keyscan$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keyscan.o roaming_dummy.o | ||||
|  	$(LD) -o $@ ssh-keyscan.o roaming_dummy.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) | ||||
|   | ||||
| @@ -283,6 +287,7 @@ install-files:
 | ||||
| @@ -305,6 +309,7 @@ install-files:
 | ||||
|  		$(INSTALL) -m 0700 $(STRIP_OPT) ssh-ldap-helper $(DESTDIR)$(SSH_LDAP_HELPER) ; \ | ||||
|  		$(INSTALL) -m 0700 ssh-ldap-wrapper $(DESTDIR)$(SSH_LDAP_WRAPPER) ; \ | ||||
|  	fi | ||||
| @ -56,10 +56,10 @@ index 411eadb..4ab6717 100644 | ||||
|  	$(INSTALL) -m 0755 $(STRIP_OPT) sftp-server$(EXEEXT) $(DESTDIR)$(SFTP_SERVER)$(EXEEXT) | ||||
|  	$(INSTALL) -m 644 ssh.1.out $(DESTDIR)$(mandir)/$(mansubdir)1/ssh.1 | ||||
| diff --git a/auth2-pubkey.c b/auth2-pubkey.c
 | ||||
| index c0ae0d4..cb0f931 100644
 | ||||
| index 12f5afd..269e642 100644
 | ||||
| --- a/auth2-pubkey.c
 | ||||
| +++ b/auth2-pubkey.c
 | ||||
| @@ -600,6 +600,14 @@ user_key_command_allowed2(struct passwd *user_pw, Key *key)
 | ||||
| @@ -602,6 +602,14 @@ user_key_command_allowed2(struct passwd *user_pw, Key *key)
 | ||||
|  			_exit(1); | ||||
|  		} | ||||
|   | ||||
| @ -75,10 +75,10 @@ index c0ae0d4..cb0f931 100644 | ||||
|  		    options.authorized_keys_command, user_pw->pw_name, NULL); | ||||
|   | ||||
| diff --git a/openbsd-compat/port-linux-sshd.c b/openbsd-compat/port-linux-sshd.c
 | ||||
| index d04f4ed..0077dd7 100644
 | ||||
| index 265bd3a..8f32464 100644
 | ||||
| --- a/openbsd-compat/port-linux-sshd.c
 | ||||
| +++ b/openbsd-compat/port-linux-sshd.c
 | ||||
| @@ -53,6 +53,20 @@ extern Authctxt *the_authctxt;
 | ||||
| @@ -54,6 +54,20 @@ extern Authctxt *the_authctxt;
 | ||||
|  extern int inetd_flag; | ||||
|  extern int rexeced_flag; | ||||
|   | ||||
| @ -99,7 +99,7 @@ index d04f4ed..0077dd7 100644 | ||||
|  /* Send audit message */ | ||||
|  static int | ||||
|  sshd_selinux_send_audit_message(int success, security_context_t default_context, | ||||
| @@ -307,7 +321,7 @@ sshd_selinux_getctxbyname(char *pwname,
 | ||||
| @@ -308,7 +322,7 @@ sshd_selinux_getctxbyname(char *pwname,
 | ||||
|   | ||||
|  /* Setup environment variables for pam_selinux */ | ||||
|  static int | ||||
| @ -108,7 +108,7 @@ index d04f4ed..0077dd7 100644 | ||||
|  { | ||||
|  	const char *reqlvl; | ||||
|  	char *role; | ||||
| @@ -318,16 +332,16 @@ sshd_selinux_setup_pam_variables(void)
 | ||||
| @@ -319,16 +333,16 @@ sshd_selinux_setup_pam_variables(void)
 | ||||
|   | ||||
|  	ssh_selinux_get_role_level(&role, &reqlvl); | ||||
|   | ||||
| @ -128,7 +128,7 @@ index d04f4ed..0077dd7 100644 | ||||
|   | ||||
|  	if (role != NULL) | ||||
|  		free(role); | ||||
| @@ -335,6 +349,24 @@ sshd_selinux_setup_pam_variables(void)
 | ||||
| @@ -336,6 +350,24 @@ sshd_selinux_setup_pam_variables(void)
 | ||||
|  	return rv; | ||||
|  } | ||||
|   | ||||
| @ -153,7 +153,7 @@ index d04f4ed..0077dd7 100644 | ||||
|  /* Set the execution context to the default for the specified user */ | ||||
|  void | ||||
|  sshd_selinux_setup_exec_context(char *pwname) | ||||
| @@ -343,7 +375,7 @@ sshd_selinux_setup_exec_context(char *pwname)
 | ||||
| @@ -344,7 +376,7 @@ sshd_selinux_setup_exec_context(char *pwname)
 | ||||
|  	int r = 0; | ||||
|  	security_context_t default_ctx = NULL; | ||||
|   | ||||
| @ -162,7 +162,7 @@ index d04f4ed..0077dd7 100644 | ||||
|  		return; | ||||
|   | ||||
|  	if (options.use_pam) { | ||||
| @@ -414,7 +446,7 @@ sshd_selinux_copy_context(void)
 | ||||
| @@ -415,7 +447,7 @@ sshd_selinux_copy_context(void)
 | ||||
|  { | ||||
|  	security_context_t *ctx; | ||||
|   | ||||
| @ -187,10 +187,10 @@ index b18893c..cb51f99 100644 | ||||
|   | ||||
|  #ifdef LINUX_OOM_ADJUST | ||||
| diff --git a/platform.c b/platform.c
 | ||||
| index 0d39ab2..0dae387 100644
 | ||||
| index 84c47fa..6d876cb 100644
 | ||||
| --- a/platform.c
 | ||||
| +++ b/platform.c
 | ||||
| @@ -102,7 +102,7 @@ platform_setusercontext(struct passwd *pw)
 | ||||
| @@ -103,7 +103,7 @@ platform_setusercontext(struct passwd *pw)
 | ||||
|  { | ||||
|  #ifdef WITH_SELINUX | ||||
|  	/* Cache selinux status for later use */ | ||||
|  | ||||
| @ -1,15 +1,16 @@ | ||||
| diff -up openssh-6.6p1/authfile.c.keyperm openssh-6.6p1/authfile.c
 | ||||
| --- openssh-6.6p1/authfile.c.keyperm	2014-02-04 01:20:15.000000000 +0100
 | ||||
| +++ openssh-6.6p1/authfile.c	2014-05-05 15:20:43.075246776 +0200
 | ||||
| @@ -54,6 +54,7 @@
 | ||||
| diff --git a/authfile.c b/authfile.c
 | ||||
| index e93d867..4fc5b3d 100644
 | ||||
| --- a/authfile.c
 | ||||
| +++ b/authfile.c
 | ||||
| @@ -32,6 +32,7 @@
 | ||||
|   | ||||
|  #include <errno.h> | ||||
|  #include <fcntl.h> | ||||
| +#include <grp.h>
 | ||||
|  #include <stdarg.h> | ||||
|  #include <stdio.h> | ||||
|  #include <stdarg.h> | ||||
|  #include <stdlib.h> | ||||
| @@ -979,6 +980,13 @@ key_perm_ok(int fd, const char *filename
 | ||||
| @@ -207,6 +208,13 @@ sshkey_perm_ok(int fd, const char *filename)
 | ||||
|  #ifdef HAVE_CYGWIN | ||||
|  	if (check_ntsec(filename)) | ||||
|  #endif | ||||
|  | ||||
| @ -1,8 +1,8 @@ | ||||
| diff --git a/auth-krb5.c b/auth-krb5.c
 | ||||
| index 6c62bdf..11c8562 100644
 | ||||
| index 0089b18..8480261 100644
 | ||||
| --- a/auth-krb5.c
 | ||||
| +++ b/auth-krb5.c
 | ||||
| @@ -54,6 +54,21 @@
 | ||||
| @@ -55,6 +55,21 @@
 | ||||
|   | ||||
|  extern ServerOptions	 options; | ||||
|   | ||||
| @ -24,7 +24,7 @@ index 6c62bdf..11c8562 100644 | ||||
|  static int | ||||
|  krb5_init(void *context) | ||||
|  { | ||||
| @@ -157,8 +172,9 @@ auth_krb5_password(Authctxt *authctxt, const char *password)
 | ||||
| @@ -158,8 +173,9 @@ auth_krb5_password(Authctxt *authctxt, const char *password)
 | ||||
|  	if (problem) | ||||
|  		goto out; | ||||
|   | ||||
| @ -37,7 +37,7 @@ index 6c62bdf..11c8562 100644 | ||||
|  		goto out; | ||||
|  	} | ||||
| diff --git a/gss-serv-krb5.c b/gss-serv-krb5.c
 | ||||
| index 60de320..0a4930e 100644
 | ||||
| index 54dd383..961c564 100644
 | ||||
| --- a/gss-serv-krb5.c
 | ||||
| +++ b/gss-serv-krb5.c
 | ||||
| @@ -67,6 +67,7 @@ static int ssh_gssapi_krb5_cmdok(krb5_principal, const char *, const char *,
 | ||||
| @ -175,27 +175,27 @@ index 60de320..0a4930e 100644 | ||||
|  	if ((fp = fopen(file, "r")) == NULL) { | ||||
|  		int saved_errno = errno; | ||||
| diff --git a/servconf.c b/servconf.c
 | ||||
| index 68fb9ef..904c869 100644
 | ||||
| index 179c20d..d17ed04 100644
 | ||||
| --- a/servconf.c
 | ||||
| +++ b/servconf.c
 | ||||
| @@ -157,6 +157,7 @@ initialize_server_options(ServerOptions *options)
 | ||||
|  	options->ip_qos_interactive = -1; | ||||
| @@ -163,6 +163,7 @@ initialize_server_options(ServerOptions *options)
 | ||||
|  	options->ip_qos_bulk = -1; | ||||
|  	options->version_addendum = NULL; | ||||
|  	options->fingerprint_hash = -1; | ||||
| +	options->use_kuserok = -1;
 | ||||
|  } | ||||
|   | ||||
|  void | ||||
| @@ -312,6 +313,8 @@ fill_default_server_options(ServerOptions *options)
 | ||||
|  		options->version_addendum = xstrdup(""); | ||||
|  	if (options->show_patchlevel == -1) | ||||
|  		options->show_patchlevel = 0; | ||||
| @@ -328,6 +329,8 @@ fill_default_server_options(ServerOptions *options)
 | ||||
|  		options->fwd_opts.streamlocal_bind_unlink = 0; | ||||
|  	if (options->fingerprint_hash == -1) | ||||
|  		options->fingerprint_hash = SSH_FP_HASH_DEFAULT; | ||||
| +	if (options->use_kuserok == -1)
 | ||||
| +		options->use_kuserok = 1;
 | ||||
|   | ||||
|  	/* Turn privilege separation on by default */ | ||||
|  	if (use_privsep == -1) | ||||
| @@ -338,7 +341,7 @@ typedef enum {
 | ||||
|  		use_privsep = PRIVSEP_NOSANDBOX; | ||||
| @@ -353,7 +356,7 @@ typedef enum {
 | ||||
|  	sPermitRootLogin, sLogFacility, sLogLevel, | ||||
|  	sRhostsRSAAuthentication, sRSAAuthentication, | ||||
|  	sKerberosAuthentication, sKerberosOrLocalPasswd, sKerberosTicketCleanup, | ||||
| @ -204,7 +204,7 @@ index 68fb9ef..904c869 100644 | ||||
|  	sKerberosTgtPassing, sChallengeResponseAuthentication, | ||||
|  	sPasswordAuthentication, sKbdInteractiveAuthentication, | ||||
|  	sListenAddress, sAddressFamily, | ||||
| @@ -410,11 +413,13 @@ static struct {
 | ||||
| @@ -427,11 +430,13 @@ static struct {
 | ||||
|  #else | ||||
|  	{ "kerberosgetafstoken", sUnsupported, SSHCFG_GLOBAL }, | ||||
|  #endif | ||||
| @ -218,7 +218,7 @@ index 68fb9ef..904c869 100644 | ||||
|  #endif | ||||
|  	{ "kerberostgtpassing", sUnsupported, SSHCFG_GLOBAL }, | ||||
|  	{ "afstokenpassing", sUnsupported, SSHCFG_GLOBAL }, | ||||
| @@ -1526,6 +1531,10 @@ process_server_config_line(ServerOptions *options, char *line,
 | ||||
| @@ -1557,6 +1562,10 @@ process_server_config_line(ServerOptions *options, char *line,
 | ||||
|  		*activep = value; | ||||
|  		break; | ||||
|   | ||||
| @ -229,7 +229,7 @@ index 68fb9ef..904c869 100644 | ||||
|  	case sPermitOpen: | ||||
|  		arg = strdelim(&cp); | ||||
|  		if (!arg || *arg == '\0') | ||||
| @@ -1811,6 +1820,7 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
 | ||||
| @@ -1872,6 +1881,7 @@ copy_set_server_options(ServerOptions *dst, ServerOptions *src, int preauth)
 | ||||
|  	M_CP_INTOPT(max_authtries); | ||||
|  	M_CP_INTOPT(ip_qos_interactive); | ||||
|  	M_CP_INTOPT(ip_qos_bulk); | ||||
| @ -237,19 +237,19 @@ index 68fb9ef..904c869 100644 | ||||
|  	M_CP_INTOPT(rekey_limit); | ||||
|  	M_CP_INTOPT(rekey_interval); | ||||
|   | ||||
| @@ -2062,6 +2072,7 @@ dump_config(ServerOptions *o)
 | ||||
|  	dump_cfg_fmtint(sUseDNS, o->use_dns); | ||||
|  	dump_cfg_fmtint(sAllowTcpForwarding, o->allow_tcp_forwarding); | ||||
| @@ -2130,6 +2140,7 @@ dump_config(ServerOptions *o)
 | ||||
|  	dump_cfg_fmtint(sAllowStreamLocalForwarding, o->allow_streamlocal_forwarding); | ||||
|  	dump_cfg_fmtint(sUsePrivilegeSeparation, use_privsep); | ||||
|  	dump_cfg_fmtint(sFingerprintHash, o->fingerprint_hash); | ||||
| +	dump_cfg_fmtint(sKerberosUseKuserok, o->use_kuserok);
 | ||||
|   | ||||
|  	/* string arguments */ | ||||
|  	dump_cfg_string(sPidFile, o->pid_file); | ||||
| diff --git a/servconf.h b/servconf.h
 | ||||
| index 37cfa9b..5117dfa 100644
 | ||||
| index 397698b..cf2a505 100644
 | ||||
| --- a/servconf.h
 | ||||
| +++ b/servconf.h
 | ||||
| @@ -173,6 +173,7 @@ typedef struct {
 | ||||
| @@ -175,6 +175,7 @@ typedef struct {
 | ||||
|   | ||||
|  	int	num_permitted_opens; | ||||
|   | ||||
| @ -258,7 +258,7 @@ index 37cfa9b..5117dfa 100644 | ||||
|  	char   *revoked_keys_file; | ||||
|  	char   *trusted_user_ca_keys; | ||||
| diff --git a/sshd_config b/sshd_config
 | ||||
| index adfd7b1..e772ed5 100644
 | ||||
| index f4796fc..0d9454d 100644
 | ||||
| --- a/sshd_config
 | ||||
| +++ b/sshd_config
 | ||||
| @@ -87,6 +87,7 @@ ChallengeResponseAuthentication no
 | ||||
| @ -270,10 +270,10 @@ index adfd7b1..e772ed5 100644 | ||||
|  # GSSAPI options | ||||
|  GSSAPIAuthentication yes | ||||
| diff --git a/sshd_config.5 b/sshd_config.5
 | ||||
| index 1fb002d..e0e5fff 100644
 | ||||
| index 8ad79d9..eb4dd9e 100644
 | ||||
| --- a/sshd_config.5
 | ||||
| +++ b/sshd_config.5
 | ||||
| @@ -697,6 +697,10 @@ Specifies whether to automatically destroy the user's ticket cache
 | ||||
| @@ -740,6 +740,10 @@ Specifies whether to automatically destroy the user's ticket cache
 | ||||
|  file on logout. | ||||
|  The default is | ||||
|  .Dq yes . | ||||
| @ -284,7 +284,7 @@ index 1fb002d..e0e5fff 100644 | ||||
|  .It Cm KexAlgorithms | ||||
|  Specifies the available KEX (Key Exchange) algorithms. | ||||
|  Multiple algorithms must be comma-separated. | ||||
| @@ -862,6 +866,7 @@ Available keywords are
 | ||||
| @@ -961,6 +965,7 @@ Available keywords are
 | ||||
|  .Cm HostbasedUsesNameFromPacketOnly , | ||||
|  .Cm KbdInteractiveAuthentication , | ||||
|  .Cm KerberosAuthentication , | ||||
|  | ||||
| @ -25,7 +25,7 @@ index a1a2b52..b109a5a 100644 | ||||
|  char ** fetch_pam_child_environment(void); | ||||
|  void free_pam_environment(char **); | ||||
| diff --git a/auth.h b/auth.h
 | ||||
| index 124e597..4605588 100644
 | ||||
| index d081c94..847cffd 100644
 | ||||
| --- a/auth.h
 | ||||
| +++ b/auth.h
 | ||||
| @@ -59,6 +59,9 @@ struct Authctxt {
 | ||||
| @ -39,10 +39,10 @@ index 124e597..4605588 100644 | ||||
|  	char		*info;		/* Extra info for next auth_log */ | ||||
|  #ifdef BSD_AUTH | ||||
| diff --git a/auth1.c b/auth1.c
 | ||||
| index 0f870b3..df040bb 100644
 | ||||
| index 5038828..f0a98d2 100644
 | ||||
| --- a/auth1.c
 | ||||
| +++ b/auth1.c
 | ||||
| @@ -381,6 +381,9 @@ do_authentication(Authctxt *authctxt)
 | ||||
| @@ -382,6 +382,9 @@ do_authentication(Authctxt *authctxt)
 | ||||
|  { | ||||
|  	u_int ulen; | ||||
|  	char *user, *style = NULL; | ||||
| @ -52,7 +52,7 @@ index 0f870b3..df040bb 100644 | ||||
|   | ||||
|  	/* Get the name of the user that we wish to log in as. */ | ||||
|  	packet_read_expect(SSH_CMSG_USER); | ||||
| @@ -389,11 +392,24 @@ do_authentication(Authctxt *authctxt)
 | ||||
| @@ -390,11 +393,24 @@ do_authentication(Authctxt *authctxt)
 | ||||
|  	user = packet_get_cstring(&ulen); | ||||
|  	packet_check_eom(); | ||||
|   | ||||
| @ -78,10 +78,10 @@ index 0f870b3..df040bb 100644 | ||||
|  	/* Verify that the user is a valid user. */ | ||||
|  	if ((authctxt->pw = PRIVSEP(getpwnamallow(user))) != NULL) | ||||
| diff --git a/auth2-gss.c b/auth2-gss.c
 | ||||
| index c28a705..4756dd7 100644
 | ||||
| index 447f896..4803e7e 100644
 | ||||
| --- a/auth2-gss.c
 | ||||
| +++ b/auth2-gss.c
 | ||||
| @@ -251,6 +251,7 @@ input_gssapi_mic(int type, u_int32_t plen, void *ctxt)
 | ||||
| @@ -252,6 +252,7 @@ input_gssapi_mic(int type, u_int32_t plen, void *ctxt)
 | ||||
|  	Authctxt *authctxt = ctxt; | ||||
|  	Gssctxt *gssctxt; | ||||
|  	int authenticated = 0; | ||||
| @ -89,7 +89,7 @@ index c28a705..4756dd7 100644 | ||||
|  	Buffer b; | ||||
|  	gss_buffer_desc mic, gssbuf; | ||||
|  	u_int len; | ||||
| @@ -263,7 +264,13 @@ input_gssapi_mic(int type, u_int32_t plen, void *ctxt)
 | ||||
| @@ -264,7 +265,13 @@ input_gssapi_mic(int type, u_int32_t plen, void *ctxt)
 | ||||
|  	mic.value = packet_get_string(&len); | ||||
|  	mic.length = len; | ||||
|   | ||||
| @ -104,7 +104,7 @@ index c28a705..4756dd7 100644 | ||||
|  	    "gssapi-with-mic"); | ||||
|   | ||||
|  	gssbuf.value = buffer_ptr(&b); | ||||
| @@ -275,6 +282,8 @@ input_gssapi_mic(int type, u_int32_t plen, void *ctxt)
 | ||||
| @@ -276,6 +283,8 @@ input_gssapi_mic(int type, u_int32_t plen, void *ctxt)
 | ||||
|  		logit("GSSAPI MIC check failed"); | ||||
|   | ||||
|  	buffer_free(&b); | ||||
| @ -114,10 +114,10 @@ index c28a705..4756dd7 100644 | ||||
|   | ||||
|  	authctxt->postponed = 0; | ||||
| diff --git a/auth2-hostbased.c b/auth2-hostbased.c
 | ||||
| index eca0069..95d678e 100644
 | ||||
| index b7ae353..41f1a3f 100644
 | ||||
| --- a/auth2-hostbased.c
 | ||||
| +++ b/auth2-hostbased.c
 | ||||
| @@ -112,7 +112,15 @@ userauth_hostbased(Authctxt *authctxt)
 | ||||
| @@ -113,7 +113,15 @@ userauth_hostbased(Authctxt *authctxt)
 | ||||
|  	buffer_put_string(&b, session_id2, session_id2_len); | ||||
|  	/* reconstruct packet */ | ||||
|  	buffer_put_char(&b, SSH2_MSG_USERAUTH_REQUEST); | ||||
| @ -135,7 +135,7 @@ index eca0069..95d678e 100644 | ||||
|  	buffer_put_cstring(&b, "hostbased"); | ||||
|  	buffer_put_string(&b, pkalg, alen); | ||||
| diff --git a/auth2-pubkey.c b/auth2-pubkey.c
 | ||||
| index 749b11a..c0ae0d4 100644
 | ||||
| index 3f4f789..12f5afd 100644
 | ||||
| --- a/auth2-pubkey.c
 | ||||
| +++ b/auth2-pubkey.c
 | ||||
| @@ -133,9 +133,11 @@ userauth_pubkey(Authctxt *authctxt)
 | ||||
| @ -153,10 +153,10 @@ index 749b11a..c0ae0d4 100644 | ||||
|  		free(userstyle); | ||||
|  		buffer_put_cstring(&b, | ||||
| diff --git a/auth2.c b/auth2.c
 | ||||
| index a5490c0..5f4f26f 100644
 | ||||
| index d9b440a..d6fbc93 100644
 | ||||
| --- a/auth2.c
 | ||||
| +++ b/auth2.c
 | ||||
| @@ -215,6 +215,9 @@ input_userauth_request(int type, u_int32_t seq, void *ctxt)
 | ||||
| @@ -216,6 +216,9 @@ input_userauth_request(int type, u_int32_t seq, void *ctxt)
 | ||||
|  	Authctxt *authctxt = ctxt; | ||||
|  	Authmethod *m = NULL; | ||||
|  	char *user, *service, *method, *style = NULL; | ||||
| @ -166,7 +166,7 @@ index a5490c0..5f4f26f 100644 | ||||
|  	int authenticated = 0; | ||||
|   | ||||
|  	if (authctxt == NULL) | ||||
| @@ -226,6 +229,11 @@ input_userauth_request(int type, u_int32_t seq, void *ctxt)
 | ||||
| @@ -227,6 +230,11 @@ input_userauth_request(int type, u_int32_t seq, void *ctxt)
 | ||||
|  	debug("userauth-request for user %s service %s method %s", user, service, method); | ||||
|  	debug("attempt %d failures %d", authctxt->attempt, authctxt->failures); | ||||
|   | ||||
| @ -178,7 +178,7 @@ index a5490c0..5f4f26f 100644 | ||||
|  	if ((style = strchr(user, ':')) != NULL) | ||||
|  		*style++ = 0; | ||||
|   | ||||
| @@ -251,8 +259,15 @@ input_userauth_request(int type, u_int32_t seq, void *ctxt)
 | ||||
| @@ -252,8 +260,15 @@ input_userauth_request(int type, u_int32_t seq, void *ctxt)
 | ||||
|  		    use_privsep ? " [net]" : ""); | ||||
|  		authctxt->service = xstrdup(service); | ||||
|  		authctxt->style = style ? xstrdup(style) : NULL; | ||||
| @ -196,10 +196,10 @@ index a5490c0..5f4f26f 100644 | ||||
|  		if (auth2_setup_methods_lists(authctxt) != 0) | ||||
|  			packet_disconnect("no authentication methods enabled"); | ||||
| diff --git a/misc.c b/misc.c
 | ||||
| index e4c8c32..f31cd91 100644
 | ||||
| index 94b05b0..651c21b 100644
 | ||||
| --- a/misc.c
 | ||||
| +++ b/misc.c
 | ||||
| @@ -430,6 +430,7 @@ char *
 | ||||
| @@ -431,6 +431,7 @@ char *
 | ||||
|  colon(char *cp) | ||||
|  { | ||||
|  	int flag = 0; | ||||
| @ -207,7 +207,7 @@ index e4c8c32..f31cd91 100644 | ||||
|   | ||||
|  	if (*cp == ':')		/* Leading colon is part of file name. */ | ||||
|  		return NULL; | ||||
| @@ -445,6 +446,13 @@ colon(char *cp)
 | ||||
| @@ -446,6 +447,13 @@ colon(char *cp)
 | ||||
|  			return (cp); | ||||
|  		if (*cp == '/') | ||||
|  			return NULL; | ||||
| @ -222,10 +222,10 @@ index e4c8c32..f31cd91 100644 | ||||
|  	return NULL; | ||||
|  } | ||||
| diff --git a/monitor.c b/monitor.c
 | ||||
| index 531c4f9..229fada 100644
 | ||||
| index dbe29f1..d3f87e1 100644
 | ||||
| --- a/monitor.c
 | ||||
| +++ b/monitor.c
 | ||||
| @@ -145,6 +145,9 @@ int mm_answer_sign(int, Buffer *);
 | ||||
| @@ -148,6 +148,9 @@ int mm_answer_sign(int, Buffer *);
 | ||||
|  int mm_answer_pwnamallow(int, Buffer *); | ||||
|  int mm_answer_auth2_read_banner(int, Buffer *); | ||||
|  int mm_answer_authserv(int, Buffer *); | ||||
| @ -235,7 +235,7 @@ index 531c4f9..229fada 100644 | ||||
|  int mm_answer_authpassword(int, Buffer *); | ||||
|  int mm_answer_bsdauthquery(int, Buffer *); | ||||
|  int mm_answer_bsdauthrespond(int, Buffer *); | ||||
| @@ -219,6 +222,9 @@ struct mon_table mon_dispatch_proto20[] = {
 | ||||
| @@ -227,6 +230,9 @@ struct mon_table mon_dispatch_proto20[] = {
 | ||||
|      {MONITOR_REQ_SIGN, MON_ONCE, mm_answer_sign}, | ||||
|      {MONITOR_REQ_PWNAM, MON_ONCE, mm_answer_pwnamallow}, | ||||
|      {MONITOR_REQ_AUTHSERV, MON_ONCE, mm_answer_authserv}, | ||||
| @ -245,7 +245,7 @@ index 531c4f9..229fada 100644 | ||||
|      {MONITOR_REQ_AUTH2_READ_BANNER, MON_ONCE, mm_answer_auth2_read_banner}, | ||||
|      {MONITOR_REQ_AUTHPASSWORD, MON_AUTH, mm_answer_authpassword}, | ||||
|  #ifdef USE_PAM | ||||
| @@ -805,6 +811,9 @@ mm_answer_pwnamallow(int sock, Buffer *m)
 | ||||
| @@ -824,6 +830,9 @@ mm_answer_pwnamallow(int sock, Buffer *m)
 | ||||
|  	else { | ||||
|  		/* Allow service/style information on the auth context */ | ||||
|  		monitor_permit(mon_dispatch, MONITOR_REQ_AUTHSERV, 1); | ||||
| @ -255,7 +255,7 @@ index 531c4f9..229fada 100644 | ||||
|  		monitor_permit(mon_dispatch, MONITOR_REQ_AUTH2_READ_BANNER, 1); | ||||
|  	} | ||||
|  #ifdef USE_PAM | ||||
| @@ -846,6 +855,25 @@ mm_answer_authserv(int sock, Buffer *m)
 | ||||
| @@ -865,6 +874,25 @@ mm_answer_authserv(int sock, Buffer *m)
 | ||||
|  	return (0); | ||||
|  } | ||||
|   | ||||
| @ -281,7 +281,7 @@ index 531c4f9..229fada 100644 | ||||
|  int | ||||
|  mm_answer_authpassword(int sock, Buffer *m) | ||||
|  { | ||||
| @@ -1220,7 +1248,7 @@ static int
 | ||||
| @@ -1241,7 +1269,7 @@ static int
 | ||||
|  monitor_valid_userblob(u_char *data, u_int datalen) | ||||
|  { | ||||
|  	Buffer b; | ||||
| @ -290,7 +290,7 @@ index 531c4f9..229fada 100644 | ||||
|  	u_int len; | ||||
|  	int fail = 0; | ||||
|   | ||||
| @@ -1246,6 +1274,8 @@ monitor_valid_userblob(u_char *data, u_int datalen)
 | ||||
| @@ -1267,6 +1295,8 @@ monitor_valid_userblob(u_char *data, u_int datalen)
 | ||||
|  	if (buffer_get_char(&b) != SSH2_MSG_USERAUTH_REQUEST) | ||||
|  		fail++; | ||||
|  	p = buffer_get_cstring(&b, NULL); | ||||
| @ -299,7 +299,7 @@ index 531c4f9..229fada 100644 | ||||
|  	xasprintf(&userstyle, "%s%s%s", authctxt->user, | ||||
|  	    authctxt->style ? ":" : "", | ||||
|  	    authctxt->style ? authctxt->style : ""); | ||||
| @@ -1281,7 +1311,7 @@ monitor_valid_hostbasedblob(u_char *data, u_int datalen, char *cuser,
 | ||||
| @@ -1302,7 +1332,7 @@ monitor_valid_hostbasedblob(u_char *data, u_int datalen, char *cuser,
 | ||||
|      char *chost) | ||||
|  { | ||||
|  	Buffer b; | ||||
| @ -308,7 +308,7 @@ index 531c4f9..229fada 100644 | ||||
|  	u_int len; | ||||
|  	int fail = 0; | ||||
|   | ||||
| @@ -1298,6 +1328,8 @@ monitor_valid_hostbasedblob(u_char *data, u_int datalen, char *cuser,
 | ||||
| @@ -1319,6 +1349,8 @@ monitor_valid_hostbasedblob(u_char *data, u_int datalen, char *cuser,
 | ||||
|  	if (buffer_get_char(&b) != SSH2_MSG_USERAUTH_REQUEST) | ||||
|  		fail++; | ||||
|  	p = buffer_get_cstring(&b, NULL); | ||||
| @ -333,10 +333,10 @@ index 5bc41b5..20e2b4a 100644 | ||||
|  	MONITOR_REQ_PAM_ACCOUNT = 102, MONITOR_ANS_PAM_ACCOUNT = 103, | ||||
|  	MONITOR_REQ_PAM_INIT_CTX = 104, MONITOR_ANS_PAM_INIT_CTX = 105, | ||||
| diff --git a/monitor_wrap.c b/monitor_wrap.c
 | ||||
| index 1a47e41..d1b6d99 100644
 | ||||
| index 45dc169..82f114c 100644
 | ||||
| --- a/monitor_wrap.c
 | ||||
| +++ b/monitor_wrap.c
 | ||||
| @@ -336,6 +336,25 @@ mm_inform_authserv(char *service, char *style)
 | ||||
| @@ -342,6 +342,25 @@ mm_inform_authserv(char *service, char *style)
 | ||||
|  	buffer_free(&m); | ||||
|  } | ||||
|   | ||||
| @ -377,12 +377,12 @@ index 18c2501..9d5e5ba 100644 | ||||
|  char *mm_auth2_read_banner(void); | ||||
|  int mm_auth_password(struct Authctxt *, char *); | ||||
| diff --git a/openbsd-compat/Makefile.in b/openbsd-compat/Makefile.in
 | ||||
| index 6ecfb93..b912dbe 100644
 | ||||
| index ab1a3e3..843225d 100644
 | ||||
| --- a/openbsd-compat/Makefile.in
 | ||||
| +++ b/openbsd-compat/Makefile.in
 | ||||
| @@ -20,7 +20,7 @@ OPENBSD=base64.o basename.o bcrypt_pbkdf.o bindresvport.o blowfish.o daemon.o di
 | ||||
|   | ||||
|  COMPAT=arc4random.o bsd-asprintf.o bsd-closefrom.o bsd-cray.o bsd-cygwin_util.o bsd-getpeereid.o getrrsetbyname-ldns.o bsd-misc.o bsd-nextstep.o bsd-openpty.o bsd-poll.o bsd-setres_id.o bsd-snprintf.o bsd-statvfs.o bsd-waitpid.o fake-rfc2553.o openssl-compat.o xmmap.o xcrypt.o | ||||
|  COMPAT=arc4random.o bsd-asprintf.o bsd-closefrom.o bsd-cray.o bsd-cygwin_util.o bsd-getpeereid.o getrrsetbyname-ldns.o bsd-misc.o bsd-nextstep.o bsd-openpty.o bsd-poll.o bsd-setres_id.o bsd-snprintf.o bsd-statvfs.o bsd-waitpid.o fake-rfc2553.o openssl-compat.o xmmap.o xcrypt.o kludge-fd_set.o | ||||
|   | ||||
| -PORTS=port-aix.o port-irix.o port-linux.o port-solaris.o port-tun.o port-uw.o
 | ||||
| +PORTS=port-aix.o port-irix.o port-linux.o port-linux-sshd.o port-solaris.o port-tun.o port-uw.o
 | ||||
| @ -391,10 +391,10 @@ index 6ecfb93..b912dbe 100644 | ||||
|  	$(CC) $(CFLAGS) $(CPPFLAGS) -c $< | ||||
| diff --git a/openbsd-compat/port-linux-sshd.c b/openbsd-compat/port-linux-sshd.c
 | ||||
| new file mode 100644 | ||||
| index 0000000..c18524e
 | ||||
| index 0000000..6310717
 | ||||
| --- /dev/null
 | ||||
| +++ b/openbsd-compat/port-linux-sshd.c
 | ||||
| @@ -0,0 +1,414 @@
 | ||||
| @@ -0,0 +1,415 @@
 | ||||
| +/*
 | ||||
| + * Copyright (c) 2005 Daniel Walsh <dwalsh@redhat.com>
 | ||||
| + * Copyright (c) 2014 Petr Lautrbach <plautrba@redhat.com>
 | ||||
| @ -426,6 +426,7 @@ index 0000000..c18524e | ||||
| +
 | ||||
| +#include "log.h"
 | ||||
| +#include "xmalloc.h"
 | ||||
| +#include "misc.h"      /* servconf.h needs misc.h for struct ForwardOptions */
 | ||||
| +#include "servconf.h"
 | ||||
| +#include "port-linux.h"
 | ||||
| +#include "key.h"
 | ||||
| @ -868,10 +869,10 @@ index e3d1004..8ef6cc4 100644 | ||||
|   | ||||
|  #ifdef LINUX_OOM_ADJUST | ||||
| diff --git a/platform.c b/platform.c
 | ||||
| index 30fc609..0d39ab2 100644
 | ||||
| index ee313da..84c47fa 100644
 | ||||
| --- a/platform.c
 | ||||
| +++ b/platform.c
 | ||||
| @@ -183,7 +183,7 @@ platform_setusercontext_post_groups(struct passwd *pw)
 | ||||
| @@ -184,7 +184,7 @@ platform_setusercontext_post_groups(struct passwd *pw)
 | ||||
|  	} | ||||
|  #endif /* HAVE_SETPCRED */ | ||||
|  #ifdef WITH_SELINUX | ||||
| @ -881,10 +882,10 @@ index 30fc609..0d39ab2 100644 | ||||
|  } | ||||
|   | ||||
| diff --git a/sshd.c b/sshd.c
 | ||||
| index 7523de9..07f9926 100644
 | ||||
| index 481d001..41b317b 100644
 | ||||
| --- a/sshd.c
 | ||||
| +++ b/sshd.c
 | ||||
| @@ -2138,6 +2138,9 @@ main(int ac, char **av)
 | ||||
| @@ -2144,6 +2144,9 @@ main(int ac, char **av)
 | ||||
|  		restore_uid(); | ||||
|  	} | ||||
|  #endif | ||||
|  | ||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @ -1,8 +1,8 @@ | ||||
| diff --git a/Makefile.in b/Makefile.in
 | ||||
| index 3bb7f00..294bef5 100644
 | ||||
| index 9311e16..1eb2b45 100644
 | ||||
| --- a/Makefile.in
 | ||||
| +++ b/Makefile.in
 | ||||
| @@ -154,25 +154,25 @@ libssh.a: $(LIBSSH_OBJS)
 | ||||
| @@ -164,25 +164,25 @@ libssh.a: $(LIBSSH_OBJS)
 | ||||
|  	$(RANLIB) $@ | ||||
|   | ||||
|  ssh$(EXEEXT): $(LIBCOMPAT) libssh.a $(SSHOBJS) | ||||
| @ -34,7 +34,7 @@ index 3bb7f00..294bef5 100644 | ||||
|   | ||||
|  ssh-pkcs11-helper$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-pkcs11-helper.o ssh-pkcs11.o | ||||
|  	$(LD) -o $@ ssh-pkcs11-helper.o ssh-pkcs11.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) | ||||
| @@ -187,7 +187,7 @@ ctr-cavstest$(EXEEXT): $(LIBCOMPAT) libssh.a ctr-cavstest.o
 | ||||
| @@ -197,7 +197,7 @@ ctr-cavstest$(EXEEXT): $(LIBCOMPAT) libssh.a ctr-cavstest.o
 | ||||
|  	$(LD) -o $@ ctr-cavstest.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lfipscheck $(LIBS) | ||||
|   | ||||
|  ssh-keyscan$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keyscan.o roaming_dummy.o | ||||
| @ -43,77 +43,6 @@ index 3bb7f00..294bef5 100644 | ||||
|   | ||||
|  sftp-server$(EXEEXT): $(LIBCOMPAT) libssh.a sftp.o sftp-common.o sftp-server.o sftp-server-main.o | ||||
|  	$(LD) -o $@ sftp-server.o sftp-common.o sftp-server-main.o $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) | ||||
| diff --git a/auth-rsa.c b/auth-rsa.c
 | ||||
| index f225b0b..8bafcd6 100644
 | ||||
| --- a/auth-rsa.c
 | ||||
| +++ b/auth-rsa.c
 | ||||
| @@ -244,7 +244,7 @@ rsa_key_allowed_in_file(struct passwd *pw, char *file,
 | ||||
|  			    "actual %d vs. announced %d.", | ||||
|  			    file, linenum, BN_num_bits(key->rsa->n), bits); | ||||
|   | ||||
| -		fp = key_fingerprint(key, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| +		fp = key_selected_fingerprint(key, SSH_FP_HEX);
 | ||||
|  		debug("matching key found: file %s, line %lu %s %s", | ||||
|  		    file, linenum, key_type(key), fp); | ||||
|  		free(fp); | ||||
| diff --git a/auth2-pubkey.c b/auth2-pubkey.c
 | ||||
| index 6d1c872..3808ec8 100644
 | ||||
| --- a/auth2-pubkey.c
 | ||||
| +++ b/auth2-pubkey.c
 | ||||
| @@ -214,8 +214,7 @@ pubkey_auth_info(Authctxt *authctxt, const Key *key, const char *fmt, ...)
 | ||||
|  	} | ||||
|   | ||||
|  	if (key_is_cert(key)) { | ||||
| -		fp = key_fingerprint(key->cert->signature_key,
 | ||||
| -		    SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| +		fp = key_selected_fingerprint(key->cert->signature_key, SSH_FP_HEX);
 | ||||
|  		auth_info(authctxt, "%s ID %s (serial %llu) CA %s %s%s%s",  | ||||
|  		    key_type(key), key->cert->key_id, | ||||
|  		    (unsigned long long)key->cert->serial, | ||||
| @@ -223,7 +222,7 @@ pubkey_auth_info(Authctxt *authctxt, const Key *key, const char *fmt, ...)
 | ||||
|  		    extra == NULL ? "" : ", ", extra == NULL ? "" : extra); | ||||
|  		free(fp); | ||||
|  	} else { | ||||
| -		fp = key_fingerprint(key, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| +		fp = key_selected_fingerprint(key, SSH_FP_HEX);
 | ||||
|  		auth_info(authctxt, "%s %s%s%s", key_type(key), fp, | ||||
|  		    extra == NULL ? "" : ", ", extra == NULL ? "" : extra); | ||||
|  		free(fp); | ||||
| diff --git a/authfile.c b/authfile.c
 | ||||
| index ec4f4ff..2b3d650 100644
 | ||||
| --- a/authfile.c
 | ||||
| +++ b/authfile.c
 | ||||
| @@ -46,6 +46,7 @@
 | ||||
|  #include <openssl/err.h> | ||||
|  #include <openssl/evp.h> | ||||
|  #include <openssl/pem.h> | ||||
| +#include <openssl/fips.h>
 | ||||
|   | ||||
|  /* compatibility with old or broken OpenSSL versions */ | ||||
|  #include "openbsd-compat/openssl-compat.h" | ||||
| @@ -1068,7 +1069,7 @@ Key *
 | ||||
|  key_parse_private(Buffer *buffer, const char *filename, | ||||
|      const char *passphrase, char **commentp) | ||||
|  { | ||||
| -	Key *pub, *prv;
 | ||||
| +	Key *pub, *prv = NULL;
 | ||||
|   | ||||
|  	/* it's a SSH v1 key if the public key part is readable */ | ||||
|  	pub = key_parse_public_rsa1(buffer, commentp); | ||||
| @@ -1080,9 +1081,10 @@ key_parse_private(Buffer *buffer, const char *filename,
 | ||||
|  			*commentp = xstrdup(filename); | ||||
|  	} else { | ||||
|  		key_free(pub); | ||||
| -		/* key_parse_public_rsa1() has already loaded the comment */
 | ||||
| -		prv = key_parse_private_type(buffer, KEY_RSA1, passphrase,
 | ||||
| -		    NULL);
 | ||||
| +		if (! FIPS_mode())
 | ||||
| +			/* key_parse_public_rsa1() has already loaded the comment */
 | ||||
| +			prv = key_parse_private_type(buffer, KEY_RSA1, passphrase,
 | ||||
| +			    NULL);
 | ||||
|  	} | ||||
|  	return prv; | ||||
|  } | ||||
| diff --git a/cipher-ctr.c b/cipher-ctr.c
 | ||||
| index 73e9c7c..40ee395 100644
 | ||||
| --- a/cipher-ctr.c
 | ||||
| @ -129,7 +58,7 @@ index 73e9c7c..40ee395 100644 | ||||
|  	return (&aes_ctr); | ||||
|  } | ||||
| diff --git a/cipher.c b/cipher.c
 | ||||
| index 226e56d..b19443c 100644
 | ||||
| index 9cc7cf8..5ebfa84 100644
 | ||||
| --- a/cipher.c
 | ||||
| +++ b/cipher.c
 | ||||
| @@ -39,6 +39,8 @@
 | ||||
| @ -141,11 +70,11 @@ index 226e56d..b19443c 100644 | ||||
|  #include <string.h> | ||||
|  #include <stdarg.h> | ||||
|  #include <stdio.h> | ||||
| @@ -90,6 +92,25 @@ static const struct Cipher ciphers[] = {
 | ||||
| @@ -99,6 +101,26 @@ static const struct sshcipher ciphers[] = {
 | ||||
|  	{ NULL,		SSH_CIPHER_INVALID, 0, 0, 0, 0, 0, 0, NULL } | ||||
|  }; | ||||
|   | ||||
| +static const struct Cipher fips_ciphers[] = {
 | ||||
| +static const struct sshcipher fips_ciphers[] = {
 | ||||
| +	{ "none",	SSH_CIPHER_NONE, 8, 0, 0, 0, 0, 0, EVP_enc_null },
 | ||||
| +	{ "3des-cbc",	SSH_CIPHER_SSH2, 8, 24, 0, 0, 0, 1, EVP_des_ede3_cbc },
 | ||||
| +	{ "aes128-cbc",	SSH_CIPHER_SSH2, 16, 16, 0, 0, 0, 1, EVP_aes_128_cbc },
 | ||||
| @ -164,38 +93,39 @@ index 226e56d..b19443c 100644 | ||||
| +#endif
 | ||||
| +	{ NULL,		SSH_CIPHER_INVALID, 0, 0, 0, 0, 0, 0, NULL }
 | ||||
| +};
 | ||||
| +
 | ||||
|  /*--*/ | ||||
|   | ||||
|  /* Returns a list of supported ciphers separated by the specified char. */ | ||||
| @@ -100,7 +121,7 @@ cipher_alg_list(char sep, int auth_only)
 | ||||
|  /* Returns a comma-separated list of supported ciphers. */ | ||||
| @@ -109,7 +131,7 @@ cipher_alg_list(char sep, int auth_only)
 | ||||
|  	size_t nlen, rlen = 0; | ||||
|  	const Cipher *c; | ||||
|  	const struct sshcipher *c; | ||||
|   | ||||
| -	for (c = ciphers; c->name != NULL; c++) {
 | ||||
| +	for (c = FIPS_mode() ? fips_ciphers : ciphers; c->name != NULL; c++) {
 | ||||
|  		if (c->number != SSH_CIPHER_SSH2) | ||||
|  			continue; | ||||
|  		if (auth_only && c->auth_len == 0) | ||||
| @@ -180,7 +201,7 @@ const Cipher *
 | ||||
| @@ -193,7 +215,7 @@ const struct sshcipher *
 | ||||
|  cipher_by_name(const char *name) | ||||
|  { | ||||
|  	const Cipher *c; | ||||
|  	const struct sshcipher *c; | ||||
| -	for (c = ciphers; c->name != NULL; c++)
 | ||||
| +	for (c = FIPS_mode() ? fips_ciphers : ciphers; c->name != NULL; c++)
 | ||||
|  		if (strcmp(c->name, name) == 0) | ||||
|  			return c; | ||||
|  	return NULL; | ||||
| @@ -190,7 +211,7 @@ const Cipher *
 | ||||
| @@ -203,7 +225,7 @@ const struct sshcipher *
 | ||||
|  cipher_by_number(int id) | ||||
|  { | ||||
|  	const Cipher *c; | ||||
|  	const struct sshcipher *c; | ||||
| -	for (c = ciphers; c->name != NULL; c++)
 | ||||
| +	for (c = FIPS_mode() ? fips_ciphers : ciphers; c->name != NULL; c++)
 | ||||
|  		if (c->number == id) | ||||
|  			return c; | ||||
|  	return NULL; | ||||
| @@ -232,7 +253,7 @@ cipher_number(const char *name)
 | ||||
|  	const Cipher *c; | ||||
| @@ -244,7 +266,7 @@ cipher_number(const char *name)
 | ||||
|  	const struct sshcipher *c; | ||||
|  	if (name == NULL) | ||||
|  		return -1; | ||||
| -	for (c = ciphers; c->name != NULL; c++)
 | ||||
| @ -216,10 +146,10 @@ index 48f7b68..9ff39f4 100644 | ||||
|   | ||||
|  /* | ||||
| diff --git a/entropy.c b/entropy.c
 | ||||
| index b361a04..5616643 100644
 | ||||
| index d24e724..06b0095 100644
 | ||||
| --- a/entropy.c
 | ||||
| +++ b/entropy.c
 | ||||
| @@ -222,6 +222,9 @@ seed_rng(void)
 | ||||
| @@ -215,6 +215,9 @@ seed_rng(void)
 | ||||
|  		fatal("OpenSSL version mismatch. Built against %lx, you " | ||||
|  		    "have %lx", (u_long)OPENSSL_VERSION_NUMBER, SSLeay()); | ||||
|   | ||||
| @ -230,18 +160,18 @@ index b361a04..5616643 100644 | ||||
|  	if (RAND_status() == 1) { | ||||
|  		debug3("RNG is ready, skipping seeding"); | ||||
| diff --git a/kex.c b/kex.c
 | ||||
| index bc3e53e..ede7b67 100644
 | ||||
| index e0cf3de..e11198f 100644
 | ||||
| --- a/kex.c
 | ||||
| +++ b/kex.c
 | ||||
| @@ -34,6 +34,7 @@
 | ||||
|  #include <string.h> | ||||
| @@ -35,6 +35,7 @@
 | ||||
|   | ||||
|  #ifdef WITH_OPENSSL | ||||
|  #include <openssl/crypto.h> | ||||
| +#include <openssl/fips.h>
 | ||||
|  #endif | ||||
|   | ||||
|  #include "xmalloc.h" | ||||
|  #include "ssh2.h" | ||||
| @@ -103,6 +104,25 @@ static const struct kexalg kexalgs[] = {
 | ||||
| @@ -107,6 +108,25 @@ static const struct kexalg kexalgs[] = {
 | ||||
|  	{ NULL, -1, -1, -1}, | ||||
|  }; | ||||
|   | ||||
| @ -267,7 +197,7 @@ index bc3e53e..ede7b67 100644 | ||||
|  char * | ||||
|  kex_alg_list(char sep) | ||||
|  { | ||||
| @@ -126,7 +146,7 @@ kex_alg_by_name(const char *name)
 | ||||
| @@ -130,7 +150,7 @@ kex_alg_by_name(const char *name)
 | ||||
|  { | ||||
|  	const struct kexalg *k; | ||||
|   | ||||
| @ -276,7 +206,7 @@ index bc3e53e..ede7b67 100644 | ||||
|  		if (strcmp(k->name, name) == 0) | ||||
|  			return k; | ||||
|  #ifdef GSSAPI | ||||
| @@ -151,7 +171,10 @@ kex_names_valid(const char *names)
 | ||||
| @@ -155,7 +175,10 @@ kex_names_valid(const char *names)
 | ||||
|  	for ((p = strsep(&cp, ",")); p && *p != '\0'; | ||||
|  	    (p = strsep(&cp, ","))) { | ||||
|  		if (kex_alg_by_name(p) == NULL) { | ||||
| @ -313,7 +243,7 @@ index 2700b72..0820894 100644 | ||||
|  } | ||||
|  #else /* OPENSSL_HAS_ECC */ | ||||
| diff --git a/kexgexc.c b/kexgexc.c
 | ||||
| index 355b7ba..427e11f 100644
 | ||||
| index 0a91bdd..b75930b 100644
 | ||||
| --- a/kexgexc.c
 | ||||
| +++ b/kexgexc.c
 | ||||
| @@ -26,6 +26,8 @@
 | ||||
| @ -358,50 +288,8 @@ index 770ad28..9d4fc6d 100644 | ||||
|  		omax = max = DH_GRP_MAX; | ||||
|  		break; | ||||
|  	default: | ||||
| diff --git a/key.c b/key.c
 | ||||
| index 62f3edb..a2050f6 100644
 | ||||
| --- a/key.c
 | ||||
| +++ b/key.c
 | ||||
| @@ -42,6 +42,7 @@
 | ||||
|  #include "crypto_api.h" | ||||
|   | ||||
|  #include <openssl/evp.h> | ||||
| +#include <openssl/fips.h>
 | ||||
|  #include <openbsd-compat/openssl-compat.h> | ||||
|   | ||||
|  #include <stdarg.h> | ||||
| @@ -636,9 +637,13 @@ key_fingerprint_selection(void)
 | ||||
|  	char *env; | ||||
|   | ||||
|  	if (!rv_defined) { | ||||
| -		env = getenv("SSH_FINGERPRINT_TYPE");
 | ||||
| -		rv = (env && !strcmp (env, "sha")) ?
 | ||||
| -			SSH_FP_SHA1 : SSH_FP_MD5;
 | ||||
| +		if (FIPS_mode())
 | ||||
| +			rv = SSH_FP_SHA1;
 | ||||
| +		else {
 | ||||
| +			env = getenv("SSH_FINGERPRINT_TYPE");
 | ||||
| +			rv = (env && !strcmp (env, "sha")) ?
 | ||||
| +				SSH_FP_SHA1 : SSH_FP_MD5;
 | ||||
| +		}
 | ||||
|  		rv_defined = 1; | ||||
|  	} | ||||
|  	return rv; | ||||
| @@ -1168,8 +1173,11 @@ rsa_generate_private_key(u_int bits)
 | ||||
|  		fatal("%s: BN_new failed", __func__); | ||||
|  	if (!BN_set_word(f4, RSA_F4)) | ||||
|  		fatal("%s: BN_new failed", __func__); | ||||
| -	if (!RSA_generate_key_ex(private, bits, f4, NULL))
 | ||||
| +	if (!RSA_generate_key_ex(private, bits, f4, NULL)) {
 | ||||
| +		if (FIPS_mode())
 | ||||
| +			logit("%s: the key length might be unsupported by FIPS mode approved key generation method", __func__);
 | ||||
|  		fatal("%s: key generation failed.", __func__); | ||||
| +	}
 | ||||
|  	BN_free(f4); | ||||
|  	return private; | ||||
|  } | ||||
| diff --git a/mac.c b/mac.c
 | ||||
| index 9388af4..cd7b034 100644
 | ||||
| index fd07bf2..fedfbb2 100644
 | ||||
| --- a/mac.c
 | ||||
| +++ b/mac.c
 | ||||
| @@ -27,6 +27,8 @@
 | ||||
| @ -466,26 +354,18 @@ index 9388af4..cd7b034 100644 | ||||
|  			continue; | ||||
|  		if (mac != NULL) { | ||||
| diff --git a/myproposal.h b/myproposal.h
 | ||||
| index 3a0f5ae..4f35a44 100644
 | ||||
| index b35b2b8..a608d27 100644
 | ||||
| --- a/myproposal.h
 | ||||
| +++ b/myproposal.h
 | ||||
| @@ -88,6 +88,12 @@
 | ||||
|  	"diffie-hellman-group14-sha1," \ | ||||
|  	"diffie-hellman-group1-sha1" | ||||
| @@ -140,6 +140,28 @@
 | ||||
|  	"hmac-sha1-96," \ | ||||
|  	"hmac-md5-96" | ||||
|   | ||||
| +#define KEX_DEFAULT_KEX_FIPS		\
 | ||||
| +	KEX_ECDH_METHODS \
 | ||||
| +	KEX_SHA256_METHODS \
 | ||||
| +	"diffie-hellman-group-exchange-sha1," \
 | ||||
| +	"diffie-hellman-group14-sha1"
 | ||||
| +
 | ||||
|  #define	KEX_DEFAULT_PK_ALG	\ | ||||
|  	HOSTKEY_ECDSA_CERT_METHODS \ | ||||
|  	"ssh-ed25519-cert-v01@openssh.com," \ | ||||
| @@ -133,6 +139,22 @@
 | ||||
|  #define	KEX_DEFAULT_COMP	"none,zlib@openssh.com,zlib" | ||||
|  #define	KEX_DEFAULT_LANG	"" | ||||
|   | ||||
| +#define	KEX_FIPS_ENCRYPT \
 | ||||
| +	"aes128-ctr,aes192-ctr,aes256-ctr," \
 | ||||
| +	"aes128-cbc,3des-cbc," \
 | ||||
| @ -502,59 +382,24 @@ index 3a0f5ae..4f35a44 100644 | ||||
| +#define        KEX_FIPS_MAC \
 | ||||
| +       "hmac-sha1"
 | ||||
| +#endif
 | ||||
| +
 | ||||
|  #else | ||||
|   | ||||
|  static char *myproposal[PROPOSAL_MAX] = { | ||||
|  	KEX_DEFAULT_KEX, | ||||
| diff --git a/ssh-keygen.c b/ssh-keygen.c
 | ||||
| index 66198e6..ccf22c8 100644
 | ||||
| --- a/ssh-keygen.c
 | ||||
| +++ b/ssh-keygen.c
 | ||||
| @@ -195,6 +195,12 @@ type_bits_valid(int type, u_int32_t *bitsp)
 | ||||
|  		fprintf(stderr, "key bits exceeds maximum %d\n", maxbits); | ||||
|  		exit(1); | ||||
|  	} | ||||
| +	if (FIPS_mode()) {
 | ||||
| +		if (type == KEY_DSA)
 | ||||
| +			fatal("DSA keys are not allowed in FIPS mode");
 | ||||
| +		if (type == KEY_ED25519)
 | ||||
| +			fatal("ED25519 keys are not allowed in FIPS mode");
 | ||||
| +	}
 | ||||
|  	if (type == KEY_DSA && *bitsp != 1024) | ||||
|  		fatal("DSA keys must be 1024 bits"); | ||||
|  	else if (type != KEY_ECDSA && type != KEY_ED25519 && *bitsp < 768) | ||||
| @@ -746,7 +752,7 @@ do_download(struct passwd *pw)
 | ||||
|  	enum fp_type fptype; | ||||
|  	char *fp, *ra; | ||||
|   | ||||
| -	fptype = print_bubblebabble ? SSH_FP_SHA1 : SSH_FP_MD5;
 | ||||
| +	fptype = print_bubblebabble ? SSH_FP_SHA1 : key_fingerprint_selection();
 | ||||
|  	rep =    print_bubblebabble ? SSH_FP_BUBBLEBABBLE : SSH_FP_HEX; | ||||
|   | ||||
|  	pkcs11_init(0); | ||||
| @@ -756,8 +762,7 @@ do_download(struct passwd *pw)
 | ||||
|  	for (i = 0; i < nkeys; i++) { | ||||
|  		if (print_fingerprint) { | ||||
|  			fp = key_fingerprint(keys[i], fptype, rep); | ||||
| -			ra = key_fingerprint(keys[i], SSH_FP_MD5,
 | ||||
| -			    SSH_FP_RANDOMART);
 | ||||
| +			ra = key_selected_fingerprint(keys[i], SSH_FP_RANDOMART);
 | ||||
|  			printf("%u %s %s (PKCS11 key)\n", key_size(keys[i]), | ||||
|  			    fp, key_type(keys[i])); | ||||
|  			if (log_level >= SYSLOG_LEVEL_VERBOSE) | ||||
|  #define KEX_SERVER_KEX		\ | ||||
| diff --git a/ssh.c b/ssh.c
 | ||||
| index 1e6cb90..ea9193f 100644
 | ||||
| index 26e9681..a0a7c29 100644
 | ||||
| --- a/ssh.c
 | ||||
| +++ b/ssh.c
 | ||||
| @@ -73,6 +73,8 @@
 | ||||
|   | ||||
| @@ -75,6 +75,8 @@
 | ||||
|  #include <openssl/evp.h> | ||||
|  #include <openssl/err.h> | ||||
|  #endif | ||||
| +#include <openssl/fips.h>
 | ||||
| +#include <fipscheck.h>
 | ||||
|  #include "openbsd-compat/openssl-compat.h" | ||||
|  #include "openbsd-compat/sys-queue.h" | ||||
|   | ||||
| @@ -427,6 +429,13 @@ main(int ac, char **av)
 | ||||
| @@ -433,6 +435,13 @@ main(int ac, char **av)
 | ||||
|  	sanitise_stdfd(); | ||||
|   | ||||
|  	__progname = ssh_get_progname(av[0]); | ||||
| @ -568,7 +413,7 @@ index 1e6cb90..ea9193f 100644 | ||||
|   | ||||
|  #ifndef HAVE_SETPROCTITLE | ||||
|  	/* Prepare for later setproctitle emulation */ | ||||
| @@ -504,6 +513,9 @@ main(int ac, char **av)
 | ||||
| @@ -510,6 +519,9 @@ main(int ac, char **av)
 | ||||
|  	    "ACD:E:F:I:KL:MNO:PQ:R:S:TVw:W:XYy")) != -1) { | ||||
|  		switch (opt) { | ||||
|  		case '1': | ||||
| @ -578,15 +423,15 @@ index 1e6cb90..ea9193f 100644 | ||||
|  			options.protocol = SSH_PROTO_1; | ||||
|  			break; | ||||
|  		case '2': | ||||
| @@ -828,7 +840,6 @@ main(int ac, char **av)
 | ||||
|   | ||||
| @@ -841,7 +853,6 @@ main(int ac, char **av)
 | ||||
|  	host_arg = xstrdup(host); | ||||
|   | ||||
|  #ifdef WITH_OPENSSL | ||||
| -	OpenSSL_add_all_algorithms();
 | ||||
|  	ERR_load_crypto_strings(); | ||||
|  #endif | ||||
|   | ||||
|  	/* Initialize the command to execute on remote host. */ | ||||
| @@ -973,6 +984,10 @@ main(int ac, char **av)
 | ||||
| @@ -997,6 +1008,10 @@ main(int ac, char **av)
 | ||||
|   | ||||
|  	seed_rng(); | ||||
|   | ||||
| @ -597,7 +442,7 @@ index 1e6cb90..ea9193f 100644 | ||||
|  	if (options.user == NULL) | ||||
|  		options.user = xstrdup(pw->pw_name); | ||||
|   | ||||
| @@ -1020,6 +1035,12 @@ main(int ac, char **av)
 | ||||
| @@ -1069,6 +1084,12 @@ main(int ac, char **av)
 | ||||
|   | ||||
|  	timeout_ms = options.connection_timeout * 1000; | ||||
|   | ||||
| @ -611,10 +456,10 @@ index 1e6cb90..ea9193f 100644 | ||||
|  	if (ssh_connect(host, addrs, &hostaddr, options.port, | ||||
|  	    options.address_family, options.connection_attempts, | ||||
| diff --git a/sshconnect2.c b/sshconnect2.c
 | ||||
| index b00658b..6a1562c 100644
 | ||||
| index efe6158..5631f39 100644
 | ||||
| --- a/sshconnect2.c
 | ||||
| +++ b/sshconnect2.c
 | ||||
| @@ -44,6 +44,8 @@
 | ||||
| @@ -46,6 +46,8 @@
 | ||||
|  #include <vis.h> | ||||
|  #endif | ||||
|   | ||||
| @ -623,24 +468,13 @@ index b00658b..6a1562c 100644 | ||||
|  #include "openbsd-compat/sys-queue.h" | ||||
|   | ||||
|  #include "xmalloc.h" | ||||
| @@ -168,20 +170,25 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
| @@ -171,20 +173,25 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
|   | ||||
|  #ifdef GSSAPI | ||||
|  	if (options.gss_keyex) { | ||||
| -		/* Add the GSSAPI mechanisms currently supported on this 
 | ||||
| -		 * client to the key exchange algorithm proposal */
 | ||||
| -		orig = myproposal[PROPOSAL_KEX_ALGS];
 | ||||
| -
 | ||||
| -		if (options.gss_trust_dns)
 | ||||
| -			gss_host = (char *)get_canonical_hostname(1);
 | ||||
| -		else
 | ||||
| -			gss_host = host;
 | ||||
| -
 | ||||
| -		gss = ssh_gssapi_client_mechanisms(gss_host, options.gss_client_identity);
 | ||||
| -		if (gss) {
 | ||||
| -			debug("Offering GSSAPI proposal: %s", gss);
 | ||||
| -			xasprintf(&myproposal[PROPOSAL_KEX_ALGS],
 | ||||
| -			    "%s,%s", gss, orig);
 | ||||
| +		if (FIPS_mode()) {
 | ||||
| +			logit("Disabling GSSAPIKeyExchange. Not usable in FIPS mode");
 | ||||
| +			options.gss_keyex = 0;
 | ||||
| @ -648,12 +482,21 @@ index b00658b..6a1562c 100644 | ||||
| +			/* Add the GSSAPI mechanisms currently supported on this
 | ||||
| +			 * client to the key exchange algorithm proposal */
 | ||||
| +			orig = myproposal[PROPOSAL_KEX_ALGS];
 | ||||
| +
 | ||||
|   | ||||
| -		if (options.gss_trust_dns)
 | ||||
| -			gss_host = (char *)get_canonical_hostname(1);
 | ||||
| -		else
 | ||||
| -			gss_host = host;
 | ||||
| +			if (options.gss_trust_dns)
 | ||||
| +				gss_host = (char *)get_canonical_hostname(1);
 | ||||
| +			else
 | ||||
| +				gss_host = host;
 | ||||
| +
 | ||||
|   | ||||
| -		gss = ssh_gssapi_client_mechanisms(gss_host, options.gss_client_identity);
 | ||||
| -		if (gss) {
 | ||||
| -			debug("Offering GSSAPI proposal: %s", gss);
 | ||||
| -			xasprintf(&myproposal[PROPOSAL_KEX_ALGS],
 | ||||
| -			    "%s,%s", gss, orig);
 | ||||
| +			gss = ssh_gssapi_client_mechanisms(gss_host, options.gss_client_identity);
 | ||||
| +			if (gss) {
 | ||||
| +				debug("Offering GSSAPI proposal: %s", gss);
 | ||||
| @ -663,7 +506,7 @@ index b00658b..6a1562c 100644 | ||||
|  		} | ||||
|  	} | ||||
|  #endif | ||||
| @@ -193,6 +200,10 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
| @@ -196,6 +203,10 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
|  	if (options.ciphers != NULL) { | ||||
|  		myproposal[PROPOSAL_ENC_ALGS_CTOS] = | ||||
|  		myproposal[PROPOSAL_ENC_ALGS_STOC] = options.ciphers; | ||||
| @ -674,7 +517,7 @@ index b00658b..6a1562c 100644 | ||||
|  	} | ||||
|  	myproposal[PROPOSAL_ENC_ALGS_CTOS] = | ||||
|  	    compat_cipher_proposal(myproposal[PROPOSAL_ENC_ALGS_CTOS]); | ||||
| @@ -208,7 +219,11 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
| @@ -211,7 +222,11 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
|  	if (options.macs != NULL) { | ||||
|  		myproposal[PROPOSAL_MAC_ALGS_CTOS] = | ||||
|  		myproposal[PROPOSAL_MAC_ALGS_STOC] = options.macs; | ||||
| @ -686,7 +529,7 @@ index b00658b..6a1562c 100644 | ||||
|  	if (options.hostkeyalgorithms != NULL) | ||||
|  		myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = | ||||
|  		    compat_pkalg_proposal(options.hostkeyalgorithms); | ||||
| @@ -220,9 +235,11 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
| @@ -223,9 +238,11 @@ ssh_kex2(char *host, struct sockaddr *hostaddr, u_short port)
 | ||||
|  	} | ||||
|  	if (options.kex_algorithms != NULL) | ||||
|  		myproposal[PROPOSAL_KEX_ALGS] = options.kex_algorithms; | ||||
| @ -700,19 +543,27 @@ index b00658b..6a1562c 100644 | ||||
|  	/* If we've got GSSAPI algorithms, then we also support the | ||||
|  	 * 'null' hostkey, as a last resort */ | ||||
| diff --git a/sshd.c b/sshd.c
 | ||||
| index b561ec8..e977de3 100644
 | ||||
| index db23ce2..3ce59f0 100644
 | ||||
| --- a/sshd.c
 | ||||
| +++ b/sshd.c
 | ||||
| @@ -75,6 +75,8 @@
 | ||||
| @@ -66,6 +66,7 @@
 | ||||
|  #include <grp.h> | ||||
|  #include <pwd.h> | ||||
|  #include <signal.h> | ||||
| +#include <syslog.h>
 | ||||
|  #include <stdarg.h> | ||||
|  #include <stdio.h> | ||||
|  #include <stdlib.h> | ||||
| @@ -76,6 +77,8 @@
 | ||||
|  #include <openssl/dh.h> | ||||
|  #include <openssl/bn.h> | ||||
|  #include <openssl/rand.h> | ||||
| +#include <openssl/fips.h>
 | ||||
| +#include <fipscheck.h>
 | ||||
|  #include "openbsd-compat/openssl-compat.h" | ||||
|  #endif | ||||
|   | ||||
|  #ifdef HAVE_SECUREWARE | ||||
| @@ -1468,6 +1470,18 @@ main(int ac, char **av)
 | ||||
| @@ -1479,6 +1482,18 @@ main(int ac, char **av)
 | ||||
|  #endif | ||||
|  	__progname = ssh_get_progname(av[0]); | ||||
|   | ||||
| @ -731,16 +582,16 @@ index b561ec8..e977de3 100644 | ||||
|  	/* Save argv. Duplicate so setproctitle emulation doesn't clobber it */ | ||||
|  	saved_argc = ac; | ||||
|  	rexec_argc = ac; | ||||
| @@ -1619,8 +1633,6 @@ main(int ac, char **av)
 | ||||
| @@ -1630,7 +1645,7 @@ main(int ac, char **av)
 | ||||
|  	else | ||||
|  		closefrom(REEXEC_DEVCRYPTO_RESERVED_FD); | ||||
|   | ||||
| -	OpenSSL_add_all_algorithms();
 | ||||
| -
 | ||||
|  	/* If requested, redirect the logs to the specified logfile. */ | ||||
|  	if (logfile != NULL) { | ||||
|  		log_redirect_stderr_to(logfile); | ||||
| @@ -1798,6 +1810,10 @@ main(int ac, char **av)
 | ||||
| -#ifdef WITH_OPENSSL
 | ||||
| +#if 0 /* FIPS */
 | ||||
|  	OpenSSL_add_all_algorithms(); | ||||
|  #endif | ||||
|   | ||||
| @@ -1816,6 +1831,10 @@ main(int ac, char **av)
 | ||||
|  		debug("private host key: #%d type %d %s", i, keytype, | ||||
|  		    key_type(key ? key : pubkey)); | ||||
|  	} | ||||
| @ -751,7 +602,7 @@ index b561ec8..e977de3 100644 | ||||
|  	if ((options.protocol & SSH_PROTO_1) && !sensitive_data.have_ssh1_key) { | ||||
|  		logit("Disabling protocol version 1. Could not load host key"); | ||||
|  		options.protocol &= ~SSH_PROTO_1; | ||||
| @@ -1961,6 +1977,10 @@ main(int ac, char **av)
 | ||||
| @@ -1982,6 +2001,10 @@ main(int ac, char **av)
 | ||||
|  	/* Reinitialize the log (because of the fork above). */ | ||||
|  	log_init(__progname, options.log_level, options.log_facility, log_stderr); | ||||
|   | ||||
| @ -762,7 +613,7 @@ index b561ec8..e977de3 100644 | ||||
|  	/* Chdir to the root directory so that the current disk can be | ||||
|  	   unmounted if desired. */ | ||||
|  	if (chdir("/") == -1) | ||||
| @@ -2530,6 +2550,9 @@ do_ssh2_kex(void)
 | ||||
| @@ -2541,6 +2564,9 @@ do_ssh2_kex(void)
 | ||||
|  	if (options.ciphers != NULL) { | ||||
|  		myproposal[PROPOSAL_ENC_ALGS_CTOS] = | ||||
|  		myproposal[PROPOSAL_ENC_ALGS_STOC] = options.ciphers; | ||||
| @ -772,7 +623,7 @@ index b561ec8..e977de3 100644 | ||||
|  	} | ||||
|  	myproposal[PROPOSAL_ENC_ALGS_CTOS] = | ||||
|  	    compat_cipher_proposal(myproposal[PROPOSAL_ENC_ALGS_CTOS]); | ||||
| @@ -2539,6 +2562,9 @@ do_ssh2_kex(void)
 | ||||
| @@ -2550,6 +2576,9 @@ do_ssh2_kex(void)
 | ||||
|  	if (options.macs != NULL) { | ||||
|  		myproposal[PROPOSAL_MAC_ALGS_CTOS] = | ||||
|  		myproposal[PROPOSAL_MAC_ALGS_STOC] = options.macs; | ||||
| @ -782,7 +633,7 @@ index b561ec8..e977de3 100644 | ||||
|  	} | ||||
|  	if (options.compression == COMP_NONE) { | ||||
|  		myproposal[PROPOSAL_COMP_ALGS_CTOS] = | ||||
| @@ -2549,6 +2575,8 @@ do_ssh2_kex(void)
 | ||||
| @@ -2560,6 +2589,8 @@ do_ssh2_kex(void)
 | ||||
|  	} | ||||
|  	if (options.kex_algorithms != NULL) | ||||
|  		myproposal[PROPOSAL_KEX_ALGS] = options.kex_algorithms; | ||||
| @ -791,7 +642,7 @@ index b561ec8..e977de3 100644 | ||||
|   | ||||
|  	myproposal[PROPOSAL_KEX_ALGS] = compat_kex_proposal( | ||||
|  	    myproposal[PROPOSAL_KEX_ALGS]); | ||||
| @@ -2575,10 +2603,14 @@ do_ssh2_kex(void)
 | ||||
| @@ -2586,10 +2617,14 @@ do_ssh2_kex(void)
 | ||||
|  	if (strlen(myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS]) == 0) | ||||
|  		orig = NULL; | ||||
|   | ||||
| @ -810,3 +661,24 @@ index b561ec8..e977de3 100644 | ||||
|   | ||||
|  	if (gss && orig) | ||||
|  		xasprintf(&newstr, "%s,%s", gss, orig); | ||||
| diff --git a/sshkey.c b/sshkey.c
 | ||||
| index f078e11..5e3d97f 100644
 | ||||
| --- a/sshkey.c
 | ||||
| +++ b/sshkey.c
 | ||||
| @@ -34,6 +34,7 @@
 | ||||
|  #include <openssl/evp.h> | ||||
|  #include <openssl/err.h> | ||||
|  #include <openssl/pem.h> | ||||
| +#include <openssl/fips.h>
 | ||||
|   | ||||
|  #include "crypto_api.h" | ||||
|   | ||||
| @@ -1523,6 +1524,8 @@ rsa_generate_private_key(u_int bits, RSA **rsap)
 | ||||
|  	} | ||||
|  	if (!BN_set_word(f4, RSA_F4) || | ||||
|  	    !RSA_generate_key_ex(private, bits, f4, NULL)) { | ||||
| +			if (FIPS_mode())
 | ||||
| +				logit("%s: the key length might be unsupported by FIPS mode approved key generation method", __func__);
 | ||||
|  		ret = SSH_ERR_LIBCRYPTO_ERROR; | ||||
|  		goto out; | ||||
|  	} | ||||
| @ -113,7 +113,7 @@ index 0000000..dd5f5cc | ||||
| +    Jan F. Chadima <jchadima@redhat.com>
 | ||||
| +
 | ||||
| diff --git a/Makefile.in b/Makefile.in
 | ||||
| index 28a8ec4..411eadb 100644
 | ||||
| index 06be3d5..f02aa1e 100644
 | ||||
| --- a/Makefile.in
 | ||||
| +++ b/Makefile.in
 | ||||
| @@ -25,6 +25,8 @@ SSH_PROGRAM=@bindir@/ssh
 | ||||
| @ -125,7 +125,7 @@ index 28a8ec4..411eadb 100644 | ||||
|  SSH_PKCS11_HELPER=$(libexecdir)/ssh-pkcs11-helper | ||||
|  PRIVSEP_PATH=@PRIVSEP_PATH@ | ||||
|  SSH_PRIVSEP_USER=@SSH_PRIVSEP_USER@ | ||||
| @@ -60,8 +62,9 @@ XAUTH_PATH=@XAUTH_PATH@
 | ||||
| @@ -61,8 +63,9 @@ XAUTH_PATH=@XAUTH_PATH@
 | ||||
|  LDFLAGS=-L. -Lopenbsd-compat/ @LDFLAGS@ | ||||
|  EXEEXT=@EXEEXT@ | ||||
|  MANFMT=@MANFMT@ | ||||
| @ -134,9 +134,9 @@ index 28a8ec4..411eadb 100644 | ||||
| -TARGETS=ssh$(EXEEXT) sshd$(EXEEXT) ssh-add$(EXEEXT) ssh-keygen$(EXEEXT) ssh-keyscan${EXEEXT} ssh-keysign${EXEEXT} ssh-pkcs11-helper$(EXEEXT) ssh-agent$(EXEEXT) scp$(EXEEXT) sftp-server$(EXEEXT) sftp$(EXEEXT)
 | ||||
| +TARGETS=ssh$(EXEEXT) sshd$(EXEEXT) ssh-add$(EXEEXT) ssh-keygen$(EXEEXT) ssh-keyscan${EXEEXT} ssh-keysign${EXEEXT} ssh-pkcs11-helper$(EXEEXT) ssh-agent$(EXEEXT) scp$(EXEEXT) sftp-server$(EXEEXT) sftp$(EXEEXT) ssh-ldap-helper$(EXEEXT)
 | ||||
|   | ||||
|  LIBSSH_OBJS=authfd.o authfile.o bufaux.o bufbn.o buffer.o \ | ||||
|  	canohost.o channels.o cipher.o cipher-aes.o \ | ||||
| @@ -98,8 +101,8 @@ SSHDOBJS=sshd.o auth-rhosts.o auth-passwd.o auth-rsa.o auth-rh-rsa.o \
 | ||||
|  LIBOPENSSH_OBJS=\ | ||||
|  	ssherr.o \ | ||||
| @@ -108,8 +111,8 @@ SSHDOBJS=sshd.o auth-rhosts.o auth-passwd.o auth-rsa.o auth-rh-rsa.o \
 | ||||
|  	sandbox-null.o sandbox-rlimit.o sandbox-systrace.o sandbox-darwin.o \ | ||||
|  	sandbox-seccomp-filter.o sandbox-capsicum.o | ||||
|   | ||||
| @ -147,7 +147,7 @@ index 28a8ec4..411eadb 100644 | ||||
|  MANTYPE		= @MANTYPE@ | ||||
|   | ||||
|  CONFIGFILES=sshd_config.out ssh_config.out moduli.out | ||||
| @@ -170,6 +173,9 @@ ssh-keysign$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keysign.o roaming_dummy.o readco
 | ||||
| @@ -180,6 +183,9 @@ ssh-keysign$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keysign.o roaming_dummy.o readco
 | ||||
|  ssh-pkcs11-helper$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-pkcs11-helper.o ssh-pkcs11.o | ||||
|  	$(LD) -o $@ ssh-pkcs11-helper.o ssh-pkcs11.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS) | ||||
|   | ||||
| @ -157,7 +157,7 @@ index 28a8ec4..411eadb 100644 | ||||
|  ssh-keyscan$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-keyscan.o roaming_dummy.o | ||||
|  	$(LD) -o $@ ssh-keyscan.o roaming_dummy.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) | ||||
|   | ||||
| @@ -273,6 +279,10 @@ install-files:
 | ||||
| @@ -295,6 +301,10 @@ install-files:
 | ||||
|  	$(INSTALL) -m 0755 $(STRIP_OPT) sshd$(EXEEXT) $(DESTDIR)$(sbindir)/sshd$(EXEEXT) | ||||
|  	$(INSTALL) -m 4711 $(STRIP_OPT) ssh-keysign$(EXEEXT) $(DESTDIR)$(SSH_KEYSIGN)$(EXEEXT) | ||||
|  	$(INSTALL) -m 0755 $(STRIP_OPT) ssh-pkcs11-helper$(EXEEXT) $(DESTDIR)$(SSH_PKCS11_HELPER)$(EXEEXT) | ||||
| @ -168,7 +168,7 @@ index 28a8ec4..411eadb 100644 | ||||
|  	$(INSTALL) -m 0755 $(STRIP_OPT) sftp$(EXEEXT) $(DESTDIR)$(bindir)/sftp$(EXEEXT) | ||||
|  	$(INSTALL) -m 0755 $(STRIP_OPT) sftp-server$(EXEEXT) $(DESTDIR)$(SFTP_SERVER)$(EXEEXT) | ||||
|  	$(INSTALL) -m 644 ssh.1.out $(DESTDIR)$(mandir)/$(mansubdir)1/ssh.1 | ||||
| @@ -289,6 +299,10 @@ install-files:
 | ||||
| @@ -311,6 +321,10 @@ install-files:
 | ||||
|  	$(INSTALL) -m 644 sftp-server.8.out $(DESTDIR)$(mandir)/$(mansubdir)8/sftp-server.8 | ||||
|  	$(INSTALL) -m 644 ssh-keysign.8.out $(DESTDIR)$(mandir)/$(mansubdir)8/ssh-keysign.8 | ||||
|  	$(INSTALL) -m 644 ssh-pkcs11-helper.8.out $(DESTDIR)$(mandir)/$(mansubdir)8/ssh-pkcs11-helper.8 | ||||
| @ -179,7 +179,7 @@ index 28a8ec4..411eadb 100644 | ||||
|  	-rm -f $(DESTDIR)$(bindir)/slogin | ||||
|  	ln -s ./ssh$(EXEEXT) $(DESTDIR)$(bindir)/slogin | ||||
|  	-rm -f $(DESTDIR)$(mandir)/$(mansubdir)1/slogin.1 | ||||
| @@ -318,6 +332,13 @@ install-sysconf:
 | ||||
| @@ -340,6 +354,13 @@ install-sysconf:
 | ||||
|  	else \ | ||||
|  		echo "$(DESTDIR)$(sysconfdir)/moduli already exists, install will not overwrite"; \ | ||||
|  	fi | ||||
| @ -193,7 +193,7 @@ index 28a8ec4..411eadb 100644 | ||||
|   | ||||
|  host-key: ssh-keygen$(EXEEXT) | ||||
|  	@if [ -z "$(DESTDIR)" ] ; then \ | ||||
| @@ -381,6 +402,8 @@ uninstall:
 | ||||
| @@ -403,6 +424,8 @@ uninstall:
 | ||||
|  	-rm -r $(DESTDIR)$(SFTP_SERVER)$(EXEEXT) | ||||
|  	-rm -f $(DESTDIR)$(SSH_KEYSIGN)$(EXEEXT) | ||||
|  	-rm -f $(DESTDIR)$(SSH_PKCS11_HELPER)$(EXEEXT) | ||||
| @ -202,19 +202,19 @@ index 28a8ec4..411eadb 100644 | ||||
|  	-rm -f $(DESTDIR)$(mandir)/$(mansubdir)1/ssh.1 | ||||
|  	-rm -f $(DESTDIR)$(mandir)/$(mansubdir)1/scp.1 | ||||
|  	-rm -f $(DESTDIR)$(mandir)/$(mansubdir)1/ssh-add.1 | ||||
| @@ -392,6 +415,7 @@ uninstall:
 | ||||
| @@ -414,6 +437,7 @@ uninstall:
 | ||||
|  	-rm -f $(DESTDIR)$(mandir)/$(mansubdir)8/sftp-server.8 | ||||
|  	-rm -f $(DESTDIR)$(mandir)/$(mansubdir)8/ssh-keysign.8 | ||||
|  	-rm -f $(DESTDIR)$(mandir)/$(mansubdir)8/ssh-pkcs11-helper.8 | ||||
| +	-rm -f $(DESTDIR)$(mandir)/$(mansubdir)8/ssh-ldap-helper.8
 | ||||
|  	-rm -f $(DESTDIR)$(mandir)/$(mansubdir)1/slogin.1 | ||||
|   | ||||
|  regress/modpipe$(EXEEXT): $(srcdir)/regress/modpipe.c | ||||
|  regress-prep: | ||||
| diff --git a/configure.ac b/configure.ac
 | ||||
| index 7c6ce08..722a19e 100644
 | ||||
| index 67c4486..6553074 100644
 | ||||
| --- a/configure.ac
 | ||||
| +++ b/configure.ac
 | ||||
| @@ -1625,6 +1625,106 @@ if test "x$use_pie" != "xno"; then
 | ||||
| @@ -1569,6 +1569,106 @@ if test "x$use_pie" != "xno"; then
 | ||||
|  	fi | ||||
|  fi | ||||
|   | ||||
| @ -1159,7 +1159,7 @@ index 0000000..665dca2 | ||||
| +
 | ||||
| diff --git a/ldapconf.c b/ldapconf.c
 | ||||
| new file mode 100644 | ||||
| index 0000000..525060a
 | ||||
| index 0000000..b49cae6
 | ||||
| --- /dev/null
 | ||||
| +++ b/ldapconf.c
 | ||||
| @@ -0,0 +1,722 @@
 | ||||
							
								
								
									
										42
									
								
								openssh.spec
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								openssh.spec
									
									
									
									
									
								
							| @ -63,10 +63,10 @@ | ||||
| %endif | ||||
| 
 | ||||
| # Do not forget to bump pam_ssh_agent_auth release if you rewind the main package release to 1 | ||||
| %define openssh_ver 6.6.1p1 | ||||
| %define openssh_rel 11.1 | ||||
| %define openssh_ver 6.7p1 | ||||
| %define openssh_rel 1 | ||||
| %define pam_ssh_agent_ver 0.9.3 | ||||
| %define pam_ssh_agent_rel 3 | ||||
| %define pam_ssh_agent_rel 4 | ||||
| 
 | ||||
| Summary: An open source implementation of SSH protocol versions 1 and 2 | ||||
| Name: openssh | ||||
| @ -74,8 +74,7 @@ Version: %{openssh_ver} | ||||
| Release: %{openssh_rel}%{?dist}%{?rescue_rel} | ||||
| URL: http://www.openssh.com/portable.html | ||||
| #URL1: http://pamsshagentauth.sourceforge.net | ||||
| # Source0: ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-%{version}.tar.gz | ||||
| Source0: ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-6.6p1.tar.gz | ||||
| Source0: ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-%{version}.tar.gz | ||||
| #Source1: ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-%{version}.tar.gz.asc | ||||
| Source2: sshd.pam | ||||
| Source3: sshd.init | ||||
| @ -103,10 +102,9 @@ Patch102: openssh-5.8p1-getaddrinfo.patch | ||||
| Patch103: openssh-5.8p1-packet.patch | ||||
| 
 | ||||
| #https://bugzilla.mindrot.org/show_bug.cgi?id=1402 | ||||
| Patch200: openssh-6.6p1-audit.patch | ||||
| # https://bugzilla.redhat.com/show_bug.cgi?id=1171248 | ||||
| # record pfs= field in CRYPTO_SESSION audit event | ||||
| Patch201: openssh-6.6.1p1-audit-pfs.patch | ||||
| Patch200: openssh-6.7p1-audit.patch | ||||
| 
 | ||||
| # --- pam_ssh-agent --- | ||||
| # make it build reusing the openssh sources | ||||
| @ -117,13 +115,15 @@ Patch301: pam_ssh_agent_auth-0.9.2-seteuid.patch | ||||
| Patch302: pam_ssh_agent_auth-0.9.2-visibility.patch | ||||
| # don't use xfree (#1024965) | ||||
| Patch303: pam_ssh_agent_auth-0.9.3-no-xfree.patch | ||||
| # use SSH_DIGEST_* for fingerprint hashes | ||||
| Patch304: pam_ssh_agent_auth-0.9.3-fingerprint-hash.patch | ||||
| #https://bugzilla.mindrot.org/show_bug.cgi?id=1641 (WONTFIX) | ||||
| Patch400: openssh-6.6p1-role-mls.patch | ||||
| #https://bugzilla.redhat.com/show_bug.cgi?id=781634 | ||||
| Patch404: openssh-6.6p1-privsep-selinux.patch | ||||
| 
 | ||||
| #?-- unwanted child :( | ||||
| Patch501: openssh-6.6p1-ldap.patch | ||||
| Patch501: openssh-6.7p1-ldap.patch | ||||
| #? | ||||
| Patch502: openssh-6.6p1-keycat.patch | ||||
| 
 | ||||
| @ -143,15 +143,11 @@ Patch608: openssh-6.1p1-askpass-ld.patch | ||||
| Patch609: openssh-5.5p1-x11.patch | ||||
| 
 | ||||
| #? | ||||
| Patch700: openssh-6.6p1-fips.patch | ||||
| #? | ||||
| # drop? Patch701: openssh-5.6p1-exit-deadlock.patch | ||||
| Patch700: openssh-6.7p1-fips.patch | ||||
| #? | ||||
| Patch702: openssh-5.1p1-askpass-progress.patch | ||||
| #? | ||||
| Patch703: openssh-4.3p2-askpass-grab-info.patch | ||||
| # https://bugzilla.redhat.com/show_bug.cgi?id=205842 | ||||
| # drop? Patch704: openssh-5.9p1-edns.patch | ||||
| #? | ||||
| Patch705: openssh-5.1p1-scp-manpage.patch | ||||
| #? | ||||
| @ -361,7 +357,7 @@ remote ssh-agent instance. | ||||
| The module is most useful for su and sudo service stacks. | ||||
| 
 | ||||
| %prep | ||||
| %setup -q -a 4 -n openssh-6.6p1 | ||||
| %setup -q -a 4 | ||||
| #Do not enable by default | ||||
| %if 0 | ||||
| %patch0 -p1 -b .wIm | ||||
| @ -377,6 +373,7 @@ pushd pam_ssh_agent_auth-%{pam_ssh_agent_ver} | ||||
| %patch301 -p1 -b .psaa-seteuid | ||||
| %patch302 -p1 -b .psaa-visibility | ||||
| %patch303 -p1 -b .psaa-xfree | ||||
| %patch304 -p2 -b .psaa-fingerprint | ||||
| # Remove duplicate headers | ||||
| rm -f $(cat %{SOURCE5}) | ||||
| popd | ||||
| @ -399,13 +396,8 @@ popd | ||||
| %patch607 -p1 -b .sigpipe | ||||
| %patch608 -p1 -b .askpass-ld | ||||
| %patch609 -p1 -b .x11 | ||||
| #  | ||||
| # drop? %patch701 -p1 -b .exit-deadlock | ||||
| %patch702 -p1 -b .progress | ||||
| %patch703 -p1 -b .grab-info | ||||
| # investigate - https://bugzilla.redhat.com/show_bug.cgi?id=205842 | ||||
| # probably not needed anymore %patch704 -p1 -b .edns | ||||
| # drop it %patch705 -p1 -b .manpage | ||||
| %patch706 -p1 -b .localdomain | ||||
| %patch707 -p1 -b .redhat | ||||
| %patch708 -p1 -b .entropy | ||||
| @ -422,15 +414,10 @@ popd | ||||
| %patch902 -p1 -b .ccache_name | ||||
| %patch905 -p1 -b .legacy-ssh-copy-id | ||||
| %patch906 -p1 -b .fromto-remote | ||||
| %patch907 -p1 -b .CLOCK_BOOTTIME | ||||
| %patch908 -p1 -b .CVE-2014-2653 | ||||
| %patch909 -p1 -b .6.6.1 | ||||
| %patch910 -p1 -b .NI_MAXHOST | ||||
| %patch911 -p1 -b .set_remote_ipaddr | ||||
| %patch912 -p1 -b .utf8-banner | ||||
| %patch913 -p1 -b .partial-success | ||||
| %patch914 -p1 -b .servconf | ||||
| %patch915 -p1 -b .SIGXFSZ | ||||
| %patch916 -p1 -b .contexts | ||||
| %patch917 -p1 -b .cisco-dh | ||||
| %patch918 -p1 -b .log-in-chroot | ||||
| @ -439,10 +426,10 @@ popd | ||||
| %patch802 -p1 -b .GSSAPIEnablek5users | ||||
| 
 | ||||
| %patch200 -p1 -b .audit | ||||
| %patch201 -p1 -b .audit-fps | ||||
| %patch700 -p1 -b .fips | ||||
| 
 | ||||
| %patch100 -p1 -b .coverity | ||||
| # FIXME rebase 6.7p1 | ||||
| # %patch100 -p1 -b .coverity | ||||
| 
 | ||||
| %if 0 | ||||
| # Nothing here yet | ||||
| @ -751,6 +738,9 @@ getent passwd sshd >/dev/null || \ | ||||
| %endif | ||||
| 
 | ||||
| %changelog | ||||
| * Tue Jan 20 2015 Petr Lautrbach <plautrba@redhat.com> 6.7p1-1 + 0.9.3-4 | ||||
| - new upstream release openssh-6.7p1 | ||||
| 
 | ||||
| * Thu Jan 15 2015 Jakub Jelen <jjelen@redhat.com> 6.6.1p1-11.1 + 0.9.3-3 | ||||
| - error message if scp when directory doesn't exist (#1142223) | ||||
| - parsing configuration file values (#1130733) | ||||
|  | ||||
							
								
								
									
										64
									
								
								pam_ssh_agent_auth-0.9.3-fingerprint-hash.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										64
									
								
								pam_ssh_agent_auth-0.9.3-fingerprint-hash.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,64 @@ | ||||
| diff --git a/pam_ssh_agent_auth-0.9.3/key.c b/pam_ssh_agent_auth-0.9.3/key.c
 | ||||
| index 9555e7e..c17aae6 100644
 | ||||
| --- a/pam_ssh_agent_auth-0.9.3/key.c
 | ||||
| +++ b/pam_ssh_agent_auth-0.9.3/key.c
 | ||||
| @@ -55,6 +55,7 @@
 | ||||
|  #include "uuencode.h" | ||||
|  #include "buffer.h" | ||||
|  #include "log.h" | ||||
| +#include "digest.h"
 | ||||
|   | ||||
|  Key * | ||||
|  key_new(int type) | ||||
| @@ -181,7 +182,7 @@ key_equal(const Key *a, const Key *b)
 | ||||
|  } | ||||
|   | ||||
|  u_char* | ||||
| -key_fingerprint_raw(const Key *k, enum fp_type dgst_type,
 | ||||
| +key_fingerprint_raw(const Key *k, int dgst_type,
 | ||||
|      u_int *dgst_raw_length) | ||||
|  { | ||||
|  	const EVP_MD *md = NULL; | ||||
| @@ -194,10 +195,10 @@ key_fingerprint_raw(const Key *k, enum fp_type dgst_type,
 | ||||
|  	*dgst_raw_length = 0; | ||||
|   | ||||
|  	switch (dgst_type) { | ||||
| -	case SSH_FP_MD5:
 | ||||
| +	case SSH_DIGEST_MD5:
 | ||||
|  		md = EVP_md5(); | ||||
|  		break; | ||||
| -	case SSH_FP_SHA1:
 | ||||
| +	case SSH_DIGEST_SHA1:
 | ||||
|  		md = EVP_sha1(); | ||||
|  		break; | ||||
|  	default: | ||||
| @@ -302,7 +303,7 @@ key_fingerprint_bubblebabble(u_char *dgst_raw, u_int dgst_raw_len)
 | ||||
|  } | ||||
|   | ||||
|  char * | ||||
| -key_fingerprint(const Key *k, enum fp_type dgst_type, enum fp_rep dgst_rep)
 | ||||
| +key_fingerprint(const Key *k, int dgst_type, enum fp_rep dgst_rep)
 | ||||
|  { | ||||
|  	char *retval = NULL; | ||||
|  	u_char *dgst_raw; | ||||
| diff --git a/pam_ssh_agent_auth-0.9.3/pam_user_key_allowed2.c b/pam_ssh_agent_auth-0.9.3/pam_user_key_allowed2.c
 | ||||
| index dddcba9..8ba6d87 100644
 | ||||
| --- a/pam_ssh_agent_auth-0.9.3/pam_user_key_allowed2.c
 | ||||
| +++ b/pam_ssh_agent_auth-0.9.3/pam_user_key_allowed2.c
 | ||||
| @@ -43,6 +43,7 @@
 | ||||
|  #include "buffer.h" | ||||
|  #include "log.h" | ||||
|  #include "compat.h" | ||||
| +#include "digest.h"
 | ||||
|  #include "key.h" | ||||
|  #include "pathnames.h" | ||||
|  #include "misc.h" | ||||
| @@ -118,7 +119,7 @@ pam_user_key_allowed2(struct passwd *pw, Key *key, char *file)
 | ||||
|  			found_key = 1; | ||||
|  			logit("matching key found: file %s, line %lu", | ||||
|  			    file, linenum); | ||||
| -			fp = key_fingerprint(found, SSH_FP_MD5, SSH_FP_HEX);
 | ||||
| +			fp = key_fingerprint(found, SSH_DIGEST_MD5, SSH_FP_HEX);
 | ||||
|  			logit("Found matching %s key: %s", | ||||
|  			    key_type(found), fp); | ||||
|  			free(fp); | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user