xref: /freebsd/crypto/openssh/compat.c (revision 5b9b2fafd4d6d82af10bf630cbfc9393b8ed1d0a)
1511b41d2SMark Murray /*
2b66f2d16SKris Kennaway  * Copyright (c) 1999,2000 Markus Friedl.  All rights reserved.
3511b41d2SMark Murray  *
4511b41d2SMark Murray  * Redistribution and use in source and binary forms, with or without
5511b41d2SMark Murray  * modification, are permitted provided that the following conditions
6511b41d2SMark Murray  * are met:
7511b41d2SMark Murray  * 1. Redistributions of source code must retain the above copyright
8511b41d2SMark Murray  *    notice, this list of conditions and the following disclaimer.
9511b41d2SMark Murray  * 2. Redistributions in binary form must reproduce the above copyright
10511b41d2SMark Murray  *    notice, this list of conditions and the following disclaimer in the
11511b41d2SMark Murray  *    documentation and/or other materials provided with the distribution.
12511b41d2SMark Murray  *
13511b41d2SMark Murray  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14511b41d2SMark Murray  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15511b41d2SMark Murray  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16511b41d2SMark Murray  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17511b41d2SMark Murray  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18511b41d2SMark Murray  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19511b41d2SMark Murray  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20511b41d2SMark Murray  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21511b41d2SMark Murray  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22511b41d2SMark Murray  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23511b41d2SMark Murray  */
24511b41d2SMark Murray 
25511b41d2SMark Murray #include "includes.h"
265b9b2fafSBrian Feldman RCSID("$OpenBSD: compat.c,v 1.27 2000/10/31 09:31:58 markus Exp $");
27511b41d2SMark Murray 
28511b41d2SMark Murray #include "ssh.h"
29a04a10f8SKris Kennaway #include "packet.h"
30a04a10f8SKris Kennaway #include "xmalloc.h"
31a04a10f8SKris Kennaway #include "compat.h"
325b9b2fafSBrian Feldman #include <regex.h>
33511b41d2SMark Murray 
34511b41d2SMark Murray int compat13 = 0;
35a04a10f8SKris Kennaway int compat20 = 0;
36a04a10f8SKris Kennaway int datafellows = 0;
37511b41d2SMark Murray 
38511b41d2SMark Murray void
39a04a10f8SKris Kennaway enable_compat20(void)
40a04a10f8SKris Kennaway {
41a04a10f8SKris Kennaway 	verbose("Enabling compatibility mode for protocol 2.0");
42a04a10f8SKris Kennaway 	compat20 = 1;
43a04a10f8SKris Kennaway }
44a04a10f8SKris Kennaway void
45511b41d2SMark Murray enable_compat13(void)
46511b41d2SMark Murray {
47511b41d2SMark Murray 	verbose("Enabling compatibility mode for protocol 1.3");
48511b41d2SMark Murray 	compat13 = 1;
49511b41d2SMark Murray }
50a04a10f8SKris Kennaway /* datafellows bug compatibility */
51a04a10f8SKris Kennaway void
52a04a10f8SKris Kennaway compat_datafellows(const char *version)
53a04a10f8SKris Kennaway {
545b9b2fafSBrian Feldman 	int i, ret;
555b9b2fafSBrian Feldman 	char ebuf[1024];
565b9b2fafSBrian Feldman 	regex_t reg;
575b9b2fafSBrian Feldman 	static struct {
585b9b2fafSBrian Feldman 		char	*pat;
59a04a10f8SKris Kennaway 		int	bugs;
60a04a10f8SKris Kennaway 	} check[] = {
615b9b2fafSBrian Feldman 		{ "^OpenSSH[-_]2\\.[012]",	SSH_OLD_SESSIONID },
625b9b2fafSBrian Feldman 		{ "MindTerm",		0 },
635b9b2fafSBrian Feldman 		{ "^2\\.1\\.0 ",	SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
645b9b2fafSBrian Feldman 					SSH_OLD_SESSIONID },
655b9b2fafSBrian Feldman 		{ "^2\\.0\\.",		SSH_BUG_SIGBLOB|SSH_BUG_HMAC|
665b9b2fafSBrian Feldman 					SSH_OLD_SESSIONID|
675b9b2fafSBrian Feldman 					SSH_BUG_PUBKEYAUTH|SSH_BUG_X11FWD },
685b9b2fafSBrian Feldman 		{ "^2\\.[23]\\.0 ",	SSH_BUG_HMAC},
695b9b2fafSBrian Feldman 		{ "^2\\.[2-9]\\.",	0 },
705b9b2fafSBrian Feldman 		{ "^2\\.4$",		SSH_OLD_SESSIONID}, /* Van Dyke */
715b9b2fafSBrian Feldman 		{ "^3\\.0 SecureCRT",	SSH_OLD_SESSIONID},
725b9b2fafSBrian Feldman 		{ "^1\\.7 SecureFX",	SSH_OLD_SESSIONID},
735b9b2fafSBrian Feldman 		{ "^2\\.",		SSH_BUG_HMAC},	/* XXX fallback */
74a04a10f8SKris Kennaway 		{ NULL,			0 }
75a04a10f8SKris Kennaway 	};
76b66f2d16SKris Kennaway 	/* process table, return first match */
775b9b2fafSBrian Feldman 	for (i = 0; check[i].pat; i++) {
785b9b2fafSBrian Feldman 		ret = regcomp(&reg, check[i].pat, REG_EXTENDED|REG_NOSUB);
795b9b2fafSBrian Feldman 		if (ret != 0) {
805b9b2fafSBrian Feldman 			regerror(ret, &reg, ebuf, sizeof(ebuf));
815b9b2fafSBrian Feldman 			ebuf[sizeof(ebuf)-1] = '\0';
825b9b2fafSBrian Feldman 			error("regerror: %s", ebuf);
835b9b2fafSBrian Feldman 			continue;
845b9b2fafSBrian Feldman 		}
855b9b2fafSBrian Feldman 		ret = regexec(&reg, version, 0, NULL, 0);
865b9b2fafSBrian Feldman 		regfree(&reg);
875b9b2fafSBrian Feldman 		if (ret == 0) {
885b9b2fafSBrian Feldman 			debug("match: %s pat %s\n", version, check[i].pat);
89a04a10f8SKris Kennaway 			datafellows = check[i].bugs;
90a04a10f8SKris Kennaway 			return;
91a04a10f8SKris Kennaway 		}
92a04a10f8SKris Kennaway 	}
935b9b2fafSBrian Feldman 	debug("no match: %s", version);
94a04a10f8SKris Kennaway }
95a04a10f8SKris Kennaway 
96a04a10f8SKris Kennaway #define	SEP	","
97a04a10f8SKris Kennaway int
98a04a10f8SKris Kennaway proto_spec(const char *spec)
99a04a10f8SKris Kennaway {
100b66f2d16SKris Kennaway 	char *s, *p, *q;
101a04a10f8SKris Kennaway 	int ret = SSH_PROTO_UNKNOWN;
102a04a10f8SKris Kennaway 
1032632b0c8SKris Kennaway 	if (spec == NULL)
1042632b0c8SKris Kennaway 		return ret;
105b66f2d16SKris Kennaway 	q = s = xstrdup(spec);
106b66f2d16SKris Kennaway 	for ((p = strsep(&q, SEP)); p && *p != '\0'; (p = strsep(&q, SEP))) {
107a04a10f8SKris Kennaway 		switch(atoi(p)) {
108a04a10f8SKris Kennaway 		case 1:
109a04a10f8SKris Kennaway 			if (ret == SSH_PROTO_UNKNOWN)
110a04a10f8SKris Kennaway 				ret |= SSH_PROTO_1_PREFERRED;
111a04a10f8SKris Kennaway 			ret |= SSH_PROTO_1;
112a04a10f8SKris Kennaway 			break;
113a04a10f8SKris Kennaway 		case 2:
114a04a10f8SKris Kennaway 			ret |= SSH_PROTO_2;
115a04a10f8SKris Kennaway 			break;
116a04a10f8SKris Kennaway 		default:
117a04a10f8SKris Kennaway 			log("ignoring bad proto spec: '%s'.", p);
118a04a10f8SKris Kennaway 			break;
119a04a10f8SKris Kennaway 		}
120a04a10f8SKris Kennaway 	}
121a04a10f8SKris Kennaway 	xfree(s);
122a04a10f8SKris Kennaway 	return ret;
123a04a10f8SKris Kennaway }
124