[PATCH] Place algorithm at head of default list

Damien Miller djm at mindrot.org
Thu Apr 4 06:28:10 AEDT 2019


no objection, but this and your scp change will have to wait until after
release (both openssh-8.0 and OpenBSD-6.5)

On Sun, 31 Mar 2019, Christian Weisgerber wrote:

> ssh_config(5) and sshd_config(5) already allow adding '+' and
> removing '-' an algorithm from the default list.  Oddly, I mostly
> find myself wanting to prefer an algorithm, i.e., place it at the
> head of the list without removing anything.  The patch below adds
> this ability.  To prefer algorithms, prefix them with '^'.  E.g.:
> 
>   HostKeyAlgorithms ^ssh-ed25519
>   Ciphers ^aes128-gcm at openssh.com,aes256-gcm at openssh.com
> 
> 
> Index: kex.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/ssh/kex.c,v
> retrieving revision 1.150
> diff -u -p -r1.150 kex.c
> --- kex.c	21 Jan 2019 12:08:13 -0000	1.150
> +++ kex.c	31 Mar 2019 09:21:04 -0000
> @@ -202,8 +202,9 @@ kex_names_cat(const char *a, const char 
>  /*
>   * Assemble a list of algorithms from a default list and a string from a
>   * configuration file. The user-provided string may begin with '+' to
> - * indicate that it should be appended to the default or '-' that the
> - * specified names should be removed.
> + * indicate that it should be appended to the default, '-' that the
> + * specified names should be removed, or '^' that they should be placed
> + * at the head.
>   */
>  int
>  kex_assemble_names(char **listp, const char *def, const char *all)
> @@ -237,6 +238,14 @@ kex_assemble_names(char **listp, const c
>  		free(list);
>  		/* filtering has already been done */
>  		return 0;
> +	} else if (*list == '^') {
> +		/* Place names at head of default list */
> +		if ((tmp = kex_names_cat(list + 1, def)) == NULL) {
> +			r = SSH_ERR_ALLOC_FAIL;
> +			goto fail;
> +		}
> +		free(list);
> +		list = tmp;
>  	} else {
>  		/* Explicit list, overrides default - just use "list" as is */
>  	}
> Index: readconf.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/ssh/readconf.c,v
> retrieving revision 1.304
> diff -u -p -r1.304 readconf.c
> --- readconf.c	1 Mar 2019 02:08:50 -0000	1.304
> +++ readconf.c	31 Mar 2019 08:59:57 -0000
> @@ -1179,7 +1179,8 @@ parse_int:
>  		arg = strdelim(&s);
>  		if (!arg || *arg == '\0')
>  			fatal("%.200s line %d: Missing argument.", filename, linenum);
> -		if (*arg != '-' && !ciphers_valid(*arg == '+' ? arg + 1 : arg))
> +		if (*arg != '-' &&
> +		    !ciphers_valid(*arg == '+' || *arg == '^' ? arg + 1 : arg))
>  			fatal("%.200s line %d: Bad SSH2 cipher spec '%s'.",
>  			    filename, linenum, arg ? arg : "<NONE>");
>  		if (*activep && options->ciphers == NULL)
> @@ -1190,7 +1191,8 @@ parse_int:
>  		arg = strdelim(&s);
>  		if (!arg || *arg == '\0')
>  			fatal("%.200s line %d: Missing argument.", filename, linenum);
> -		if (*arg != '-' && !mac_valid(*arg == '+' ? arg + 1 : arg))
> +		if (*arg != '-' &&
> +		    !mac_valid(*arg == '+' || *arg == '^' ? arg + 1 : arg))
>  			fatal("%.200s line %d: Bad SSH2 Mac spec '%s'.",
>  			    filename, linenum, arg ? arg : "<NONE>");
>  		if (*activep && options->macs == NULL)
> @@ -1203,7 +1205,8 @@ parse_int:
>  			fatal("%.200s line %d: Missing argument.",
>  			    filename, linenum);
>  		if (*arg != '-' &&
> -		    !kex_names_valid(*arg == '+' ? arg + 1 : arg))
> +		    !kex_names_valid(*arg == '+' || *arg == '^' ?
> +		    arg + 1 : arg))
>  			fatal("%.200s line %d: Bad SSH2 KexAlgorithms '%s'.",
>  			    filename, linenum, arg ? arg : "<NONE>");
>  		if (*activep && options->kex_algorithms == NULL)
> @@ -1218,7 +1221,8 @@ parse_keytypes:
>  			fatal("%.200s line %d: Missing argument.",
>  			    filename, linenum);
>  		if (*arg != '-' &&
> -		    !sshkey_names_valid2(*arg == '+' ? arg + 1 : arg, 1))
> +		    !sshkey_names_valid2(*arg == '+' || *arg == '^' ?
> +		    arg + 1 : arg, 1))
>  			fatal("%s line %d: Bad key types '%s'.",
>  				filename, linenum, arg ? arg : "<NONE>");
>  		if (*activep && *charptr == NULL)
> Index: servconf.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/ssh/servconf.c,v
> retrieving revision 1.350
> diff -u -p -r1.350 servconf.c
> --- servconf.c	25 Mar 2019 22:33:44 -0000	1.350
> +++ servconf.c	31 Mar 2019 08:59:14 -0000
> @@ -1379,7 +1379,8 @@ process_server_config_line(ServerOptions
>  			fatal("%s line %d: Missing argument.",
>  			    filename, linenum);
>  		if (*arg != '-' &&
> -		    !sshkey_names_valid2(*arg == '+' ? arg + 1 : arg, 1))
> +		    !sshkey_names_valid2(*arg == '+' || *arg == '^' ?
> +		    arg + 1 : arg, 1))
>  			fatal("%s line %d: Bad key types '%s'.",
>  			    filename, linenum, arg ? arg : "<NONE>");
>  		if (*activep && *charptr == NULL)
> @@ -1650,7 +1651,8 @@ process_server_config_line(ServerOptions
>  		arg = strdelim(&cp);
>  		if (!arg || *arg == '\0')
>  			fatal("%s line %d: Missing argument.", filename, linenum);
> -		if (*arg != '-' && !ciphers_valid(*arg == '+' ? arg + 1 : arg))
> +		if (*arg != '-' &&
> +		    !ciphers_valid(*arg == '+' || *arg == '^' ? arg + 1 : arg))
>  			fatal("%s line %d: Bad SSH2 cipher spec '%s'.",
>  			    filename, linenum, arg ? arg : "<NONE>");
>  		if (options->ciphers == NULL)
> @@ -1661,7 +1663,8 @@ process_server_config_line(ServerOptions
>  		arg = strdelim(&cp);
>  		if (!arg || *arg == '\0')
>  			fatal("%s line %d: Missing argument.", filename, linenum);
> -		if (*arg != '-' && !mac_valid(*arg == '+' ? arg + 1 : arg))
> +		if (*arg != '-' &&
> +		    !mac_valid(*arg == '+' || *arg == '^' ? arg + 1 : arg))
>  			fatal("%s line %d: Bad SSH2 mac spec '%s'.",
>  			    filename, linenum, arg ? arg : "<NONE>");
>  		if (options->macs == NULL)
> @@ -1674,7 +1677,8 @@ process_server_config_line(ServerOptions
>  			fatal("%s line %d: Missing argument.",
>  			    filename, linenum);
>  		if (*arg != '-' &&
> -		    !kex_names_valid(*arg == '+' ? arg + 1 : arg))
> +		    !kex_names_valid(*arg == '+' || *arg == '^' ?
> +		    arg + 1 : arg))
>  			fatal("%s line %d: Bad SSH2 KexAlgorithms '%s'.",
>  			    filename, linenum, arg ? arg : "<NONE>");
>  		if (options->kex_algorithms == NULL)
> Index: ssh.c
> ===================================================================
> RCS file: /cvs/src/usr.bin/ssh/ssh.c,v
> retrieving revision 1.500
> diff -u -p -r1.500 ssh.c
> --- ssh.c	19 Jan 2019 21:43:56 -0000	1.500
> +++ ssh.c	31 Mar 2019 09:01:29 -0000
> @@ -848,7 +848,7 @@ main(int ac, char **av)
>  			}
>  			break;
>  		case 'c':
> -			if (!ciphers_valid(*optarg == '+' ?
> +			if (!ciphers_valid(*optarg == '+' || *optarg == '^' ?
>  			    optarg + 1 : optarg)) {
>  				fprintf(stderr, "Unknown cipher type '%s'\n",
>  				    optarg);
> Index: ssh_config.5
> ===================================================================
> RCS file: /cvs/src/usr.bin/ssh/ssh_config.5,v
> retrieving revision 1.292
> diff -u -p -r1.292 ssh_config.5
> --- ssh_config.5	1 Mar 2019 02:16:47 -0000	1.292
> +++ ssh_config.5	31 Mar 2019 09:40:24 -0000
> @@ -430,6 +430,10 @@ If the specified value begins with a
>  .Sq -
>  character, then the specified ciphers (including wildcards) will be removed
>  from the default set instead of replacing them.
> +If the specified value begins with a
> +.Sq ^
> +character, then the specified ciphers will be placed at the head of the
> +default set.
>  .Pp
>  The supported ciphers are:
>  .Bd -literal -offset indent
> @@ -794,6 +798,10 @@ If the specified value begins with a
>  .Sq -
>  character, then the specified key types (including wildcards) will be removed
>  from the default set instead of replacing them.
> +If the specified value begins with a
> +.Sq ^
> +character, then the specified key types will be placed at the head of the
> +default set.
>  The default for this option is:
>  .Bd -literal -offset 3n
>  ecdsa-sha2-nistp256-cert-v01 at openssh.com,
> @@ -822,6 +830,10 @@ If the specified value begins with a
>  .Sq -
>  character, then the specified key types (including wildcards) will be removed
>  from the default set instead of replacing them.
> +If the specified value begins with a
> +.Sq ^
> +character, then the specified key types will be placed at the head of the
> +default set.
>  The default for this option is:
>  .Bd -literal -offset 3n
>  ecdsa-sha2-nistp256-cert-v01 at openssh.com,
> @@ -1052,6 +1064,10 @@ If the specified value begins with a
>  .Sq -
>  character, then the specified methods (including wildcards) will be removed
>  from the default set instead of replacing them.
> +If the specified value begins with a
> +.Sq ^
> +character, then the specified methods will be placed at the head of the
> +default set.
>  The default is:
>  .Bd -literal -offset indent
>  curve25519-sha256,curve25519-sha256 at libssh.org,
> @@ -1133,6 +1149,10 @@ If the specified value begins with a
>  .Sq -
>  character, then the specified algorithms (including wildcards) will be removed
>  from the default set instead of replacing them.
> +If the specified value begins with a
> +.Sq ^
> +character, then the specified algorithms will be placed at the head of the
> +default set.
>  .Pp
>  The algorithms that contain
>  .Qq -etm
> @@ -1290,6 +1310,10 @@ If the specified value begins with a
>  .Sq -
>  character, then the specified key types (including wildcards) will be removed
>  from the default set instead of replacing them.
> +If the specified value begins with a
> +.Sq ^
> +character, then the specified key types will be placed at the head of the
> +default set.
>  The default for this option is:
>  .Bd -literal -offset 3n
>  ecdsa-sha2-nistp256-cert-v01 at openssh.com,
> Index: sshd_config.5
> ===================================================================
> RCS file: /cvs/src/usr.bin/ssh/sshd_config.5,v
> retrieving revision 1.284
> diff -u -p -r1.284 sshd_config.5
> --- sshd_config.5	22 Mar 2019 20:58:34 -0000	1.284
> +++ sshd_config.5	31 Mar 2019 09:41:21 -0000
> @@ -466,6 +466,10 @@ If the specified value begins with a
>  .Sq -
>  character, then the specified ciphers (including wildcards) will be removed
>  from the default set instead of replacing them.
> +If the specified value begins with a
> +.Sq ^
> +character, then the specified ciphers will be placed at the head of the
> +default set.
>  .Pp
>  The supported ciphers are:
>  .Pp
> @@ -680,6 +684,10 @@ If the specified value begins with a
>  .Sq -
>  character, then the specified key types (including wildcards) will be removed
>  from the default set instead of replacing them.
> +If the specified value begins with a
> +.Sq ^
> +character, then the specified key types will be placed at the head of the
> +default set.
>  The default for this option is:
>  .Bd -literal -offset 3n
>  ecdsa-sha2-nistp256-cert-v01 at openssh.com,
> @@ -885,6 +893,10 @@ If the specified value begins with a
>  .Sq -
>  character, then the specified methods (including wildcards) will be removed
>  from the default set instead of replacing them.
> +If the specified value begins with a
> +.Sq ^
> +character, then the specified methods will be placed at the head of the
> +default set.
>  The supported algorithms are:
>  .Pp
>  .Bl -item -compact -offset indent
> @@ -1002,6 +1014,10 @@ If the specified value begins with a
>  .Sq -
>  character, then the specified algorithms (including wildcards) will be removed
>  from the default set instead of replacing them.
> +If the specified value begins with a
> +.Sq ^
> +character, then the specified algorithms will be placed at the head of the
> +default set.
>  .Pp
>  The algorithms that contain
>  .Qq -etm
> @@ -1407,6 +1423,10 @@ If the specified value begins with a
>  .Sq -
>  character, then the specified key types (including wildcards) will be removed
>  from the default set instead of replacing them.
> +If the specified value begins with a
> +.Sq ^
> +character, then the specified key types will be placed at the head of the
> +default set.
>  The default for this option is:
>  .Bd -literal -offset 3n
>  ecdsa-sha2-nistp256-cert-v01 at openssh.com,
> -- 
> Christian "naddy" Weisgerber                          naddy at mips.inka.de
> _______________________________________________
> openssh-unix-dev mailing list
> openssh-unix-dev at mindrot.org
> https://lists.mindrot.org/mailman/listinfo/openssh-unix-dev
> 


More information about the openssh-unix-dev mailing list