xref: /freebsd/crypto/openssh/compat.c (revision b601c69bdbe8755d26570261d7fd4c02ee4eff74)
1 /*
2  * Copyright (c) 1999 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  * 3. All advertising materials mentioning features or use of this software
13  *    must display the following acknowledgement:
14  *      This product includes software developed by Markus Friedl.
15  * 4. The name of the author may not be used to endorse or promote products
16  *    derived from this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
19  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
20  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
21  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
22  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
23  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
24  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
25  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  */
29 
30 #include "includes.h"
31 RCSID("$Id: compat.c,v 1.14 2000/05/22 18:42:01 markus Exp $");
32 
33 #include "ssh.h"
34 #include "packet.h"
35 #include "xmalloc.h"
36 #include "compat.h"
37 
38 int compat13 = 0;
39 int compat20 = 0;
40 int datafellows = 0;
41 
42 void
43 enable_compat20(void)
44 {
45 	verbose("Enabling compatibility mode for protocol 2.0");
46 	compat20 = 1;
47 }
48 void
49 enable_compat13(void)
50 {
51 	verbose("Enabling compatibility mode for protocol 1.3");
52 	compat13 = 1;
53 }
54 /* datafellows bug compatibility */
55 void
56 compat_datafellows(const char *version)
57 {
58 	int i;
59 	size_t len;
60 	struct {
61 		char	*version;
62 		int	bugs;
63 	} check[] = {
64 		{"2.1.0",	SSH_BUG_SIGBLOB|SSH_BUG_HMAC},
65 		{"2.0.1",	SSH_BUG_SIGBLOB|SSH_BUG_HMAC|SSH_BUG_PUBKEYAUTH|SSH_BUG_X11FWD},
66 		{NULL,		0}
67 	};
68 	for (i = 0; check[i].version; i++) {
69 		len = strlen(check[i].version);
70 		if (strlen(version) >= len &&
71 		   (strncmp(version, check[i].version, len) == 0)) {
72 			verbose("datafellows: %.200s", version);
73 			datafellows = check[i].bugs;
74 			return;
75 		}
76 	}
77 }
78 
79 #define	SEP	","
80 int
81 proto_spec(const char *spec)
82 {
83 	char *s, *p;
84 	int ret = SSH_PROTO_UNKNOWN;
85 
86 	if (spec == NULL)
87 		return ret;
88 	s = xstrdup(spec);
89 	for ((p = strtok(s, SEP)); p; (p = strtok(NULL, SEP))) {
90 		switch(atoi(p)) {
91 		case 1:
92 			if (ret == SSH_PROTO_UNKNOWN)
93 				ret |= SSH_PROTO_1_PREFERRED;
94 			ret |= SSH_PROTO_1;
95 			break;
96 		case 2:
97 			ret |= SSH_PROTO_2;
98 			break;
99 		default:
100 			log("ignoring bad proto spec: '%s'.", p);
101 			break;
102 		}
103 	}
104 	xfree(s);
105 	return ret;
106 }
107