localconf.c revision c91307af2622f6625525f3c1f9c954376df950ad
1c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh/*	$NetBSD: localconf.c,v 1.4 2006/09/09 16:22:09 manu Exp $	*/
20a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
30a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*	$KAME: localconf.c,v 1.33 2001/08/09 07:32:19 sakane Exp $	*/
40a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
50a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
60a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project.
70a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * All rights reserved.
80a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *
90a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * Redistribution and use in source and binary forms, with or without
100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * modification, are permitted provided that the following conditions
110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * are met:
120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 1. Redistributions of source code must retain the above copyright
130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    notice, this list of conditions and the following disclaimer.
140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 2. Redistributions in binary form must reproduce the above copyright
150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    notice, this list of conditions and the following disclaimer in the
160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    documentation and/or other materials provided with the distribution.
170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * 3. Neither the name of the project nor the names of its contributors
180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    may be used to endorse or promote products derived from this software
190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *    without specific prior written permission.
200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *
210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * SUCH DAMAGE.
320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "config.h"
350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/types.h>
370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <sys/param.h>
380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdlib.h>
400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <stdio.h>
410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <string.h>
420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <errno.h>
430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <ctype.h>
440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include <err.h>
450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "var.h"
470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "misc.h"
480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "vmbuf.h"
490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "plog.h"
500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "debug.h"
510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "localconf.h"
530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "algorithm.h"
540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "admin.h"
550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "privsep.h"
560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp_var.h"
570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "isakmp.h"
580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "ipsec_doi.h"
590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "grabmyaddr.h"
600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "vendorid.h"
610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "str2val.h"
620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "safefile.h"
630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "admin.h"
640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#include "gcmalloc.h"
650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstruct localconf *lcconf;
670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void setdefault __P((void));
690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid
710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanginitlcconf()
720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf = racoon_calloc(1, sizeof(*lcconf));
740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (lcconf == NULL)
750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		errx(1, "failed to allocate local conf.");
760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	setdefault();
780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->racoon_conf = LC_DEFAULT_CF;
800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid
830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangflushlcconf()
840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int i;
860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	setdefault();
88c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	clear_myaddr(&lcconf->myaddrs);
890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	for (i = 0; i < LC_PATHTYPE_MAX; i++) {
900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (lcconf->pathinfo[i]) {
910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			racoon_free(lcconf->pathinfo[i]);
920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			lcconf->pathinfo[i] = NULL;
930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
95c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	for (i = 0; i < LC_IDENTTYPE_MAX; i++) {
96c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		if (lcconf->ident[i])
97c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh			vfree(lcconf->ident[i]);
98c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		lcconf->ident[i] = NULL;
99c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	}
1000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
1010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void
1030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangsetdefault()
1040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
1050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->uid = 0;
1060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->gid = 0;
1070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->chroot = NULL;
108c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	lcconf->autograbaddr = 1;
1090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->port_isakmp = PORT_ISAKMP;
1100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->port_isakmp_natt = PORT_ISAKMP_NATT;
1110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->default_af = AF_INET;
1120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->pad_random = LC_DEFAULT_PAD_RANDOM;
1130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->pad_randomlen = LC_DEFAULT_PAD_RANDOMLEN;
1140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->pad_maxsize = LC_DEFAULT_PAD_MAXSIZE;
1150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->pad_strict = LC_DEFAULT_PAD_STRICT;
1160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->pad_excltail = LC_DEFAULT_PAD_EXCLTAIL;
1170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->retry_counter = LC_DEFAULT_RETRY_COUNTER;
1180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->retry_interval = LC_DEFAULT_RETRY_INTERVAL;
1190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->count_persend = LC_DEFAULT_COUNT_PERSEND;
1200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->secret_size = LC_DEFAULT_SECRETSIZE;
1210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->retry_checkph1 = LC_DEFAULT_RETRY_CHECKPH1;
1220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->wait_ph2complete = LC_DEFAULT_WAIT_PH2COMPLETE;
1230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->strict_address = FALSE;
1240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->complex_bundle = TRUE; /*XXX FALSE;*/
1250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->gss_id_enc = LC_GSSENC_UTF16LE; /* Windows compatibility */
1260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	lcconf->natt_ka_interval = LC_DEFAULT_NATT_KA_INTERVAL;
1270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
1280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
1300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * get PSK by string.
1310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
1320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvchar_t *
1330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanggetpskbyname(id0)
1340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *id0;
1350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
1360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *id;
1370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *key = NULL;
1380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	id = racoon_calloc(1, 1 + id0->l - sizeof(struct ipsecdoi_id_b));
1400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (id == NULL) {
1410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		plog(LLV_ERROR, LOCATION, NULL,
1420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			"failed to get psk buffer.\n");
1430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		goto end;
1440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
1450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	memcpy(id, id0->v + sizeof(struct ipsecdoi_id_b),
1460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		id0->l - sizeof(struct ipsecdoi_id_b));
1470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	id[id0->l - sizeof(struct ipsecdoi_id_b)] = '\0';
1480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	key = privsep_getpsk(id, id0->l - sizeof(struct ipsecdoi_id_b));
1500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangend:
1520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (id)
1530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		racoon_free(id);
1540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return key;
1550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
1560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
1580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * get PSK by address.
1590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
1600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvchar_t *
1610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanggetpskbyaddr(remote)
1620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	struct sockaddr *remote;
1630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
1640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *key = NULL;
1650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char addr[NI_MAXHOST], port[NI_MAXSERV];
1660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	GETNAMEINFO(remote, addr, port);
1680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	key = privsep_getpsk(addr, strlen(addr));
1700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return key;
1720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
1730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvchar_t *
1750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanggetpsk(str, len)
1760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	const char *str;
1770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	const int len;
1780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
1790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	FILE *fp;
1800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char buf[1024];	/* XXX how is variable length ? */
1810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	vchar_t *key = NULL;
1820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *p, *q;
1830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	size_t keylen;
1840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *k = NULL;
1850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (safefile(lcconf->pathinfo[LC_PATHTYPE_PSK], 1) == 0)
1870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		fp = fopen(lcconf->pathinfo[LC_PATHTYPE_PSK], "r");
1880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	else
1890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		fp = NULL;
1900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (fp == NULL) {
1910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		plog(LLV_ERROR, LOCATION, NULL,
1920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			"failed to open pre_share_key file %s\n",
1930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			lcconf->pathinfo[LC_PATHTYPE_PSK]);
1940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return NULL;
1950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
1960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
1970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	while (fgets(buf, sizeof(buf), fp) != NULL) {
1980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* comment line */
1990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (buf[0] == '#')
2000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			continue;
2010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* search the end of 1st string. */
2030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		for (p = buf; *p != '\0' && !isspace((int)*p); p++)
2040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			;
2050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (*p == '\0')
2060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			continue;	/* no 2nd parameter */
2070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		*p = '\0';
2080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		/* search the 1st of 2nd string. */
2090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		while (isspace((int)*++p))
2100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			;
2110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (*p == '\0')
2120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			continue;	/* no 2nd parameter */
2130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		p--;
2140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		if (strncmp(buf, str, len) == 0 && buf[len] == '\0') {
2150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			p++;
2160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			keylen = 0;
2170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			for (q = p; *q != '\0' && *q != '\n'; q++)
2180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				keylen++;
2190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			*q = '\0';
2200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			/* fix key if hex string */
2220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			if (strncmp(p, "0x", 2) == 0) {
2230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				k = str2val(p + 2, 16, &keylen);
2240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				if (k == NULL) {
2250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					plog(LLV_ERROR, LOCATION, NULL,
2260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang						"failed to get psk buffer.\n");
2270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					goto end;
2280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				}
2290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				p = k;
2300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			}
2310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			key = vmalloc(keylen);
2330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			if (key == NULL) {
2340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				plog(LLV_ERROR, LOCATION, NULL,
2350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang					"failed to allocate key buffer.\n");
2360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				goto end;
2370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			}
2380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			memcpy(key->v, p, key->l);
2390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			if (k)
2400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang				racoon_free(k);
2410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang			goto end;
2420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		}
2430a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
2440a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2450a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangend:
2460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	fclose(fp);
2470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return key;
2480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
2490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2500a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
2510a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * get a file name of a type specified.
2520a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
2530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid
2540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wanggetpathname(path, len, type, name)
2550a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	char *path;
2560a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int len, type;
2570a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	const char *name;
2580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
2590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	snprintf(path, len, "%s%s%s",
2600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		name[0] == '/' ? "" : lcconf->pathinfo[type],
2610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		name[0] == '/' ? "" : "/",
2620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		name);
2630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	plog(LLV_DEBUG, LOCATION, NULL, "filename: %s\n", path);
2650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
2660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#if 0 /* DELETEIT */
2680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int lc_doi2idtype[] = {
2690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	-1,
2700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	-1,
2710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	LC_IDENTTYPE_FQDN,
2720a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	LC_IDENTTYPE_USERFQDN,
2730a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	-1,
2740a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	-1,
2750a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	-1,
2760a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	-1,
2770a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	-1,
2780a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	LC_IDENTTYPE_CERTNAME,
2790a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	-1,
2800a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	LC_IDENTTYPE_KEYID,
2810a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang};
2820a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2830a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
2840a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * convert DOI value to idtype
2850a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OUT	-1   : NG
2860a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *	other: converted.
2870a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
2880a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
2890a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangdoi2idtype(idtype)
2900a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int idtype;
2910a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
2920a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ARRAYLEN(lc_doi2idtype) > idtype)
2930a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return lc_doi2idtype[idtype];
2940a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return -1;
2950a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
2960a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang#endif
2970a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
2980a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int lc_sittype2doi[] = {
2990a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	IPSECDOI_SIT_IDENTITY_ONLY,
3000a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	IPSECDOI_SIT_SECRECY,
3010a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	IPSECDOI_SIT_INTEGRITY,
3020a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang};
3030a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3040a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
3050a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * convert sittype to DOI value.
3060a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OUT	-1   : NG
3070a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *	other: converted.
3080a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
3090a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
3100a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangsittype2doi(sittype)
3110a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int sittype;
3120a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
3130a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ARRAYLEN(lc_sittype2doi) > sittype)
3140a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return lc_sittype2doi[sittype];
3150a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return -1;
3160a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
3170a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3180a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic int lc_doitype2doi[] = {
3190a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	IPSEC_DOI,
3200a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang};
3210a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3220a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang/*
3230a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * convert doitype to DOI value.
3240a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang * OUT	-1   : NG
3250a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang *	other: converted.
3260a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang */
3270a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangint
3280a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangdoitype2doi(doitype)
3290a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int doitype;
3300a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
3310a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (ARRAYLEN(lc_doitype2doi) > doitype)
3320a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		return lc_doitype2doi[doitype];
3330a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	return -1;
3340a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
3350a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3360a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3370a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3380a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangstatic void
3390a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangsaverestore_params(f)
3400a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	int f;
3410a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
3420a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	static u_int16_t s_port_isakmp;
343c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#ifdef ENABLE_ADMINPORT
344c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh	static u_int16_t s_port_admin;
345c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#endif
3460a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3470a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	/* 0: save, 1: restore */
3480a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	if (f) {
3490a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		lcconf->port_isakmp = s_port_isakmp;
350c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#ifdef ENABLE_ADMINPORT
351c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		lcconf->port_admin = s_port_admin;
352c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#endif
3530a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	} else {
3540a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang		s_port_isakmp = lcconf->port_isakmp;
355c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#ifdef ENABLE_ADMINPORT
356c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh		s_port_admin = lcconf->port_admin;
357c91307af2622f6625525f3c1f9c954376df950adChia-chi Yeh#endif
3580a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	}
3590a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
3600a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3610a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid
3620a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangrestore_params()
3630a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
3640a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	saverestore_params(1);
3650a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
3660a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang
3670a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangvoid
3680a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wangsave_params()
3690a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang{
3700a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang	saverestore_params(0);
3710a1907d434839af6a9cb6329bbde60b237bf53dcChung-yih Wang}
372