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