mirror of
				https://github.com/PowerShell/openssh-portable.git
				synced 2025-11-04 05:24:08 +01:00 
			
		
		
		
	upstream: be more strict in parsing key type names. Only allow
shortnames (e.g "rsa") in user-interface code and require full SSH protocol names (e.g. "ssh-rsa") everywhere else. Prompted by bz3725; ok markus@ OpenBSD-Commit-ID: b3d8de9dac37992eab78adbf84fab2fe0d84b187
This commit is contained in:
		
							parent
							
								
									ef8472309a
								
							
						
					
					
						commit
						13cc78d016
					
				
							
								
								
									
										10
									
								
								ssh-keygen.c
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								ssh-keygen.c
									
									
									
									
									
								
							@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $OpenBSD: ssh-keygen.c,v 1.473 2024/08/15 00:51:51 djm Exp $ */
 | 
					/* $OpenBSD: ssh-keygen.c,v 1.474 2024/09/04 05:33:34 djm Exp $ */
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Author: Tatu Ylonen <ylo@cs.hut.fi>
 | 
					 * Author: Tatu Ylonen <ylo@cs.hut.fi>
 | 
				
			||||||
 * Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
 | 
					 * Copyright (c) 1994 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
 | 
				
			||||||
@ -261,7 +261,7 @@ ask_filename(struct passwd *pw, const char *prompt)
 | 
				
			|||||||
	if (key_type_name == NULL)
 | 
						if (key_type_name == NULL)
 | 
				
			||||||
		name = _PATH_SSH_CLIENT_ID_ED25519;
 | 
							name = _PATH_SSH_CLIENT_ID_ED25519;
 | 
				
			||||||
	else {
 | 
						else {
 | 
				
			||||||
		switch (sshkey_type_from_name(key_type_name)) {
 | 
							switch (sshkey_type_from_shortname(key_type_name)) {
 | 
				
			||||||
#ifdef WITH_DSA
 | 
					#ifdef WITH_DSA
 | 
				
			||||||
		case KEY_DSA_CERT:
 | 
							case KEY_DSA_CERT:
 | 
				
			||||||
		case KEY_DSA:
 | 
							case KEY_DSA:
 | 
				
			||||||
@ -1140,7 +1140,7 @@ do_gen_all_hostkeys(struct passwd *pw)
 | 
				
			|||||||
		}
 | 
							}
 | 
				
			||||||
		printf("%s ", key_types[i].key_type_display);
 | 
							printf("%s ", key_types[i].key_type_display);
 | 
				
			||||||
		fflush(stdout);
 | 
							fflush(stdout);
 | 
				
			||||||
		type = sshkey_type_from_name(key_types[i].key_type);
 | 
							type = sshkey_type_from_shortname(key_types[i].key_type);
 | 
				
			||||||
		if ((fd = mkstemp(prv_tmp)) == -1) {
 | 
							if ((fd = mkstemp(prv_tmp)) == -1) {
 | 
				
			||||||
			error("Could not save your private key in %s: %s",
 | 
								error("Could not save your private key in %s: %s",
 | 
				
			||||||
			    prv_tmp, strerror(errno));
 | 
								    prv_tmp, strerror(errno));
 | 
				
			||||||
@ -1846,7 +1846,7 @@ do_ca_sign(struct passwd *pw, const char *ca_key_path, int prefer_agent,
 | 
				
			|||||||
	free(tmp);
 | 
						free(tmp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (key_type_name != NULL) {
 | 
						if (key_type_name != NULL) {
 | 
				
			||||||
		if (sshkey_type_from_name(key_type_name) != ca->type) {
 | 
							if (sshkey_type_from_shortname(key_type_name) != ca->type) {
 | 
				
			||||||
			fatal("CA key type %s doesn't match specified %s",
 | 
								fatal("CA key type %s doesn't match specified %s",
 | 
				
			||||||
			    sshkey_ssh_name(ca), key_type_name);
 | 
								    sshkey_ssh_name(ca), key_type_name);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
@ -3836,7 +3836,7 @@ main(int argc, char **argv)
 | 
				
			|||||||
	if (key_type_name == NULL)
 | 
						if (key_type_name == NULL)
 | 
				
			||||||
		key_type_name = DEFAULT_KEY_TYPE_NAME;
 | 
							key_type_name = DEFAULT_KEY_TYPE_NAME;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	type = sshkey_type_from_name(key_type_name);
 | 
						type = sshkey_type_from_shortname(key_type_name);
 | 
				
			||||||
	type_bits_valid(type, key_type_name, &bits);
 | 
						type_bits_valid(type, key_type_name, &bits);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (!quiet)
 | 
						if (!quiet)
 | 
				
			||||||
 | 
				
			|||||||
@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $OpenBSD: ssh-keyscan.c,v 1.159 2024/09/02 12:13:56 djm Exp $ */
 | 
					/* $OpenBSD: ssh-keyscan.c,v 1.160 2024/09/04 05:33:34 djm Exp $ */
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright 1995, 1996 by David Mazieres <dm@lcs.mit.edu>.
 | 
					 * Copyright 1995, 1996 by David Mazieres <dm@lcs.mit.edu>.
 | 
				
			||||||
 *
 | 
					 *
 | 
				
			||||||
@ -754,7 +754,7 @@ main(int argc, char **argv)
 | 
				
			|||||||
			get_keytypes = 0;
 | 
								get_keytypes = 0;
 | 
				
			||||||
			tname = strtok(optarg, ",");
 | 
								tname = strtok(optarg, ",");
 | 
				
			||||||
			while (tname) {
 | 
								while (tname) {
 | 
				
			||||||
				int type = sshkey_type_from_name(tname);
 | 
									int type = sshkey_type_from_shortname(tname);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
				switch (type) {
 | 
									switch (type) {
 | 
				
			||||||
#ifdef WITH_DSA
 | 
					#ifdef WITH_DSA
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										24
									
								
								sshkey.c
									
									
									
									
									
								
							
							
						
						
									
										24
									
								
								sshkey.c
									
									
									
									
									
								
							@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $OpenBSD: sshkey.c,v 1.145 2024/08/20 11:10:04 djm Exp $ */
 | 
					/* $OpenBSD: sshkey.c,v 1.146 2024/09/04 05:33:34 djm Exp $ */
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
 | 
					 * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
 | 
				
			||||||
 * Copyright (c) 2008 Alexander von Gernler.  All rights reserved.
 | 
					 * Copyright (c) 2008 Alexander von Gernler.  All rights reserved.
 | 
				
			||||||
@ -249,22 +249,36 @@ sshkey_ssh_name_plain(const struct sshkey *k)
 | 
				
			|||||||
	    k->ecdsa_nid);
 | 
						    k->ecdsa_nid);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					static int
 | 
				
			||||||
sshkey_type_from_name(const char *name)
 | 
					type_from_name(const char *name, int allow_short)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	int i;
 | 
						int i;
 | 
				
			||||||
	const struct sshkey_impl *impl;
 | 
						const struct sshkey_impl *impl;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; keyimpls[i] != NULL; i++) {
 | 
						for (i = 0; keyimpls[i] != NULL; i++) {
 | 
				
			||||||
		impl = keyimpls[i];
 | 
							impl = keyimpls[i];
 | 
				
			||||||
 | 
							if (impl->name != NULL && strcmp(name, impl->name) == 0)
 | 
				
			||||||
 | 
								return impl->type;
 | 
				
			||||||
		/* Only allow shortname matches for plain key types */
 | 
							/* Only allow shortname matches for plain key types */
 | 
				
			||||||
		if ((impl->name != NULL && strcmp(name, impl->name) == 0) ||
 | 
							if (allow_short && !impl->cert && impl->shortname != NULL &&
 | 
				
			||||||
		    (!impl->cert && strcasecmp(impl->shortname, name) == 0))
 | 
							    strcasecmp(impl->shortname, name) == 0)
 | 
				
			||||||
			return impl->type;
 | 
								return impl->type;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return KEY_UNSPEC;
 | 
						return KEY_UNSPEC;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					sshkey_type_from_name(const char *name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return type_from_name(name, 0);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					sshkey_type_from_shortname(const char *name)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						return type_from_name(name, 1);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static int
 | 
					static int
 | 
				
			||||||
key_type_is_ecdsa_variant(int type)
 | 
					key_type_is_ecdsa_variant(int type)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
 | 
				
			|||||||
							
								
								
									
										3
									
								
								sshkey.h
									
									
									
									
									
								
							
							
						
						
									
										3
									
								
								sshkey.h
									
									
									
									
									
								
							@ -1,4 +1,4 @@
 | 
				
			|||||||
/* $OpenBSD: sshkey.h,v 1.64 2024/08/15 00:51:51 djm Exp $ */
 | 
					/* $OpenBSD: sshkey.h,v 1.65 2024/09/04 05:33:34 djm Exp $ */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
 | 
					 * Copyright (c) 2000, 2001 Markus Friedl.  All rights reserved.
 | 
				
			||||||
@ -224,6 +224,7 @@ int		 sshkey_shield_private(struct sshkey *);
 | 
				
			|||||||
int		 sshkey_unshield_private(struct sshkey *);
 | 
					int		 sshkey_unshield_private(struct sshkey *);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int	 sshkey_type_from_name(const char *);
 | 
					int	 sshkey_type_from_name(const char *);
 | 
				
			||||||
 | 
					int	 sshkey_type_from_shortname(const char *);
 | 
				
			||||||
int	 sshkey_is_cert(const struct sshkey *);
 | 
					int	 sshkey_is_cert(const struct sshkey *);
 | 
				
			||||||
int	 sshkey_is_sk(const struct sshkey *);
 | 
					int	 sshkey_is_sk(const struct sshkey *);
 | 
				
			||||||
int	 sshkey_type_is_cert(int);
 | 
					int	 sshkey_type_is_cert(int);
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user