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