ssh-keyscan for ssh2 (was Re: openssh-2.9p1)

mouring at etoh.eviladmin.org mouring at etoh.eviladmin.org
Sat May 19 06:26:12 EST 2001


When I mean by missing.. How do I pull DSAv2 keys from a remote machine
using your patch?

What is needed is:

-1 -- RSA Protocol 1 Keys
-R -- RSA Protocol 2 Keys
-D -- DSA Protocol 2 Keys


This is a patch which is against your current version

--- ../xxh/ssh-keyscan.c	Fri May 18 10:26:38 2001
+++ ssh-keyscan.c	Fri May 18 10:27:20 2001
@@ -44,7 +44,7 @@
 int IPv4or6 = AF_UNSPEC;
 #endif

-int get_keytypes = 1;		/* Get only RSA keys by default */
+int get_keytypes = 1;		/* Get only RSA1 keys by default */

 #define MAXMAXFD 256

@@ -78,7 +78,7 @@
 	int c_plen;		/* Packet length field for ssh packet */
 	int c_len;		/* Total bytes which must be read. */
 	int c_off;		/* Length of data read so far. */
-	int c_keytypes;		/* bits: 1 = get RSA, 2 = get DSA */
+	int c_keytypes;		/* bits: 1 = RSA1, 2 = DSA, 4 = RSA */
 	char *c_namebase;	/* Address to free for c_name and c_namelist */
 	char *c_name;		/* Hostname of connection for errors */
 	char *c_namelist;	/* Pointer to other possible addresses */
@@ -319,12 +319,16 @@
 }

 Key *
-keygrab_ssh2(con *c)
+keygrab_ssh2(con *c, int keytypes)
 {
 	Key *key;

 	packet_set_connection(c->c_fd, c->c_fd);
 	packet_set_ssh2_format();
+	myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = "ssh-rsa";
+	if (keytypes == 2)
+		myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = "ssh-dss";
+
 	c->c_kex = kex_setup(myproposal);
 	c->c_kex->check_host_key = hostjump;

@@ -496,7 +500,7 @@
 	}
 	*cp = '\0';
 	fprintf(stderr, "# %s %s\n", c->c_name, buf);
-	if (!(c->c_keytypes & 1)) {
+	if (c->c_keytypes == 2 || c->c_keytypes == 4) {
 		char remote_version[sizeof buf];

 		if (sscanf(buf, "SSH-%*d.%*d-%[^\n]\n", remote_version) == 1)
@@ -512,12 +516,11 @@
 		confree(s);
 		return;
 	}
-	if (!(c->c_keytypes & 1)) {
-		keyprint(c, keygrab_ssh2(c));
-		c->c_keytypes &= ~2;
+	if (c->c_keytypes == 2 || c->c_keytypes == 4) {
+		keyprint(c, keygrab_ssh2(c,c->c_keytypes));
 		confree(s);
 		return;
-	}
+	}
 	c->c_status = CS_SIZE;
 	contouch(s);
 }
@@ -625,7 +628,6 @@
 	static Linebuf *lb;
 	char *fname;
 	int first_proto_option = 1;
-
 	for (;;) {
 		if (lb) {
 			char *line;
@@ -659,12 +661,25 @@
 				lb = Linebuf_alloc(fname, error);
 				goto double_break;
 			case '1':
-			case '2':
 				if (first_proto_option) {
 					get_keytypes = 0;
 					first_proto_option = 0;
 				}
-				get_keytypes |= argv[argno][0] - '0';
+				get_keytypes |= 1;
+				break;
+			case 'D':
+				if (first_proto_option) {
+					get_keytypes = 0;
+					first_proto_option = 0;
+				}
+				get_keytypes |= 2;
+				break;
+			case 'R':
+				if (first_proto_option) {
+					get_keytypes = 0;
+					first_proto_option = 0;
+				}
+				get_keytypes |= 4;
 				break;
 			case '4':
 				IPv4or6 = AF_INET;
@@ -686,7 +701,7 @@
 void
 usage(void)
 {
-	fatal("usage: %s [-t timeout] { [-1|-2|-4|-6] [--] host | -f file } ...",
+	fatal("usage: %s [-t timeout] { [-1|-R|-D|-4|-6] [--] host | -f file } ...",
 	    __progname);
 	return;
 }




More information about the openssh-unix-dev mailing list