xref: /freebsd/crypto/openssh/compat.c (revision 77a0943ded95b9e6438f7db70c4a28e4d93946d4)
1 /*
2  * Copyright (c) 1999,2000 Markus Friedl.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
15  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
16  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
17  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
18  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
19  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
20  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
21  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
22  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
23  */
24 
25 #include "includes.h"
26 RCSID("$OpenBSD: compat.c,v 1.23 2000/09/07 21:13:37 markus Exp $");
27 
28 #include "ssh.h"
29 #include "packet.h"
30 #include "xmalloc.h"
31 #include "compat.h"
32 
33 int compat13 = 0;
34 int compat20 = 0;
35 int datafellows = 0;
36 
37 void
38 enable_compat20(void)
39 {
40 	verbose("Enabling compatibility mode for protocol 2.0");
41 	compat20 = 1;
42 }
43 void
44 enable_compat13(void)
45 {
46 	verbose("Enabling compatibility mode for protocol 1.3");
47 	compat13 = 1;
48 }
49 /* datafellows bug compatibility */
50 void
51 compat_datafellows(const char *version)
52 {
53 	int i;
54 	size_t len;
55 	struct {
56 		char	*version;
57 		int	bugs;
58 	} check[] = {
59 		{"2.1.0",	SSH_BUG_SIGBLOB|SSH_BUG_HMAC},
60 		{"2.0.1",	SSH_BUG_SIGBLOB|SSH_BUG_HMAC|SSH_BUG_PUBKEYAUTH|SSH_BUG_X11FWD},
61 		{"2.",		SSH_BUG_HMAC|SSH_COMPAT_SESSIONID_ENCODING},
62 		{NULL,		0}
63 	};
64 	/* process table, return first match */
65 	for (i = 0; check[i].version; i++) {
66 		len = strlen(check[i].version);
67 		if (strlen(version) >= len &&
68 		   (strncmp(version, check[i].version, len) == 0)) {
69 			verbose("datafellows: %.200s", version);
70 			datafellows = check[i].bugs;
71 			return;
72 		}
73 	}
74 }
75 
76 #define	SEP	","
77 int
78 proto_spec(const char *spec)
79 {
80 	char *s, *p, *q;
81 	int ret = SSH_PROTO_UNKNOWN;
82 
83 	if (spec == NULL)
84 		return ret;
85 	q = s = xstrdup(spec);
86 	for ((p = strsep(&q, SEP)); p && *p != '\0'; (p = strsep(&q, SEP))) {
87 		switch(atoi(p)) {
88 		case 1:
89 			if (ret == SSH_PROTO_UNKNOWN)
90 				ret |= SSH_PROTO_1_PREFERRED;
91 			ret |= SSH_PROTO_1;
92 			break;
93 		case 2:
94 			ret |= SSH_PROTO_2;
95 			break;
96 		default:
97 			log("ignoring bad proto spec: '%s'.", p);
98 			break;
99 		}
100 	}
101 	xfree(s);
102 	return ret;
103 }
104