1 /* $NetBSD: localconf.c,v 1.7 2008/12/23 14:04:42 tteras Exp $ */ 2 3 /* $KAME: localconf.c,v 1.33 2001/08/09 07:32:19 sakane Exp $ */ 4 5 /* 6 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. Neither the name of the project nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34 #include "config.h" 35 36 #include <sys/types.h> 37 #include <sys/param.h> 38 39 #include <stdlib.h> 40 #include <stdio.h> 41 #include <string.h> 42 #include <errno.h> 43 #include <ctype.h> 44 #include <err.h> 45 46 #include "var.h" 47 #include "misc.h" 48 #include "vmbuf.h" 49 #include "plog.h" 50 #include "debug.h" 51 52 #include "localconf.h" 53 #include "algorithm.h" 54 #include "admin.h" 55 #include "privsep.h" 56 #include "isakmp_var.h" 57 #include "isakmp.h" 58 #include "ipsec_doi.h" 59 #include "grabmyaddr.h" 60 #include "vendorid.h" 61 #include "str2val.h" 62 #include "safefile.h" 63 #include "admin.h" 64 #include "gcmalloc.h" 65 66 struct localconf *lcconf; 67 68 static void setdefault __P((void)); 69 70 void 71 initlcconf() 72 { 73 lcconf = racoon_calloc(1, sizeof(*lcconf)); 74 if (lcconf == NULL) 75 errx(1, "failed to allocate local conf."); 76 77 setdefault(); 78 79 lcconf->racoon_conf = LC_DEFAULT_CF; 80 } 81 82 void 83 flushlcconf() 84 { 85 int i; 86 87 setdefault(); 88 myaddr_flush(); 89 90 for (i = 0; i < LC_PATHTYPE_MAX; i++) { 91 if (lcconf->pathinfo[i]) { 92 racoon_free(lcconf->pathinfo[i]); 93 lcconf->pathinfo[i] = NULL; 94 } 95 } 96 } 97 98 static void 99 setdefault() 100 { 101 lcconf->uid = 0; 102 lcconf->gid = 0; 103 lcconf->chroot = NULL; 104 lcconf->port_isakmp = PORT_ISAKMP; 105 lcconf->port_isakmp_natt = PORT_ISAKMP_NATT; 106 lcconf->default_af = AF_INET; 107 lcconf->pad_random = LC_DEFAULT_PAD_RANDOM; 108 lcconf->pad_randomlen = LC_DEFAULT_PAD_RANDOMLEN; 109 lcconf->pad_maxsize = LC_DEFAULT_PAD_MAXSIZE; 110 lcconf->pad_strict = LC_DEFAULT_PAD_STRICT; 111 lcconf->pad_excltail = LC_DEFAULT_PAD_EXCLTAIL; 112 lcconf->retry_counter = LC_DEFAULT_RETRY_COUNTER; 113 lcconf->retry_interval = LC_DEFAULT_RETRY_INTERVAL; 114 lcconf->count_persend = LC_DEFAULT_COUNT_PERSEND; 115 lcconf->secret_size = LC_DEFAULT_SECRETSIZE; 116 lcconf->retry_checkph1 = LC_DEFAULT_RETRY_CHECKPH1; 117 lcconf->wait_ph2complete = LC_DEFAULT_WAIT_PH2COMPLETE; 118 lcconf->strict_address = FALSE; 119 lcconf->complex_bundle = TRUE; /*XXX FALSE;*/ 120 lcconf->gss_id_enc = LC_GSSENC_UTF16LE; /* Windows compatibility */ 121 lcconf->natt_ka_interval = LC_DEFAULT_NATT_KA_INTERVAL; 122 lcconf->pfkey_buffer_size = LC_DEFAULT_PFKEY_BUFFER_SIZE; 123 } 124 125 /* 126 * get PSK by string. 127 */ 128 vchar_t * 129 getpskbyname(id0) 130 vchar_t *id0; 131 { 132 char *id; 133 vchar_t *key = NULL; 134 135 id = racoon_calloc(1, 1 + id0->l - sizeof(struct ipsecdoi_id_b)); 136 if (id == NULL) { 137 plog(LLV_ERROR, LOCATION, NULL, 138 "failed to get psk buffer.\n"); 139 goto end; 140 } 141 memcpy(id, id0->v + sizeof(struct ipsecdoi_id_b), 142 id0->l - sizeof(struct ipsecdoi_id_b)); 143 id[id0->l - sizeof(struct ipsecdoi_id_b)] = '\0'; 144 145 key = privsep_getpsk(id, id0->l - sizeof(struct ipsecdoi_id_b)); 146 147 end: 148 if (id) 149 racoon_free(id); 150 return key; 151 } 152 153 /* 154 * get PSK by address. 155 */ 156 vchar_t * 157 getpskbyaddr(remote) 158 struct sockaddr *remote; 159 { 160 vchar_t *key = NULL; 161 char addr[NI_MAXHOST], port[NI_MAXSERV]; 162 163 GETNAMEINFO(remote, addr, port); 164 165 key = privsep_getpsk(addr, strlen(addr)); 166 167 return key; 168 } 169 170 vchar_t * 171 getpsk(str, len) 172 const char *str; 173 const int len; 174 { 175 FILE *fp; 176 char buf[1024]; /* XXX how is variable length ? */ 177 vchar_t *key = NULL; 178 char *p, *q; 179 size_t keylen; 180 char *k = NULL; 181 182 if (safefile(lcconf->pathinfo[LC_PATHTYPE_PSK], 1) == 0) 183 fp = fopen(lcconf->pathinfo[LC_PATHTYPE_PSK], "r"); 184 else 185 fp = NULL; 186 if (fp == NULL) { 187 plog(LLV_ERROR, LOCATION, NULL, 188 "failed to open pre_share_key file %s\n", 189 lcconf->pathinfo[LC_PATHTYPE_PSK]); 190 return NULL; 191 } 192 193 while (fgets(buf, sizeof(buf), fp) != NULL) { 194 /* comment line */ 195 if (buf[0] == '#') 196 continue; 197 198 /* search the end of 1st string. */ 199 for (p = buf; *p != '\0' && !isspace((int)*p); p++) 200 ; 201 if (*p == '\0') 202 continue; /* no 2nd parameter */ 203 *p = '\0'; 204 /* search the 1st of 2nd string. */ 205 while (isspace((int)*++p)) 206 ; 207 if (*p == '\0') 208 continue; /* no 2nd parameter */ 209 p--; 210 if (strncmp(buf, str, len) == 0 && buf[len] == '\0') { 211 p++; 212 keylen = 0; 213 for (q = p; *q != '\0' && *q != '\n'; q++) 214 keylen++; 215 *q = '\0'; 216 217 /* fix key if hex string */ 218 if (strncmp(p, "0x", 2) == 0) { 219 k = str2val(p + 2, 16, &keylen); 220 if (k == NULL) { 221 plog(LLV_ERROR, LOCATION, NULL, 222 "failed to get psk buffer.\n"); 223 goto end; 224 } 225 p = k; 226 } 227 228 key = vmalloc(keylen); 229 if (key == NULL) { 230 plog(LLV_ERROR, LOCATION, NULL, 231 "failed to allocate key buffer.\n"); 232 goto end; 233 } 234 memcpy(key->v, p, key->l); 235 if (k) 236 racoon_free(k); 237 goto end; 238 } 239 } 240 241 end: 242 fclose(fp); 243 return key; 244 } 245 246 /* 247 * get a file name of a type specified. 248 */ 249 void 250 getpathname(path, len, type, name) 251 char *path; 252 int len, type; 253 const char *name; 254 { 255 snprintf(path, len, "%s%s%s", 256 name[0] == '/' ? "" : lcconf->pathinfo[type], 257 name[0] == '/' ? "" : "/", 258 name); 259 260 plog(LLV_DEBUG, LOCATION, NULL, "filename: %s\n", path); 261 } 262 263 #if 0 /* DELETEIT */ 264 static int lc_doi2idtype[] = { 265 -1, 266 -1, 267 LC_IDENTTYPE_FQDN, 268 LC_IDENTTYPE_USERFQDN, 269 -1, 270 -1, 271 -1, 272 -1, 273 -1, 274 LC_IDENTTYPE_CERTNAME, 275 -1, 276 LC_IDENTTYPE_KEYID, 277 }; 278 279 /* 280 * convert DOI value to idtype 281 * OUT -1 : NG 282 * other: converted. 283 */ 284 int 285 doi2idtype(idtype) 286 int idtype; 287 { 288 if (ARRAYLEN(lc_doi2idtype) > idtype) 289 return lc_doi2idtype[idtype]; 290 return -1; 291 } 292 #endif 293 294 static int lc_sittype2doi[] = { 295 IPSECDOI_SIT_IDENTITY_ONLY, 296 IPSECDOI_SIT_SECRECY, 297 IPSECDOI_SIT_INTEGRITY, 298 }; 299 300 /* 301 * convert sittype to DOI value. 302 * OUT -1 : NG 303 * other: converted. 304 */ 305 int 306 sittype2doi(sittype) 307 int sittype; 308 { 309 if (ARRAYLEN(lc_sittype2doi) > sittype) 310 return lc_sittype2doi[sittype]; 311 return -1; 312 } 313 314 static int lc_doitype2doi[] = { 315 IPSEC_DOI, 316 }; 317 318 /* 319 * convert doitype to DOI value. 320 * OUT -1 : NG 321 * other: converted. 322 */ 323 int 324 doitype2doi(doitype) 325 int doitype; 326 { 327 if (ARRAYLEN(lc_doitype2doi) > doitype) 328 return lc_doitype2doi[doitype]; 329 return -1; 330 } 331 332 333 334 static void 335 saverestore_params(f) 336 int f; 337 { 338 static u_int16_t s_port_isakmp; 339 340 /* 0: save, 1: restore */ 341 if (f) { 342 lcconf->port_isakmp = s_port_isakmp; 343 } else { 344 s_port_isakmp = lcconf->port_isakmp; 345 } 346 } 347 348 void 349 restore_params() 350 { 351 saverestore_params(1); 352 } 353 354 void 355 save_params() 356 { 357 saverestore_params(0); 358 } 359