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(®, check[i].pat, REG_EXTENDED|REG_NOSUB); 795b9b2fafSBrian Feldman if (ret != 0) { 805b9b2fafSBrian Feldman regerror(ret, ®, 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(®, version, 0, NULL, 0); 865b9b2fafSBrian Feldman regfree(®); 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