Home | History | Annotate | Line # | Download | only in racoon
      1 /*	$NetBSD: isakmp_xauth.c,v 1.35 2025/03/07 15:55:29 christos Exp $	*/
      2 
      3 /* Id: isakmp_xauth.c,v 1.38 2006/08/22 18:17:17 manubsd Exp */
      4 
      5 /*
      6  * Copyright (C) 2004-2005 Emmanuel Dreyfus
      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 #include <sys/socket.h>
     39 #include <sys/queue.h>
     40 
     41 #include <netinet/in.h>
     42 
     43 #include <assert.h>
     44 #include <stdlib.h>
     45 #include <stdio.h>
     46 #include <string.h>
     47 #include <errno.h>
     48 #include <pwd.h>
     49 #include <grp.h>
     50 #if TIME_WITH_SYS_TIME
     51 # include <sys/time.h>
     52 # include <time.h>
     53 #else
     54 # if HAVE_SYS_TIME_H
     55 #  include <sys/time.h>
     56 # else
     57 #  include <time.h>
     58 # endif
     59 #endif
     60 #include <netdb.h>
     61 #ifdef HAVE_UNISTD_H
     62 #include <unistd.h>
     63 #endif
     64 #include <ctype.h>
     65 #include <resolv.h>
     66 
     67 #ifdef HAVE_SHADOW_H
     68 #include <shadow.h>
     69 #endif
     70 
     71 #include "var.h"
     72 #include "misc.h"
     73 #include "vmbuf.h"
     74 #include "plog.h"
     75 #include "sockmisc.h"
     76 #include "schedule.h"
     77 #include "debug.h"
     78 
     79 #include "crypto_openssl.h"
     80 #include "isakmp_var.h"
     81 #include "isakmp.h"
     82 #include "admin.h"
     83 #include "privsep.h"
     84 #include "evt.h"
     85 #include "handler.h"
     86 #include "throttle.h"
     87 #include "remoteconf.h"
     88 #include "isakmp_inf.h"
     89 #include "isakmp_xauth.h"
     90 #include "isakmp_unity.h"
     91 #include "isakmp_cfg.h"
     92 #include "strnames.h"
     93 #include "ipsec_doi.h"
     94 #include "remoteconf.h"
     95 #include "localconf.h"
     96 
     97 #ifdef HAVE_LIBRADIUS
     98 #include <radlib.h>
     99 static struct rad_handle *radius_auth_state = NULL;
    100 struct rad_handle *radius_acct_state = NULL;
    101 struct xauth_rad_config xauth_rad_config;
    102 #endif
    103 
    104 #ifdef HAVE_LIBPAM
    105 #include <security/pam_appl.h>
    106 
    107 static char *PAM_usr = NULL;
    108 static char *PAM_pwd = NULL;
    109 static int PAM_conv(int, const struct pam_message **,
    110     struct pam_response **, void *);
    111 static struct pam_conv PAM_chat = { &PAM_conv, NULL };
    112 #endif
    113 
    114 #ifdef HAVE_LIBLDAP
    115 #include "ldap.h"
    116 #include <arpa/inet.h>
    117 struct xauth_ldap_config xauth_ldap_config;
    118 #endif
    119 
    120 void
    121 xauth_sendreq(struct ph1handle *iph1)
    122 {
    123 	vchar_t *buffer;
    124 	struct isakmp_pl_attr *attr;
    125 	struct isakmp_data *typeattr;
    126 	struct isakmp_data *usrattr;
    127 	struct isakmp_data *pwdattr;
    128 	struct xauth_state *xst = &iph1->mode_cfg->xauth;
    129 	size_t tlen;
    130 
    131 	/* Status checks */
    132 	if (iph1->status < PHASE1ST_ESTABLISHED) {
    133 		plog(LLV_ERROR, LOCATION, NULL,
    134 		    "Xauth request while phase 1 is not completed\n");
    135 		return;
    136 	}
    137 
    138 	if (xst->status != XAUTHST_NOTYET) {
    139 		plog(LLV_ERROR, LOCATION, NULL,
    140 		    "Xauth request whith Xauth state %d\n", xst->status);
    141 		return;
    142 	}
    143 
    144 	plog(LLV_INFO, LOCATION, NULL, "Sending Xauth request\n");
    145 
    146 	tlen = sizeof(*attr) +
    147 	       + sizeof(*typeattr) +
    148 	       + sizeof(*usrattr) +
    149 	       + sizeof(*pwdattr);
    150 
    151 	if ((buffer = vmalloc(tlen)) == NULL) {
    152 		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate buffer\n");
    153 		return;
    154 	}
    155 
    156 	attr = (struct isakmp_pl_attr *)buffer->v;
    157 	memset(attr, 0, tlen);
    158 
    159 	attr->h.len = htons(tlen);
    160 	attr->type = ISAKMP_CFG_REQUEST;
    161 	attr->id = htons(eay_random());
    162 
    163 	typeattr = (struct isakmp_data *)(attr + 1);
    164 	typeattr->type = htons(XAUTH_TYPE | ISAKMP_GEN_TV);
    165 	typeattr->lorv = htons(XAUTH_TYPE_GENERIC);
    166 
    167 	usrattr = (struct isakmp_data *)(typeattr + 1);
    168 	usrattr->type = htons(XAUTH_USER_NAME | ISAKMP_GEN_TLV);
    169 	usrattr->lorv = htons(0);
    170 
    171 	pwdattr = (struct isakmp_data *)(usrattr + 1);
    172 	pwdattr->type = htons(XAUTH_USER_PASSWORD | ISAKMP_GEN_TLV);
    173 	pwdattr->lorv = htons(0);
    174 
    175 	isakmp_cfg_send(iph1, buffer,
    176 	    ISAKMP_NPTYPE_ATTR, ISAKMP_FLAG_E, 1);
    177 
    178 	vfree(buffer);
    179 
    180 	xst->status = XAUTHST_REQSENT;
    181 
    182 	return;
    183 }
    184 
    185 int
    186 xauth_attr_reply(struct ph1handle *iph1, struct isakmp_data *attr, int id)
    187 {
    188 	char **outlet = NULL;
    189 	size_t alen = 0;
    190 	int type;
    191 	struct xauth_state *xst = &iph1->mode_cfg->xauth;
    192 
    193 	if ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) == 0) {
    194 		plog(LLV_ERROR, LOCATION, NULL,
    195 		    "Xauth reply but peer did not declare "
    196 		    "itself as Xauth capable\n");
    197 		return -1;
    198 	}
    199 
    200 	if (xst->status != XAUTHST_REQSENT) {
    201 		plog(LLV_ERROR, LOCATION, NULL,
    202 		    "Xauth reply while Xauth state is %d\n", xst->status);
    203 		return -1;
    204 	}
    205 
    206 	type = ntohs(attr->type) & ~ISAKMP_GEN_MASK;
    207 	switch (type) {
    208 	case XAUTH_TYPE:
    209 		switch (ntohs(attr->lorv)) {
    210 		case XAUTH_TYPE_GENERIC:
    211 			xst->authtype = XAUTH_TYPE_GENERIC;
    212 			break;
    213 		default:
    214 			plog(LLV_WARNING, LOCATION, NULL,
    215 			    "Unexpected authentication type %d\n",
    216 			    ntohs(type));
    217 			return -1;
    218 		}
    219 		break;
    220 
    221 	case XAUTH_USER_NAME:
    222 		outlet = &xst->authdata.generic.usr;
    223 		break;
    224 
    225 	case XAUTH_USER_PASSWORD:
    226 		outlet = &xst->authdata.generic.pwd;
    227 		break;
    228 
    229 	default:
    230 		plog(LLV_WARNING, LOCATION, NULL,
    231 		    "ignored Xauth attribute %d\n", type);
    232 		break;
    233 	}
    234 
    235 	if (outlet != NULL) {
    236 		alen = ntohs(attr->lorv);
    237 
    238 		if ((*outlet = racoon_malloc(alen + 1)) == NULL) {
    239 			plog(LLV_ERROR, LOCATION, NULL,
    240 			    "Cannot allocate memory for Xauth Data\n");
    241 			return -1;
    242 		}
    243 
    244 		memcpy(*outlet, attr + 1, alen);
    245 		(*outlet)[alen] = '\0';
    246 		outlet = NULL;
    247 	}
    248 
    249 
    250 	if ((xst->authdata.generic.usr != NULL) &&
    251 	   (xst->authdata.generic.pwd != NULL)) {
    252 		int port;
    253 		int res;
    254 		char *usr = xst->authdata.generic.usr;
    255 		char *pwd = xst->authdata.generic.pwd;
    256 		time_t throttle_delay = 0;
    257 
    258 #if 0	/* Real debug, don't do that at home */
    259 		plog(LLV_DEBUG, LOCATION, NULL,
    260 		    "Got username \"%s\", password \"%s\"\n", usr, pwd);
    261 #endif
    262 		strncpy(iph1->mode_cfg->login, usr, LOGINLEN);
    263 		iph1->mode_cfg->login[LOGINLEN] = '\0';
    264 
    265 		res = -1;
    266 		if ((port = isakmp_cfg_getport(iph1)) == -1) {
    267 			plog(LLV_ERROR, LOCATION, NULL,
    268 			    "Port pool depleted\n");
    269 			goto skip_auth;
    270 		}
    271 
    272 		switch (isakmp_cfg_config.authsource) {
    273 		case ISAKMP_CFG_AUTH_SYSTEM:
    274 			res = privsep_xauth_login_system(usr, pwd);
    275 			break;
    276 #ifdef HAVE_LIBRADIUS
    277 		case ISAKMP_CFG_AUTH_RADIUS:
    278 			res = xauth_login_radius(iph1, usr, pwd);
    279 			break;
    280 #endif
    281 #ifdef HAVE_LIBPAM
    282 		case ISAKMP_CFG_AUTH_PAM:
    283 			res = privsep_xauth_login_pam(iph1->mode_cfg->port,
    284 			    iph1->remote, usr, pwd);
    285 			break;
    286 #endif
    287 #ifdef HAVE_LIBLDAP
    288 		case ISAKMP_CFG_AUTH_LDAP:
    289 			res = xauth_login_ldap(iph1, usr, pwd);
    290 			break;
    291 #endif
    292 		default:
    293 			plog(LLV_ERROR, LOCATION, NULL,
    294 			    "Unexpected authentication source\n");
    295 			res = -1;
    296 			break;
    297 		}
    298 
    299 		/*
    300 		 * Optional group authentication
    301 		 */
    302 		if (!res && (isakmp_cfg_config.groupcount))
    303 			res = group_check(iph1,
    304 				isakmp_cfg_config.grouplist,
    305 				isakmp_cfg_config.groupcount);
    306 
    307 		/*
    308 		 * On failure, throttle the connexion for the remote host
    309 		 * in order to make password attacks more difficult.
    310 		 */
    311 		throttle_delay = throttle_host(iph1->remote, res);
    312 		if (throttle_delay > 0) {
    313 			char *str;
    314 
    315 			str = saddrwop2str(iph1->remote);
    316 
    317 			plog(LLV_ERROR, LOCATION, NULL,
    318 			    "Throttling in action for %s: delay %lds\n",
    319 			    str, (unsigned long)throttle_delay);
    320 			res = -1;
    321 		} else {
    322 			throttle_delay = 0;
    323 		}
    324 
    325 skip_auth:
    326 		if (throttle_delay != 0) {
    327 			struct xauth_reply_arg *xra;
    328 
    329 			if ((xra = racoon_calloc(1, sizeof(*xra))) == NULL) {
    330 				plog(LLV_ERROR, LOCATION, NULL,
    331 				    "malloc failed, bypass throttling\n");
    332 				return xauth_reply(iph1, port, id, res);
    333 			}
    334 
    335 			/*
    336 			 * We need to store the ph1, but it might have
    337 			 * disapeared when xauth_reply is called, so
    338 			 * store the index instead.
    339 			 */
    340 			xra->index = iph1->index;
    341 			xra->port = port;
    342 			xra->id = id;
    343 			xra->res = res;
    344 			sched_schedule(&xra->sc, throttle_delay,
    345 				       xauth_reply_stub);
    346 		} else {
    347 			return xauth_reply(iph1, port, id, res);
    348 		}
    349 	}
    350 
    351 	return 0;
    352 }
    353 
    354 void
    355 xauth_reply_stub(struct sched *sc)
    356 {
    357 	struct xauth_reply_arg *xra = container_of(sc, struct xauth_reply_arg, sc);
    358 	struct ph1handle *iph1;
    359 
    360 	if ((iph1 = getph1byindex(&xra->index)) != NULL)
    361 		(void)xauth_reply(iph1, xra->port, xra->id, xra->res);
    362 	else
    363 		plog(LLV_ERROR, LOCATION, NULL,
    364 		    "Delayed Xauth reply: phase 1 no longer exists.\n");
    365 
    366 	racoon_free(xra);
    367 }
    368 
    369 int
    370 xauth_reply(struct ph1handle *iph1, int port, int id, int res)
    371 {
    372 	struct xauth_state *xst = &iph1->mode_cfg->xauth;
    373 	char *usr = xst->authdata.generic.usr;
    374 
    375 	if (res != 0) {
    376 		if (port != -1)
    377 			isakmp_cfg_putport(iph1, port);
    378 
    379 		plog(LLV_INFO, LOCATION, NULL,
    380 		    "login failed for user \"%s\"\n", usr);
    381 
    382 		xauth_sendstatus(iph1, XAUTH_STATUS_FAIL, id);
    383 		xst->status = XAUTHST_NOTYET;
    384 
    385 		/* Delete Phase 1 SA */
    386 		if (iph1->status >= PHASE1ST_ESTABLISHED)
    387 			isakmp_info_send_d1(iph1);
    388 		remph1(iph1);
    389 		delph1(iph1);
    390 
    391 		return -1;
    392 	}
    393 
    394 	xst->status = XAUTHST_OK;
    395 	plog(LLV_INFO, LOCATION, NULL,
    396 	    "login succeeded for user \"%s\"\n", usr);
    397 
    398 	xauth_sendstatus(iph1, XAUTH_STATUS_OK, id);
    399 
    400 	return 0;
    401 }
    402 
    403 void
    404 xauth_sendstatus(struct ph1handle *iph1, int status, int id)
    405 {
    406 	vchar_t *buffer;
    407 	struct isakmp_pl_attr *attr;
    408 	struct isakmp_data *stattr;
    409 	size_t tlen;
    410 
    411 	tlen = sizeof(*attr) +
    412 	       + sizeof(*stattr);
    413 
    414 	if ((buffer = vmalloc(tlen)) == NULL) {
    415 		plog(LLV_ERROR, LOCATION, NULL, "Cannot allocate buffer\n");
    416 		return;
    417 	}
    418 
    419 	attr = (struct isakmp_pl_attr *)buffer->v;
    420 	memset(attr, 0, tlen);
    421 
    422 	attr->h.len = htons(tlen);
    423 	attr->type = ISAKMP_CFG_SET;
    424 	attr->id = htons(id);
    425 
    426 	stattr = (struct isakmp_data *)(attr + 1);
    427 	stattr->type = htons(XAUTH_STATUS | ISAKMP_GEN_TV);
    428 	stattr->lorv = htons(status);
    429 
    430 	isakmp_cfg_send(iph1, buffer,
    431 	    ISAKMP_NPTYPE_ATTR, ISAKMP_FLAG_E, 1);
    432 
    433 	vfree(buffer);
    434 
    435 	return;
    436 }
    437 
    438 #ifdef HAVE_LIBRADIUS
    439 int
    440 xauth_radius_init_conf(int free)
    441 {
    442 	/* free radius config resources */
    443 	if (free) {
    444 		int i;
    445 		for (i = 0; i < xauth_rad_config.auth_server_count; i++) {
    446 			vfree(xauth_rad_config.auth_server_list[i].host);
    447 			vfree(xauth_rad_config.auth_server_list[i].secret);
    448 		}
    449 		for (i = 0; i < xauth_rad_config.acct_server_count; i++) {
    450 			vfree(xauth_rad_config.acct_server_list[i].host);
    451 			vfree(xauth_rad_config.acct_server_list[i].secret);
    452 		}
    453 		if (radius_auth_state != NULL) {
    454 			rad_close(radius_auth_state);
    455 			radius_auth_state = NULL;
    456 		}
    457 		if (radius_acct_state != NULL) {
    458 			rad_close(radius_acct_state);
    459 			radius_acct_state = NULL;
    460 		}
    461 	}
    462 
    463 	/* initialize radius config */
    464 	memset(&xauth_rad_config, 0, sizeof(xauth_rad_config));
    465 	return 0;
    466 }
    467 
    468 int
    469 xauth_radius_init(void)
    470 {
    471 	/* For first time use, initialize Radius */
    472 	if ((isakmp_cfg_config.authsource == ISAKMP_CFG_AUTH_RADIUS) &&
    473 	    (radius_auth_state == NULL)) {
    474 		if ((radius_auth_state = rad_auth_open()) == NULL) {
    475 			plog(LLV_ERROR, LOCATION, NULL,
    476 			    "Cannot init libradius\n");
    477 			return -1;
    478 		}
    479 
    480 		int auth_count = xauth_rad_config.auth_server_count;
    481 		int auth_added = 0;
    482 		if (auth_count) {
    483 			int i;
    484 			for (i = 0; i < auth_count; i++) {
    485 				if(!rad_add_server(
    486 					radius_auth_state,
    487 					xauth_rad_config.auth_server_list[i].host->v,
    488 					xauth_rad_config.auth_server_list[i].port,
    489 					xauth_rad_config.auth_server_list[i].secret->v,
    490 					xauth_rad_config.timeout,
    491 					xauth_rad_config.retries ))
    492 					auth_added++;
    493 				else
    494 					plog(LLV_WARNING, LOCATION, NULL,
    495 						"could not add radius auth server %s\n",
    496 						xauth_rad_config.auth_server_list[i].host->v);
    497 			}
    498 		}
    499 
    500 		if (!auth_added) {
    501 			if (rad_config(radius_auth_state, NULL) != 0) {
    502 				plog(LLV_ERROR, LOCATION, NULL,
    503 				    "Cannot open libradius config file: %s\n",
    504 				    rad_strerror(radius_auth_state));
    505 				rad_close(radius_auth_state);
    506 				radius_auth_state = NULL;
    507 				return -1;
    508 			}
    509 		}
    510 	}
    511 
    512 	if ((isakmp_cfg_config.accounting == ISAKMP_CFG_ACCT_RADIUS) &&
    513 	    (radius_acct_state == NULL)) {
    514 		if ((radius_acct_state = rad_acct_open()) == NULL) {
    515 			plog(LLV_ERROR, LOCATION, NULL,
    516 			    "Cannot init libradius\n");
    517 			return -1;
    518 		}
    519 
    520 		int acct_count = xauth_rad_config.acct_server_count;
    521 		int acct_added = 0;
    522 		if (acct_count) {
    523 			int i;
    524 			for (i = 0; i < acct_count; i++) {
    525 				if(!rad_add_server(
    526 					radius_acct_state,
    527 					xauth_rad_config.acct_server_list[i].host->v,
    528 					xauth_rad_config.acct_server_list[i].port,
    529 					xauth_rad_config.acct_server_list[i].secret->v,
    530 					xauth_rad_config.timeout,
    531 					xauth_rad_config.retries ))
    532 					acct_added++;
    533 				else
    534 					plog(LLV_WARNING, LOCATION, NULL,
    535 						"could not add radius account server %s\n",
    536 						xauth_rad_config.acct_server_list[i].host->v);
    537 			}
    538 		}
    539 
    540 		if (!acct_added) {
    541 			if (rad_config(radius_acct_state, NULL) != 0) {
    542 				plog(LLV_ERROR, LOCATION, NULL,
    543 				    "Cannot open libradius config file: %s\n",
    544 				    rad_strerror(radius_acct_state));
    545 				rad_close(radius_acct_state);
    546 				radius_acct_state = NULL;
    547 				return -1;
    548 			}
    549 		}
    550 	}
    551 
    552 	return 0;
    553 }
    554 
    555 int
    556 xauth_login_radius(struct ph1handle *iph1, char *usr, char *pwd)
    557 {
    558 	int res;
    559 	const void *data;
    560 	size_t len;
    561 	int type;
    562 
    563 	if (rad_create_request(radius_auth_state, RAD_ACCESS_REQUEST) != 0) {
    564 		plog(LLV_ERROR, LOCATION, NULL,
    565 		    "rad_create_request failed: %s\n",
    566 		    rad_strerror(radius_auth_state));
    567 		return -1;
    568 	}
    569 
    570 	if (rad_put_string(radius_auth_state, RAD_USER_NAME, usr) != 0) {
    571 		plog(LLV_ERROR, LOCATION, NULL,
    572 		    "rad_put_string failed: %s\n",
    573 		    rad_strerror(radius_auth_state));
    574 		return -1;
    575 	}
    576 
    577 	if (rad_put_string(radius_auth_state, RAD_USER_PASSWORD, pwd) != 0) {
    578 		plog(LLV_ERROR, LOCATION, NULL,
    579 		    "rad_put_string failed: %s\n",
    580 		    rad_strerror(radius_auth_state));
    581 		return -1;
    582 	}
    583 
    584 	if (rad_put_string(radius_auth_state, RAD_CALLING_STATION_ID,
    585 			   saddr2str(iph1->remote)) != 0)
    586 		return -1;
    587 
    588 	if (isakmp_cfg_radius_common(radius_auth_state, iph1->mode_cfg->port) != 0)
    589 		return -1;
    590 
    591 	switch (res = rad_send_request(radius_auth_state)) {
    592 	case RAD_ACCESS_ACCEPT:
    593 		while ((type = rad_get_attr(radius_auth_state, &data, &len)) != 0) {
    594 			switch (type) {
    595 			case RAD_FRAMED_IP_ADDRESS:
    596 				iph1->mode_cfg->addr4 = rad_cvt_addr(data);
    597 				iph1->mode_cfg->flags
    598 				    |= ISAKMP_CFG_ADDR4_EXTERN;
    599 				break;
    600 
    601 			case RAD_FRAMED_IP_NETMASK:
    602 				iph1->mode_cfg->mask4 = rad_cvt_addr(data);
    603 				iph1->mode_cfg->flags
    604 				    |= ISAKMP_CFG_MASK4_EXTERN;
    605 				break;
    606 
    607 			default:
    608 				plog(LLV_INFO, LOCATION, NULL,
    609 				    "Unexpected attribute: %d\n", type);
    610 				break;
    611 			}
    612 		}
    613 
    614 		return 0;
    615 
    616 	case RAD_ACCESS_REJECT:
    617 		return -1;
    618 
    619 	case -1:
    620 		plog(LLV_ERROR, LOCATION, NULL,
    621 		    "rad_send_request failed: %s\n",
    622 		    rad_strerror(radius_auth_state));
    623 		return -1;
    624 	default:
    625 		plog(LLV_ERROR, LOCATION, NULL,
    626 		    "rad_send_request returned %d\n", res);
    627 		return -1;
    628 	}
    629 
    630 }
    631 #endif
    632 
    633 #ifdef HAVE_LIBPAM
    634 /*ARGSUSED*/
    635 static int
    636 PAM_conv(int msg_count, const struct pam_message **msg,
    637     struct pam_response **rsp, void *dontcare __unused)
    638 {
    639 	int i;
    640 	struct pam_response *reply = NULL;
    641 
    642 	if ((reply = racoon_malloc(sizeof(*reply) * msg_count)) == NULL)
    643 		return PAM_CONV_ERR;
    644 	bzero(reply, sizeof(*reply) * msg_count);
    645 
    646 	for (i = 0; i < msg_count; i++) {
    647 		switch (msg[i]->msg_style) {
    648 		case PAM_PROMPT_ECHO_ON:
    649 			/* Send the username, libpam frees resp */
    650 			reply[i].resp_retcode = PAM_SUCCESS;
    651 			if ((reply[i].resp = strdup(PAM_usr)) == NULL) {
    652 				plog(LLV_ERROR, LOCATION,
    653 				    NULL, "strdup failed\n");
    654 				exit(1);
    655 			}
    656 			break;
    657 
    658 		case PAM_PROMPT_ECHO_OFF:
    659 			/* Send the password, libpam frees resp */
    660 			reply[i].resp_retcode = PAM_SUCCESS;
    661 			if ((reply[i].resp = strdup(PAM_pwd)) == NULL) {
    662 				plog(LLV_ERROR, LOCATION,
    663 				    NULL, "strdup failed\n");
    664 				exit(1);
    665 			}
    666 			break;
    667 
    668 		case PAM_TEXT_INFO:
    669 		case PAM_ERROR_MSG:
    670 			reply[i].resp_retcode = PAM_SUCCESS;
    671 			reply[i].resp = NULL;
    672 			break;
    673 
    674 		default:
    675 			if (reply != NULL)
    676 				racoon_free(reply);
    677 			return PAM_CONV_ERR;
    678 		}
    679 	}
    680 
    681 	if (reply != NULL)
    682 		*rsp = reply;
    683 
    684 	return PAM_SUCCESS;
    685 }
    686 
    687 int
    688 xauth_login_pam(int port, struct sockaddr *raddr, char *usr, char *pwd)
    689 {
    690 	int error;
    691 	char *remote = NULL;
    692 	pam_handle_t *pam = NULL;
    693 
    694 	if (isakmp_cfg_config.port_pool == NULL) {
    695 		plog(LLV_ERROR, LOCATION, NULL,
    696 		    "isakmp_cfg_config.port_pool == NULL\n");
    697 		return -1;
    698 	}
    699 
    700 	if ((error = pam_start("racoon", usr,
    701 	    &PAM_chat, &isakmp_cfg_config.port_pool[port].pam)) != 0) {
    702 		if (isakmp_cfg_config.port_pool[port].pam == NULL) {
    703 			plog(LLV_ERROR, LOCATION, NULL, "pam_start failed\n");
    704 			return -1;
    705 		} else {
    706 			plog(LLV_ERROR, LOCATION, NULL,
    707 			    "pam_start failed: %s\n",
    708 			    pam_strerror(isakmp_cfg_config.port_pool[port].pam,
    709 			    error));
    710 			goto out;
    711 		}
    712 	}
    713 	pam = isakmp_cfg_config.port_pool[port].pam;
    714 
    715 	if ((remote = strdup(saddrwop2str(raddr))) == NULL) {
    716 		plog(LLV_ERROR, LOCATION, NULL,
    717 		    "cannot allocate memory: %s\n", strerror(errno));
    718 		goto out;
    719 	}
    720 
    721 	if ((error = pam_set_item(pam, PAM_RHOST, remote)) != 0) {
    722 		plog(LLV_ERROR, LOCATION, NULL,
    723 		    "pam_set_item failed: %s\n",
    724 		    pam_strerror(pam, error));
    725 		goto out;
    726 	}
    727 
    728 	if ((error = pam_set_item(pam, PAM_RUSER, usr)) != 0) {
    729 		plog(LLV_ERROR, LOCATION, NULL,
    730 		    "pam_set_item failed: %s\n",
    731 		    pam_strerror(pam, error));
    732 		goto out;
    733 	}
    734 
    735 	PAM_usr = usr;
    736 	PAM_pwd = pwd;
    737 	error = pam_authenticate(pam, 0);
    738 	PAM_usr = NULL;
    739 	PAM_pwd = NULL;
    740 	if (error != 0) {
    741 		plog(LLV_ERROR, LOCATION, NULL,
    742 		    "pam_authenticate failed: %s\n",
    743 		    pam_strerror(pam, error));
    744 		goto out;
    745 	}
    746 
    747 	if ((error = pam_acct_mgmt(pam, 0)) != 0) {
    748 		plog(LLV_ERROR, LOCATION, NULL,
    749 		    "pam_acct_mgmt failed: %s\n",
    750 		    pam_strerror(pam, error));
    751 		goto out;
    752 	}
    753 
    754 	if ((error = pam_setcred(pam, 0)) != 0) {
    755 		plog(LLV_ERROR, LOCATION, NULL,
    756 		    "pam_setcred failed: %s\n",
    757 		    pam_strerror(pam, error));
    758 		goto out;
    759 	}
    760 
    761 	if (remote != NULL)
    762 		free(remote);
    763 
    764 	return 0;
    765 
    766 out:
    767 	pam_end(pam, error);
    768 	isakmp_cfg_config.port_pool[port].pam = NULL;
    769 	if (remote != NULL)
    770 		free(remote);
    771 	return -1;
    772 }
    773 #endif
    774 
    775 #ifdef HAVE_LIBLDAP
    776 int
    777 xauth_ldap_init_conf(void)
    778 {
    779 	size_t tmplen;
    780 	int error = -1;
    781 
    782 	xauth_ldap_config.pver = 3;
    783 	xauth_ldap_config.debug = 0;
    784 	xauth_ldap_config.timeout = -1;
    785 	xauth_ldap_config.uri = NULL;
    786 	xauth_ldap_config.host = NULL;
    787 	xauth_ldap_config.port = LDAP_PORT;
    788 	xauth_ldap_config.tls = 0;
    789 	xauth_ldap_config.base = NULL;
    790 	xauth_ldap_config.subtree = 0;
    791 	xauth_ldap_config.bind_dn = NULL;
    792 	xauth_ldap_config.bind_pw = NULL;
    793 	xauth_ldap_config.auth_type = LDAP_AUTH_SIMPLE;
    794 	xauth_ldap_config.attr_user = NULL;
    795 	xauth_ldap_config.attr_addr = NULL;
    796 	xauth_ldap_config.attr_mask = NULL;
    797 	xauth_ldap_config.attr_group = NULL;
    798 	xauth_ldap_config.attr_member = NULL;
    799 
    800 	/* set default host */
    801 	tmplen = strlen(LDAP_DFLT_HOST);
    802 	xauth_ldap_config.host = vmalloc(tmplen);
    803 	if (xauth_ldap_config.host == NULL)
    804 		goto out;
    805 	memcpy(xauth_ldap_config.host->v, LDAP_DFLT_HOST, tmplen);
    806 
    807 	/* set default user naming attribute */
    808 	tmplen = strlen(LDAP_DFLT_USER);
    809 	xauth_ldap_config.attr_user = vmalloc(tmplen);
    810 	if (xauth_ldap_config.attr_user == NULL)
    811 		goto out;
    812 	memcpy(xauth_ldap_config.attr_user->v, LDAP_DFLT_USER, tmplen);
    813 
    814 	/* set default address attribute */
    815 	tmplen = strlen(LDAP_DFLT_ADDR);
    816 	xauth_ldap_config.attr_addr = vmalloc(tmplen);
    817 	if (xauth_ldap_config.attr_addr == NULL)
    818 		goto out;
    819 	memcpy(xauth_ldap_config.attr_addr->v, LDAP_DFLT_ADDR, tmplen);
    820 
    821 	/* set default netmask attribute */
    822 	tmplen = strlen(LDAP_DFLT_MASK);
    823 	xauth_ldap_config.attr_mask = vmalloc(tmplen);
    824 	if (xauth_ldap_config.attr_mask == NULL)
    825 		goto out;
    826 	memcpy(xauth_ldap_config.attr_mask->v, LDAP_DFLT_MASK, tmplen);
    827 
    828 	/* set default group naming attribute */
    829 	tmplen = strlen(LDAP_DFLT_GROUP);
    830 	xauth_ldap_config.attr_group = vmalloc(tmplen);
    831 	if (xauth_ldap_config.attr_group == NULL)
    832 		goto out;
    833 	memcpy(xauth_ldap_config.attr_group->v, LDAP_DFLT_GROUP, tmplen);
    834 
    835 	/* set default member attribute */
    836 	tmplen = strlen(LDAP_DFLT_MEMBER);
    837 	xauth_ldap_config.attr_member = vmalloc(tmplen);
    838 	if (xauth_ldap_config.attr_member == NULL)
    839 		goto out;
    840 	memcpy(xauth_ldap_config.attr_member->v, LDAP_DFLT_MEMBER, tmplen);
    841 
    842 	error = 0;
    843 out:
    844 	if (error != 0)
    845 		plog(LLV_ERROR, LOCATION, NULL, "cannot allocate memory\n");
    846 
    847 	return error;
    848 }
    849 
    850 int
    851 xauth_login_ldap(struct ph1handle *iph1, char *usr, char *pwd)
    852 {
    853 	int rtn = -1;
    854 	int res = -1;
    855 	LDAP *ld = NULL;
    856 	LDAPMessage *lr = NULL;
    857 	LDAPMessage *le = NULL;
    858 	struct berval cred;
    859 	struct berval **bv = NULL;
    860 	struct timeval timeout;
    861 	char *init = NULL;
    862 	char *filter = NULL;
    863 	char *atlist[3];
    864 	char *basedn = NULL;
    865 	char *userdn = NULL;
    866 	size_t tmplen = 0;
    867 	int ecount = 0;
    868 	int scope = LDAP_SCOPE_ONE;
    869 
    870 	atlist[0] = NULL;
    871 	atlist[1] = NULL;
    872 	atlist[2] = NULL;
    873 
    874 	if (xauth_ldap_config.uri != NULL) {
    875 		tmplen = strlen(xauth_ldap_config.uri->v);
    876 		init = racoon_malloc(tmplen);
    877 		if (init == NULL) {
    878 			plog(LLV_ERROR, LOCATION, NULL,
    879 				"unable to alloc ldap init url\n");
    880 			goto ldap_end;
    881 		}
    882 		sprintf(init,"%s", xauth_ldap_config.uri->v);
    883 	} else {
    884 		/* build our initialization url */
    885 		tmplen = strlen("ldap://:") + 17;
    886 		tmplen += strlen(xauth_ldap_config.host->v);
    887 		init = racoon_malloc(tmplen);
    888 		if (init == NULL) {
    889 			plog(LLV_ERROR, LOCATION, NULL,
    890 				"unable to alloc ldap init url\n");
    891 			goto ldap_end;
    892 		}
    893 		sprintf(init,"ldap://%s:%d",
    894 			xauth_ldap_config.host->v,
    895 			xauth_ldap_config.port );
    896 	}
    897 	/* initialize the debug level */
    898 	ldap_set_option(NULL, LDAP_OPT_DEBUG_LEVEL, &xauth_ldap_config.debug);
    899 	ber_set_option(NULL, LBER_OPT_DEBUG_LEVEL, &xauth_ldap_config.debug);
    900 
    901 	plog(LLV_DEBUG, LOCATION, NULL, "ldap URI: %s\n", init);
    902 	/* initialize the ldap handle */
    903 	res = ldap_initialize(&ld, init);
    904 	if (res != LDAP_SUCCESS) {
    905 		plog(LLV_ERROR, LOCATION, NULL,
    906 			"ldap_initialize failed: %s\n",
    907 			ldap_err2string(res));
    908 		goto ldap_end;
    909 	}
    910 
    911 	/* initialize the protocol version */
    912 	if ((res = ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION,
    913 		&xauth_ldap_config.pver)) != LDAP_OPT_SUCCESS) {
    914 		plog(LLV_ERROR, LOCATION, NULL,
    915 			"LDAP_OPT_PROTOCOL_VERSION %d failed: %s\n",
    916 			xauth_ldap_config.pver,
    917 			ldap_err2string(res));
    918 		goto ldap_end;
    919 	}
    920 
    921 	if (xauth_ldap_config.timeout > 0) {
    922 		static struct timeval timeout1;
    923 		timeout1.tv_sec = xauth_ldap_config.timeout;
    924 		timeout1.tv_usec = 0;
    925 		if ((res = ldap_set_option(ld, LDAP_OPT_NETWORK_TIMEOUT,
    926 			(void *)&timeout1)) != LDAP_OPT_SUCCESS) {
    927 			plog(LLV_ERROR, LOCATION, NULL,
    928 				"LDAP_OPT_NETWORK_TIMEOUT %d failed: %s\n",
    929 				xauth_ldap_config.timeout,
    930 				ldap_err2string(res));
    931 			goto ldap_end;
    932 		}
    933 	}
    934 
    935 	/* Enable TLS */
    936 	if (xauth_ldap_config.tls) {
    937 		res = ldap_start_tls_s(ld, NULL, NULL);
    938 		if (res != LDAP_SUCCESS) {
    939 			plog(LLV_ERROR, LOCATION, NULL,
    940 			     "ldap_start_tls_s failed: %s\n",
    941 			     ldap_err2string(res));
    942 			goto ldap_end;
    943 		}
    944 	}
    945 
    946 	/*
    947 	 * attempt to bind to the ldap server.
    948          * default to anonymous bind unless a
    949 	 * user dn and password has been
    950 	 * specified in our configuration
    951          */
    952 	if ((xauth_ldap_config.bind_dn != NULL)&&
    953 	    (xauth_ldap_config.bind_pw != NULL))
    954 	{
    955 		cred.bv_val = xauth_ldap_config.bind_pw->v;
    956 		cred.bv_len = strlen( cred.bv_val );
    957 		res = ldap_sasl_bind_s(ld,
    958 			xauth_ldap_config.bind_dn->v, LDAP_SASL_SIMPLE, &cred,
    959 			NULL, NULL, NULL);
    960 	}
    961 	else
    962 	{
    963 		cred.bv_val = NULL;
    964 		cred.bv_len = 0;
    965 		res = ldap_sasl_bind_s(ld,
    966 			NULL, LDAP_SASL_SIMPLE, &cred,
    967 			NULL, NULL, NULL);
    968 	}
    969 
    970 	if (res!=LDAP_SUCCESS) {
    971 		plog(LLV_ERROR, LOCATION, NULL,
    972 			"ldap_sasl_bind_s (search) failed: %s\n",
    973 			ldap_err2string(res));
    974 		goto ldap_end;
    975 	}
    976 
    977 	/* build an ldap user search filter */
    978 	tmplen = strlen(xauth_ldap_config.attr_user->v);
    979 	tmplen += 1;
    980 	tmplen += strlen(usr);
    981 	tmplen += 1;
    982 	filter = racoon_malloc(tmplen);
    983 	if (filter == NULL) {
    984 		plog(LLV_ERROR, LOCATION, NULL,
    985 			"unable to alloc ldap search filter buffer\n");
    986 		goto ldap_end;
    987 	}
    988 	sprintf(filter, "%s=%s",
    989 		xauth_ldap_config.attr_user->v, usr);
    990 
    991 	/* build our return attribute list */
    992 	tmplen = strlen(xauth_ldap_config.attr_addr->v) + 1;
    993 	atlist[0] = racoon_malloc(tmplen);
    994 	tmplen = strlen(xauth_ldap_config.attr_mask->v) + 1;
    995 	atlist[1] = racoon_malloc(tmplen);
    996 	if ((atlist[0] == NULL)||(atlist[1] == NULL)) {
    997 		plog(LLV_ERROR, LOCATION, NULL,
    998 			"unable to alloc ldap attrib list buffer\n");
    999 		goto ldap_end;
   1000 	}
   1001 	strcpy(atlist[0],xauth_ldap_config.attr_addr->v);
   1002 	strcpy(atlist[1],xauth_ldap_config.attr_mask->v);
   1003 
   1004 	/* attempt to locate the user dn */
   1005 	if (xauth_ldap_config.base != NULL)
   1006 		basedn = xauth_ldap_config.base->v;
   1007 	if (xauth_ldap_config.subtree)
   1008 		scope = LDAP_SCOPE_SUBTREE;
   1009 	timeout.tv_sec = 15;
   1010 	timeout.tv_usec = 0;
   1011 	res = ldap_search_ext_s(ld, basedn, scope,
   1012 		filter, atlist, 0, NULL, NULL,
   1013 		&timeout, 2, &lr);
   1014 	if (res != LDAP_SUCCESS) {
   1015 		plog(LLV_ERROR, LOCATION, NULL,
   1016 			"ldap_search_ext_s failed: %s\n",
   1017 			ldap_err2string(res));
   1018 		goto ldap_end;
   1019 	}
   1020 
   1021 	/* check the number of ldap entries returned */
   1022 	ecount = ldap_count_entries(ld, lr);
   1023 	if (ecount < 1) {
   1024 		plog(LLV_WARNING, LOCATION, NULL,
   1025 			"no ldap results for filter \'%s\'\n",
   1026 			 filter);
   1027 		goto ldap_end;
   1028 	}
   1029 	if (ecount > 1) {
   1030 		plog(LLV_WARNING, LOCATION, NULL,
   1031 			"multiple (%i) ldap results for filter \'%s\'\n",
   1032 			ecount, filter);
   1033 	}
   1034 
   1035 	/* obtain the dn from the first result */
   1036 	le = ldap_first_entry(ld, lr);
   1037 	if (le == NULL) {
   1038 		plog(LLV_ERROR, LOCATION, NULL,
   1039 			"ldap_first_entry failed: invalid entry returned\n");
   1040 		goto ldap_end;
   1041 	}
   1042 	userdn = ldap_get_dn(ld, le);
   1043 	if (userdn == NULL) {
   1044 		plog(LLV_ERROR, LOCATION, NULL,
   1045 			"ldap_get_dn failed: invalid string returned\n");
   1046 		goto ldap_end;
   1047 	}
   1048 
   1049 	/* cache the user dn in the xauth state */
   1050 	iph1->mode_cfg->xauth.udn = racoon_malloc(strlen(userdn)+1);
   1051 	strcpy(iph1->mode_cfg->xauth.udn,userdn);
   1052 
   1053 	/* retrieve modecfg address */
   1054 	bv = ldap_get_values_len(ld, le, xauth_ldap_config.attr_addr->v);
   1055 	if (bv != NULL)	{
   1056 		char tmpaddr[16];
   1057 		/* sanity check for address value */
   1058 		if ((bv[0]->bv_len < 7)||(bv[0]->bv_len > 15)) {
   1059 			plog(LLV_DEBUG, LOCATION, NULL,
   1060 				"ldap returned invalid modecfg address\n");
   1061 			ldap_value_free_len(bv);
   1062 			goto ldap_end;
   1063 		}
   1064 		memcpy(tmpaddr,bv[0]->bv_val,bv[0]->bv_len);
   1065 		tmpaddr[bv[0]->bv_len]=0;
   1066 		iph1->mode_cfg->addr4.s_addr = inet_addr(tmpaddr);
   1067 		iph1->mode_cfg->flags |= ISAKMP_CFG_ADDR4_EXTERN;
   1068 		plog(LLV_INFO, LOCATION, NULL,
   1069 			"ldap returned modecfg address %s\n", tmpaddr);
   1070 		ldap_value_free_len(bv);
   1071 	}
   1072 
   1073 	/* retrieve modecfg netmask */
   1074 	bv = ldap_get_values_len(ld, le, xauth_ldap_config.attr_mask->v);
   1075 	if (bv != NULL)	{
   1076 		char tmpmask[16];
   1077 		/* sanity check for netmask value */
   1078 		if ((bv[0]->bv_len < 7)||(bv[0]->bv_len > 15)) {
   1079 			plog(LLV_DEBUG, LOCATION, NULL,
   1080 				"ldap returned invalid modecfg netmask\n");
   1081 			ldap_value_free_len(bv);
   1082 			goto ldap_end;
   1083 		}
   1084 		memcpy(tmpmask,bv[0]->bv_val,bv[0]->bv_len);
   1085 		tmpmask[bv[0]->bv_len]=0;
   1086 		iph1->mode_cfg->mask4.s_addr = inet_addr(tmpmask);
   1087 		iph1->mode_cfg->flags |= ISAKMP_CFG_MASK4_EXTERN;
   1088 		plog(LLV_INFO, LOCATION, NULL,
   1089 			"ldap returned modecfg netmask %s\n", tmpmask);
   1090 		ldap_value_free_len(bv);
   1091 	}
   1092 
   1093 	/*
   1094 	 * finally, use the dn and the xauth
   1095 	 * password to check the users given
   1096 	 * credentials by attempting to bind
   1097 	 * to the ldap server
   1098 	 */
   1099 	plog(LLV_INFO, LOCATION, NULL,
   1100 		"attempting ldap bind for dn \'%s\'\n", userdn);
   1101 	cred.bv_val = pwd;
   1102 	cred.bv_len = strlen( cred.bv_val );
   1103 	res = ldap_sasl_bind_s(ld,
   1104 		userdn, NULL, &cred,
   1105 		NULL, NULL, NULL);
   1106         if(res==LDAP_SUCCESS)
   1107 		rtn = 0;
   1108 
   1109 ldap_end:
   1110 
   1111 	/* free ldap resources */
   1112 	if (userdn != NULL)
   1113 		ldap_memfree(userdn);
   1114 	if (atlist[0] != NULL)
   1115 		racoon_free(atlist[0]);
   1116 	if (atlist[1] != NULL)
   1117 		racoon_free(atlist[1]);
   1118 	if (filter != NULL)
   1119 		racoon_free(filter);
   1120 	if (lr != NULL)
   1121 		ldap_msgfree(lr);
   1122 	if (init != NULL)
   1123 		racoon_free(init);
   1124 
   1125 	ldap_unbind_ext_s(ld, NULL, NULL);
   1126 
   1127 	return rtn;
   1128 }
   1129 
   1130 static int
   1131 xauth_group_ldap(char * udn, char * grp)
   1132 {
   1133 	int rtn = -1;
   1134 	int res = -1;
   1135 	LDAP *ld = NULL;
   1136 	LDAPMessage *lr = NULL;
   1137 	LDAPMessage *le = NULL;
   1138 	struct berval cred;
   1139 	struct timeval timeout;
   1140 	char *init = NULL;
   1141 	char *filter = NULL;
   1142 	char *basedn = NULL;
   1143 	char *groupdn = NULL;
   1144 	size_t tmplen = 0;
   1145 	int ecount = 0;
   1146 	int scope = LDAP_SCOPE_ONE;
   1147 
   1148 	/* build our initialization url */
   1149 	tmplen = strlen("ldap://:") + 17;
   1150 	tmplen += strlen(xauth_ldap_config.host->v);
   1151 	init = racoon_malloc(tmplen);
   1152 	if (init == NULL) {
   1153 		plog(LLV_ERROR, LOCATION, NULL,
   1154 			"unable to alloc ldap init url\n");
   1155 		goto ldap_group_end;
   1156 	}
   1157 	sprintf(init,"ldap://%s:%d",
   1158 		xauth_ldap_config.host->v,
   1159 		xauth_ldap_config.port );
   1160 
   1161 	/* initialize the ldap handle */
   1162 	res = ldap_initialize(&ld, init);
   1163 	if (res != LDAP_SUCCESS) {
   1164 		plog(LLV_ERROR, LOCATION, NULL,
   1165 			"ldap_initialize failed: %s\n",
   1166 			ldap_err2string(res));
   1167 		goto ldap_group_end;
   1168 	}
   1169 
   1170 	/* initialize the protocol version */
   1171 	ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION,
   1172 		&xauth_ldap_config.pver);
   1173 
   1174 	/* Enable TLS */
   1175 	if (xauth_ldap_config.tls) {
   1176 		res = ldap_start_tls_s(ld, NULL, NULL);
   1177 		if (res != LDAP_SUCCESS) {
   1178 			plog(LLV_ERROR, LOCATION, NULL,
   1179 			     "ldap_start_tls_s failed: %s\n",
   1180 			     ldap_err2string(res));
   1181 			goto ldap_group_end;
   1182 		}
   1183 	}
   1184 
   1185 	/*
   1186 	 * attempt to bind to the ldap server.
   1187          * default to anonymous bind unless a
   1188 	 * user dn and password has been
   1189 	 * specified in our configuration
   1190          */
   1191 	if ((xauth_ldap_config.bind_dn != NULL)&&
   1192 	    (xauth_ldap_config.bind_pw != NULL))
   1193 	{
   1194 		cred.bv_val = xauth_ldap_config.bind_pw->v;
   1195 		cred.bv_len = strlen( cred.bv_val );
   1196 		res = ldap_sasl_bind_s(ld,
   1197 			xauth_ldap_config.bind_dn->v, NULL, &cred,
   1198 			NULL, NULL, NULL);
   1199 	}
   1200 	else
   1201 	{
   1202 		res = ldap_sasl_bind_s(ld,
   1203 			NULL, NULL, NULL,
   1204 			NULL, NULL, NULL);
   1205 	}
   1206 
   1207 	if (res!=LDAP_SUCCESS) {
   1208 		plog(LLV_ERROR, LOCATION, NULL,
   1209 			"ldap_sasl_bind_s (search) failed: %s\n",
   1210 			ldap_err2string(res));
   1211 		goto ldap_group_end;
   1212 	}
   1213 
   1214 	/* build an ldap group search filter */
   1215 	tmplen = strlen("(&(=)(=))") + 1;
   1216 	tmplen += strlen(xauth_ldap_config.attr_group->v);
   1217 	tmplen += strlen(grp);
   1218 	tmplen += strlen(xauth_ldap_config.attr_member->v);
   1219 	tmplen += strlen(udn);
   1220 	filter = racoon_malloc(tmplen);
   1221 	if (filter == NULL) {
   1222 		plog(LLV_ERROR, LOCATION, NULL,
   1223 			"unable to alloc ldap search filter buffer\n");
   1224 		goto ldap_group_end;
   1225 	}
   1226 	sprintf(filter, "(&(%s=%s)(%s=%s))",
   1227 		xauth_ldap_config.attr_group->v, grp,
   1228 		xauth_ldap_config.attr_member->v, udn);
   1229 
   1230 	/* attempt to locate the group dn */
   1231 	if (xauth_ldap_config.base != NULL)
   1232 		basedn = xauth_ldap_config.base->v;
   1233 	if (xauth_ldap_config.subtree)
   1234 		scope = LDAP_SCOPE_SUBTREE;
   1235 	timeout.tv_sec = 15;
   1236 	timeout.tv_usec = 0;
   1237 	res = ldap_search_ext_s(ld, basedn, scope,
   1238 		filter, NULL, 0, NULL, NULL,
   1239 		&timeout, 2, &lr);
   1240 	if (res != LDAP_SUCCESS) {
   1241 		plog(LLV_ERROR, LOCATION, NULL,
   1242 			"ldap_search_ext_s failed: %s\n",
   1243 			ldap_err2string(res));
   1244 		goto ldap_group_end;
   1245 	}
   1246 
   1247 	/* check the number of ldap entries returned */
   1248 	ecount = ldap_count_entries(ld, lr);
   1249 	if (ecount < 1) {
   1250 		plog(LLV_WARNING, LOCATION, NULL,
   1251 			"no ldap results for filter \'%s\'\n",
   1252 			 filter);
   1253 		goto ldap_group_end;
   1254 	}
   1255 
   1256 	/* success */
   1257 	rtn = 0;
   1258 
   1259 	/* obtain the dn from the first result */
   1260 	le = ldap_first_entry(ld, lr);
   1261 	if (le == NULL) {
   1262 		plog(LLV_ERROR, LOCATION, NULL,
   1263 			"ldap_first_entry failed: invalid entry returned\n");
   1264 		goto ldap_group_end;
   1265 	}
   1266 	groupdn = ldap_get_dn(ld, le);
   1267 	if (groupdn == NULL) {
   1268 		plog(LLV_ERROR, LOCATION, NULL,
   1269 			"ldap_get_dn failed: invalid string returned\n");
   1270 		goto ldap_group_end;
   1271 	}
   1272 
   1273 	plog(LLV_INFO, LOCATION, NULL,
   1274 		"ldap membership group returned \'%s\'\n", groupdn);
   1275 ldap_group_end:
   1276 
   1277 	/* free ldap resources */
   1278 	if (groupdn != NULL)
   1279 		ldap_memfree(groupdn);
   1280 	if (filter != NULL)
   1281 		racoon_free(filter);
   1282 	if (lr != NULL)
   1283 		ldap_msgfree(lr);
   1284 	if (init != NULL)
   1285 		racoon_free(init);
   1286 
   1287 	ldap_unbind_ext_s(ld, NULL, NULL);
   1288 
   1289 	return rtn;
   1290 }
   1291 
   1292 #endif
   1293 
   1294 int
   1295 xauth_login_system(char *usr, char *pwd)
   1296 {
   1297 	struct passwd *pw;
   1298 	char *cryptpwd;
   1299 	char *syscryptpwd;
   1300 #ifdef HAVE_SHADOW_H
   1301 	struct spwd *spw;
   1302 
   1303 	if ((spw = getspnam(usr)) == NULL)
   1304 		return -1;
   1305 
   1306 	syscryptpwd = spw->sp_pwdp;
   1307 #endif
   1308 
   1309 	if ((pw = getpwnam(usr)) == NULL)
   1310 		return -1;
   1311 
   1312 #ifndef HAVE_SHADOW_H
   1313 	syscryptpwd = pw->pw_passwd;
   1314 #endif
   1315 
   1316 	/* No root login. Ever. */
   1317 	if (pw->pw_uid == 0)
   1318 		return -1;
   1319 
   1320 	if ((cryptpwd = crypt(pwd, syscryptpwd)) == NULL)
   1321 		return -1;
   1322 
   1323 	if (strcmp(cryptpwd, syscryptpwd) == 0)
   1324 		return 0;
   1325 
   1326 	return -1;
   1327 }
   1328 
   1329 static int
   1330 xauth_group_system(char *usr, char *grp)
   1331 {
   1332 	struct group * gr;
   1333 	char * member;
   1334 	int index1 = 0;
   1335 
   1336 	gr = getgrnam(grp);
   1337 	if (gr == NULL) {
   1338 		plog(LLV_ERROR, LOCATION, NULL,
   1339 			"the system group name \'%s\' is unknown\n",
   1340 			grp);
   1341 		return -1;
   1342 	}
   1343 
   1344 	while ((member = gr->gr_mem[index1++])!=NULL) {
   1345 		if (!strcmp(member,usr)) {
   1346 			plog(LLV_INFO, LOCATION, NULL,
   1347 		                "membership validated\n");
   1348 			return 0;
   1349 		}
   1350 	}
   1351 
   1352 	return -1;
   1353 }
   1354 
   1355 int
   1356 xauth_check(struct ph1handle *iph1)
   1357 {
   1358 	struct xauth_state *xst = &iph1->mode_cfg->xauth;
   1359 
   1360 	/*
   1361  	 * Only the server side (edge device) really check for Xauth
   1362 	 * status. It does it if the chose authmethod is using Xauth.
   1363 	 * On the client side (roadwarrior), we don't check anything.
   1364 	 */
   1365 	switch (iph1->approval->authmethod) {
   1366 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
   1367 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
   1368 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
   1369 	/* The following are not yet implemented */
   1370 	case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
   1371 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
   1372 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
   1373 	case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
   1374 		if ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) == 0) {
   1375 			plog(LLV_ERROR, LOCATION, NULL,
   1376 			    "Hybrid auth negotiated but peer did not "
   1377 			    "announced as Xauth capable\n");
   1378 			return -1;
   1379 		}
   1380 
   1381 		if (xst->status != XAUTHST_OK) {
   1382 			plog(LLV_ERROR, LOCATION, NULL,
   1383 			    "Hybrid auth negotiated but peer did not "
   1384 			    "succeed Xauth exchange\n");
   1385 			return -1;
   1386 		}
   1387 
   1388 		return 0;
   1389 	default:
   1390 		return 0;
   1391 	}
   1392 }
   1393 
   1394 int
   1395 group_check(struct ph1handle *iph1, char **grp_list, int grp_count)
   1396 {
   1397 	int res = -1;
   1398 	int grp_index = 0;
   1399 	char * usr = NULL;
   1400 
   1401 	/* check for presence of modecfg data */
   1402 
   1403 	if(iph1->mode_cfg == NULL) {
   1404 		plog(LLV_ERROR, LOCATION, NULL,
   1405 			"xauth group specified but modecfg not found\n");
   1406 		return res;
   1407 	}
   1408 
   1409 	/* loop through our group list */
   1410 
   1411 	for(; grp_index < grp_count; grp_index++) {
   1412 
   1413 		/* check for presence of xauth data */
   1414 
   1415 		usr = iph1->mode_cfg->xauth.authdata.generic.usr;
   1416 
   1417 		if(usr == NULL) {
   1418 			plog(LLV_ERROR, LOCATION, NULL,
   1419 				"xauth group specified but xauth not found\n");
   1420 			return res;
   1421 		}
   1422 
   1423 		/* call appropriate group validation function */
   1424 
   1425 		switch (isakmp_cfg_config.groupsource) {
   1426 
   1427 			case ISAKMP_CFG_GROUP_SYSTEM:
   1428 				res = xauth_group_system(
   1429 					usr,
   1430 					grp_list[grp_index]);
   1431 				break;
   1432 
   1433 #ifdef HAVE_LIBLDAP
   1434 			case ISAKMP_CFG_GROUP_LDAP:
   1435 				res = xauth_group_ldap(
   1436 					iph1->mode_cfg->xauth.udn,
   1437 					grp_list[grp_index]);
   1438 				break;
   1439 #endif
   1440 
   1441 			default:
   1442 				/* we should never get here */
   1443 				plog(LLV_ERROR, LOCATION, NULL,
   1444 				    "Unknown group auth source\n");
   1445 				break;
   1446 		}
   1447 
   1448 		if( !res ) {
   1449 			plog(LLV_INFO, LOCATION, NULL,
   1450 				"user \"%s\" is a member of group \"%s\"\n",
   1451 				usr,
   1452 				grp_list[grp_index]);
   1453 			break;
   1454 		} else {
   1455 			plog(LLV_INFO, LOCATION, NULL,
   1456 				"user \"%s\" is not a member of group \"%s\"\n",
   1457 				usr,
   1458 				grp_list[grp_index]);
   1459 		}
   1460 	}
   1461 
   1462 	return res;
   1463 }
   1464 
   1465 vchar_t *
   1466 isakmp_xauth_req(struct ph1handle *iph1, struct isakmp_data *attr)
   1467 {
   1468 	int type;
   1469 	size_t dlen = 0;
   1470 	int ashort = 0;
   1471 	int value = 0;
   1472 	vchar_t *buffer = NULL;
   1473 	char *mraw = NULL, *mdata;
   1474 	char *data;
   1475 	vchar_t *usr = NULL;
   1476 	vchar_t *pwd = NULL;
   1477 	size_t skip = 0;
   1478 	int freepwd = 0;
   1479 
   1480 	if ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) == 0) {
   1481 		plog(LLV_ERROR, LOCATION, NULL,
   1482 		    "Xauth mode config request but peer "
   1483 		    "did not declare itself as Xauth capable\n");
   1484 		return NULL;
   1485 	}
   1486 
   1487 	type = ntohs(attr->type) & ~ISAKMP_GEN_MASK;
   1488 
   1489 	/* Sanity checks */
   1490 	switch(type) {
   1491 	case XAUTH_TYPE:
   1492 		if ((ntohs(attr->type) & ISAKMP_GEN_TV) == 0) {
   1493 			plog(LLV_ERROR, LOCATION, NULL,
   1494 			    "Unexpected long XAUTH_TYPE attribute\n");
   1495 			return NULL;
   1496 		}
   1497 		if (ntohs(attr->lorv) != XAUTH_TYPE_GENERIC) {
   1498 			plog(LLV_ERROR, LOCATION, NULL,
   1499 			    "Unsupported Xauth authentication %d\n",
   1500 			    ntohs(attr->lorv));
   1501 			return NULL;
   1502 		}
   1503 		ashort = 1;
   1504 		dlen = 0;
   1505 		value = XAUTH_TYPE_GENERIC;
   1506 		break;
   1507 
   1508 	case XAUTH_USER_NAME:
   1509 		if (!iph1->rmconf->xauth || !iph1->rmconf->xauth->login) {
   1510 			plog(LLV_ERROR, LOCATION, NULL, "Xauth performed "
   1511 			    "with no login supplied\n");
   1512 			return NULL;
   1513 		}
   1514 
   1515 		dlen = iph1->rmconf->xauth->login->l - 1;
   1516 		iph1->rmconf->xauth->state |= XAUTH_SENT_USERNAME;
   1517 		break;
   1518 
   1519 	case XAUTH_USER_PASSWORD:
   1520 		if (!iph1->rmconf->xauth || !iph1->rmconf->xauth->login)
   1521 			return NULL;
   1522 
   1523 		skip = sizeof(struct ipsecdoi_id_b);
   1524 		usr = vmalloc(iph1->rmconf->xauth->login->l - 1 + skip);
   1525 		if (usr == NULL) {
   1526 			plog(LLV_ERROR, LOCATION, NULL,
   1527 			    "Cannot allocate memory\n");
   1528 			return NULL;
   1529 		}
   1530 		memset(usr->v, 0, skip);
   1531 		memcpy(usr->v + skip,
   1532 		    iph1->rmconf->xauth->login->v,
   1533 		    iph1->rmconf->xauth->login->l - 1);
   1534 
   1535 		if (iph1->rmconf->xauth->pass) {
   1536 			/* A key given through racoonctl */
   1537 			pwd = iph1->rmconf->xauth->pass;
   1538 		} else {
   1539 			if ((pwd = getpskbyname(usr)) == NULL) {
   1540 				plog(LLV_ERROR, LOCATION, NULL,
   1541 				    "No password was found for login %s\n",
   1542 				    iph1->rmconf->xauth->login->v);
   1543 				vfree(usr);
   1544 				return NULL;
   1545 			}
   1546 			/* We have to free it before returning */
   1547 			freepwd = 1;
   1548 		}
   1549 		vfree(usr);
   1550 
   1551 		iph1->rmconf->xauth->state |= XAUTH_SENT_PASSWORD;
   1552 		dlen = pwd->l;
   1553 
   1554 		break;
   1555 	case XAUTH_MESSAGE:
   1556 		if ((ntohs(attr->type) & ISAKMP_GEN_TV) == 0) {
   1557 			dlen = ntohs(attr->lorv);
   1558 			if (dlen > 0) {
   1559 				mraw = (char*)(attr + 1);
   1560 				mdata = binsanitize(mraw, dlen);
   1561 				if (mdata == NULL) {
   1562 					plog(LLV_ERROR, LOCATION, iph1->remote,
   1563 					    "Cannot allocate memory\n");
   1564 					return NULL;
   1565 				}
   1566 				plog(LLV_NOTIFY,LOCATION, iph1->remote,
   1567 					"XAUTH Message: '%s'.\n",
   1568 					mdata);
   1569 				racoon_free(mdata);
   1570 			}
   1571 		}
   1572 		return NULL;
   1573 	default:
   1574 		plog(LLV_WARNING, LOCATION, NULL,
   1575 		    "Ignored attribute %s\n", s_isakmp_cfg_type(type));
   1576 		return NULL;
   1577 	}
   1578 
   1579 	if ((buffer = vmalloc(sizeof(*attr) + dlen)) == NULL) {
   1580 		plog(LLV_ERROR, LOCATION, NULL,
   1581 		    "Cannot allocate memory\n");
   1582 		goto out;
   1583 	}
   1584 
   1585 	attr = (struct isakmp_data *)buffer->v;
   1586 	if (ashort) {
   1587 		attr->type = htons(type | ISAKMP_GEN_TV);
   1588 		attr->lorv = htons(value);
   1589 		goto out;
   1590 	}
   1591 
   1592 	attr->type = htons(type | ISAKMP_GEN_TLV);
   1593 	attr->lorv = htons(dlen);
   1594 	data = (char *)(attr + 1);
   1595 
   1596 	switch(type) {
   1597 	case XAUTH_USER_NAME:
   1598 		/*
   1599 		 * iph1->rmconf->xauth->login->v is valid,
   1600 		 * we just checked it in the previous switch case
   1601 		 */
   1602 		memcpy(data, iph1->rmconf->xauth->login->v, dlen);
   1603 		break;
   1604 	case XAUTH_USER_PASSWORD:
   1605 		memcpy(data, pwd->v, dlen);
   1606 		break;
   1607 	default:
   1608 		break;
   1609 	}
   1610 
   1611 out:
   1612 	if (freepwd)
   1613 		vfree(pwd);
   1614 
   1615 	return buffer;
   1616 }
   1617 
   1618 vchar_t *
   1619 isakmp_xauth_set(struct ph1handle *iph1, struct isakmp_data *attr)
   1620 {
   1621 	int type;
   1622 	vchar_t *buffer = NULL;
   1623 	size_t dlen = 0;
   1624 	char* mraw = NULL, *mdata;
   1625 
   1626 	if ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) == 0) {
   1627 		plog(LLV_ERROR, LOCATION, NULL,
   1628 		    "Xauth mode config set but peer "
   1629 		    "did not declare itself as Xauth capable\n");
   1630 		return NULL;
   1631 	}
   1632 
   1633 	type = ntohs(attr->type) & ~ISAKMP_GEN_MASK;
   1634 
   1635 	switch(type) {
   1636 	case XAUTH_STATUS:
   1637 		/*
   1638 		 * We should only receive ISAKMP mode_cfg SET XAUTH_STATUS
   1639 		 * when running as a client (initiator).
   1640 		 */
   1641 		switch (iph1->approval->authmethod) {
   1642 		case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_I:
   1643 		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I:
   1644 		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_I:
   1645 		/* Not implemented ... */
   1646 		case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_I:
   1647 		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_I:
   1648 		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_I:
   1649 		case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_I:
   1650 			break;
   1651 		default:
   1652 			plog(LLV_ERROR, LOCATION, NULL,
   1653 			    "Unexpected XAUTH_STATUS_OK\n");
   1654 			return NULL;
   1655 		}
   1656 
   1657 		/* If we got a failure, delete iph1 */
   1658 		if (ntohs(attr->lorv) != XAUTH_STATUS_OK) {
   1659 			plog(LLV_ERROR, LOCATION, NULL,
   1660 			    "Xauth authentication failed\n");
   1661 
   1662 			evt_phase1(iph1, EVT_PHASE1_XAUTH_FAILED, NULL);
   1663 
   1664 			iph1->mode_cfg->flags |= ISAKMP_CFG_DELETE_PH1;
   1665 		} else {
   1666 			evt_phase1(iph1, EVT_PHASE1_XAUTH_SUCCESS, NULL);
   1667 		}
   1668 
   1669 
   1670 		/* We acknowledge it */
   1671 		break;
   1672 	case XAUTH_MESSAGE:
   1673 		if ((ntohs(attr->type) & ISAKMP_GEN_TV) == 0) {
   1674 			dlen = ntohs(attr->lorv);
   1675 			if (dlen > 0) {
   1676 				mraw = (char*)(attr + 1);
   1677 				mdata = binsanitize(mraw, dlen);
   1678 				if (mdata == NULL) {
   1679 					plog(LLV_ERROR, LOCATION, iph1->remote,
   1680 					    "Cannot allocate memory\n");
   1681 					return NULL;
   1682 				}
   1683 				plog(LLV_NOTIFY,LOCATION, iph1->remote,
   1684 					"XAUTH Message: '%s'.\n",
   1685 					mdata);
   1686 				racoon_free(mdata);
   1687 			}
   1688 		}
   1689 		break;
   1690 
   1691 	default:
   1692 		plog(LLV_WARNING, LOCATION, NULL,
   1693 		    "Ignored attribute %s\n", s_isakmp_cfg_type(type));
   1694 		return NULL;
   1695 	}
   1696 
   1697 	if ((buffer = vmalloc(sizeof(*attr))) == NULL) {
   1698 		plog(LLV_ERROR, LOCATION, NULL,
   1699 		    "Cannot allocate memory\n");
   1700 		return NULL;
   1701 	}
   1702 
   1703 	attr = (struct isakmp_data *)buffer->v;
   1704 	attr->type = htons(type | ISAKMP_GEN_TV);
   1705 	attr->lorv = htons(0);
   1706 
   1707 	return buffer;
   1708 }
   1709 
   1710 
   1711 void
   1712 xauth_rmstate(struct xauth_state *xst)
   1713 {
   1714 	switch (xst->authtype) {
   1715 	case XAUTH_TYPE_GENERIC:
   1716 		if (xst->authdata.generic.usr)
   1717 			racoon_free(xst->authdata.generic.usr);
   1718 
   1719 		if (xst->authdata.generic.pwd)
   1720 			racoon_free(xst->authdata.generic.pwd);
   1721 
   1722 		break;
   1723 
   1724 	case XAUTH_TYPE_CHAP:
   1725 	case XAUTH_TYPE_OTP:
   1726 	case XAUTH_TYPE_SKEY:
   1727 		plog(LLV_WARNING, LOCATION, NULL,
   1728 		    "Unsupported authtype %d\n", xst->authtype);
   1729 		break;
   1730 
   1731 	default:
   1732 		plog(LLV_WARNING, LOCATION, NULL,
   1733 		    "Unexpected authtype %d\n", xst->authtype);
   1734 		break;
   1735 	}
   1736 
   1737 #ifdef HAVE_LIBLDAP
   1738 	if (xst->udn != NULL)
   1739 		racoon_free(xst->udn);
   1740 #endif
   1741 	return;
   1742 }
   1743 
   1744 int
   1745 xauth_rmconf_used(struct xauth_rmconf **xauth_rmconf)
   1746 {
   1747 	if (*xauth_rmconf == NULL) {
   1748 		*xauth_rmconf = racoon_malloc(sizeof(**xauth_rmconf));
   1749 		if (*xauth_rmconf == NULL) {
   1750 			plog(LLV_ERROR, LOCATION, NULL,
   1751 			    "xauth_rmconf_used: malloc failed\n");
   1752 			return -1;
   1753 		}
   1754 
   1755 		(*xauth_rmconf)->login = NULL;
   1756 		(*xauth_rmconf)->pass = NULL;
   1757 		(*xauth_rmconf)->state = 0;
   1758 	}
   1759 
   1760 	return 0;
   1761 }
   1762 
   1763 void
   1764 xauth_rmconf_delete(struct xauth_rmconf **xauth_rmconf)
   1765 {
   1766 	if (*xauth_rmconf != NULL) {
   1767 		if ((*xauth_rmconf)->login != NULL)
   1768 			vfree((*xauth_rmconf)->login);
   1769 		if ((*xauth_rmconf)->pass != NULL)
   1770 			vfree((*xauth_rmconf)->pass);
   1771 
   1772 		racoon_free(*xauth_rmconf);
   1773 		*xauth_rmconf = NULL;
   1774 	}
   1775 
   1776 	return;
   1777 }
   1778 
   1779 struct xauth_rmconf *
   1780 xauth_rmconf_dup(struct xauth_rmconf *xauth_rmconf)
   1781 {
   1782 	struct xauth_rmconf *new;
   1783 
   1784 	if (xauth_rmconf != NULL) {
   1785 		new = racoon_malloc(sizeof(*new));
   1786 		if (new == NULL) {
   1787 			plog(LLV_ERROR, LOCATION, NULL,
   1788 			    "%s: malloc failed\n", __func__);
   1789 			return NULL;
   1790 		}
   1791 
   1792 		memcpy(new, xauth_rmconf, sizeof(*new));
   1793 
   1794 		if (xauth_rmconf->login != NULL) {
   1795 			new->login = vdup(xauth_rmconf->login);
   1796 			if (new->login == NULL) {
   1797 				plog(LLV_ERROR, LOCATION, NULL,
   1798 				    "%s: malloc failed (login)\n", __func__);
   1799 				goto out;
   1800 			}
   1801 		}
   1802 		if (xauth_rmconf->pass != NULL) {
   1803 			new->pass = vdup(xauth_rmconf->pass);
   1804 			if (new->pass == NULL) {
   1805 				plog(LLV_ERROR, LOCATION, NULL,
   1806 				    "%s: malloc failed (password)\n", __func__);
   1807 				goto out;
   1808 			}
   1809 		}
   1810 
   1811 		return new;
   1812 	}
   1813 
   1814 	return NULL;
   1815 out:
   1816 	vfree(new->login);
   1817 	racoon_free(new);
   1818 	return NULL;
   1819 }
   1820