xref: /freebsd/crypto/openssh/compat.c (revision b66f2d16a0435b7e7f3edde6101797004ae8d3b9)
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"
26b66f2d16SKris Kennaway RCSID("$OpenBSD: compat.c,v 1.23 2000/09/07 21:13:37 markus Exp $");
27511b41d2SMark Murray 
28511b41d2SMark Murray #include "ssh.h"
29a04a10f8SKris Kennaway #include "packet.h"
30a04a10f8SKris Kennaway #include "xmalloc.h"
31a04a10f8SKris Kennaway #include "compat.h"
32511b41d2SMark Murray 
33511b41d2SMark Murray int compat13 = 0;
34a04a10f8SKris Kennaway int compat20 = 0;
35a04a10f8SKris Kennaway int datafellows = 0;
36511b41d2SMark Murray 
37511b41d2SMark Murray void
38a04a10f8SKris Kennaway enable_compat20(void)
39a04a10f8SKris Kennaway {
40a04a10f8SKris Kennaway 	verbose("Enabling compatibility mode for protocol 2.0");
41a04a10f8SKris Kennaway 	compat20 = 1;
42a04a10f8SKris Kennaway }
43a04a10f8SKris Kennaway void
44511b41d2SMark Murray enable_compat13(void)
45511b41d2SMark Murray {
46511b41d2SMark Murray 	verbose("Enabling compatibility mode for protocol 1.3");
47511b41d2SMark Murray 	compat13 = 1;
48511b41d2SMark Murray }
49a04a10f8SKris Kennaway /* datafellows bug compatibility */
50a04a10f8SKris Kennaway void
51a04a10f8SKris Kennaway compat_datafellows(const char *version)
52a04a10f8SKris Kennaway {
53a04a10f8SKris Kennaway 	int i;
54a04a10f8SKris Kennaway 	size_t len;
55a04a10f8SKris Kennaway 	struct {
56a04a10f8SKris Kennaway 		char	*version;
57a04a10f8SKris Kennaway 		int	bugs;
58a04a10f8SKris Kennaway 	} check[] = {
59a04a10f8SKris Kennaway 		{"2.1.0",	SSH_BUG_SIGBLOB|SSH_BUG_HMAC},
60a04a10f8SKris Kennaway 		{"2.0.1",	SSH_BUG_SIGBLOB|SSH_BUG_HMAC|SSH_BUG_PUBKEYAUTH|SSH_BUG_X11FWD},
61b66f2d16SKris Kennaway 		{"2.",		SSH_BUG_HMAC|SSH_COMPAT_SESSIONID_ENCODING},
62a04a10f8SKris Kennaway 		{NULL,		0}
63a04a10f8SKris Kennaway 	};
64b66f2d16SKris Kennaway 	/* process table, return first match */
65a04a10f8SKris Kennaway 	for (i = 0; check[i].version; i++) {
66a04a10f8SKris Kennaway 		len = strlen(check[i].version);
67a04a10f8SKris Kennaway 		if (strlen(version) >= len &&
68a04a10f8SKris Kennaway 		   (strncmp(version, check[i].version, len) == 0)) {
69a04a10f8SKris Kennaway 			verbose("datafellows: %.200s", version);
70a04a10f8SKris Kennaway 			datafellows = check[i].bugs;
71a04a10f8SKris Kennaway 			return;
72a04a10f8SKris Kennaway 		}
73a04a10f8SKris Kennaway 	}
74a04a10f8SKris Kennaway }
75a04a10f8SKris Kennaway 
76a04a10f8SKris Kennaway #define	SEP	","
77a04a10f8SKris Kennaway int
78a04a10f8SKris Kennaway proto_spec(const char *spec)
79a04a10f8SKris Kennaway {
80b66f2d16SKris Kennaway 	char *s, *p, *q;
81a04a10f8SKris Kennaway 	int ret = SSH_PROTO_UNKNOWN;
82a04a10f8SKris Kennaway 
832632b0c8SKris Kennaway 	if (spec == NULL)
842632b0c8SKris Kennaway 		return ret;
85b66f2d16SKris Kennaway 	q = s = xstrdup(spec);
86b66f2d16SKris Kennaway 	for ((p = strsep(&q, SEP)); p && *p != '\0'; (p = strsep(&q, SEP))) {
87a04a10f8SKris Kennaway 		switch(atoi(p)) {
88a04a10f8SKris Kennaway 		case 1:
89a04a10f8SKris Kennaway 			if (ret == SSH_PROTO_UNKNOWN)
90a04a10f8SKris Kennaway 				ret |= SSH_PROTO_1_PREFERRED;
91a04a10f8SKris Kennaway 			ret |= SSH_PROTO_1;
92a04a10f8SKris Kennaway 			break;
93a04a10f8SKris Kennaway 		case 2:
94a04a10f8SKris Kennaway 			ret |= SSH_PROTO_2;
95a04a10f8SKris Kennaway 			break;
96a04a10f8SKris Kennaway 		default:
97a04a10f8SKris Kennaway 			log("ignoring bad proto spec: '%s'.", p);
98a04a10f8SKris Kennaway 			break;
99a04a10f8SKris Kennaway 		}
100a04a10f8SKris Kennaway 	}
101a04a10f8SKris Kennaway 	xfree(s);
102a04a10f8SKris Kennaway 	return ret;
103a04a10f8SKris Kennaway }
104