Annotation of embedaddon/ipsec-tools/src/racoon/cfparse.y, revision 1.1
1.1 ! misho 1: /* $NetBSD: cfparse.y,v 1.42 2011/03/14 15:50:36 vanhu Exp $ */
! 2:
! 3: /* Id: cfparse.y,v 1.66 2006/08/22 18:17:17 manubsd Exp */
! 4:
! 5: %{
! 6: /*
! 7: * Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 and 2003 WIDE Project.
! 8: * All rights reserved.
! 9: *
! 10: * Redistribution and use in source and binary forms, with or without
! 11: * modification, are permitted provided that the following conditions
! 12: * are met:
! 13: * 1. Redistributions of source code must retain the above copyright
! 14: * notice, this list of conditions and the following disclaimer.
! 15: * 2. Redistributions in binary form must reproduce the above copyright
! 16: * notice, this list of conditions and the following disclaimer in the
! 17: * documentation and/or other materials provided with the distribution.
! 18: * 3. Neither the name of the project nor the names of its contributors
! 19: * may be used to endorse or promote products derived from this software
! 20: * without specific prior written permission.
! 21: *
! 22: * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
! 23: * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
! 24: * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
! 25: * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
! 26: * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
! 27: * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
! 28: * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
! 29: * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
! 30: * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
! 31: * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
! 32: * SUCH DAMAGE.
! 33: */
! 34:
! 35: #include "config.h"
! 36:
! 37: #include <sys/types.h>
! 38: #include <sys/param.h>
! 39: #include <sys/queue.h>
! 40: #include <sys/socket.h>
! 41:
! 42: #include <netinet/in.h>
! 43: #include PATH_IPSEC_H
! 44:
! 45: #ifdef ENABLE_HYBRID
! 46: #include <arpa/inet.h>
! 47: #endif
! 48:
! 49: #include <stdlib.h>
! 50: #include <stdio.h>
! 51: #include <string.h>
! 52: #include <errno.h>
! 53: #include <netdb.h>
! 54: #include <pwd.h>
! 55: #include <grp.h>
! 56:
! 57: #include "var.h"
! 58: #include "misc.h"
! 59: #include "vmbuf.h"
! 60: #include "plog.h"
! 61: #include "sockmisc.h"
! 62: #include "str2val.h"
! 63: #include "genlist.h"
! 64: #include "debug.h"
! 65:
! 66: #include "admin.h"
! 67: #include "privsep.h"
! 68: #include "cfparse_proto.h"
! 69: #include "cftoken_proto.h"
! 70: #include "algorithm.h"
! 71: #include "localconf.h"
! 72: #include "policy.h"
! 73: #include "sainfo.h"
! 74: #include "oakley.h"
! 75: #include "pfkey.h"
! 76: #include "remoteconf.h"
! 77: #include "grabmyaddr.h"
! 78: #include "isakmp_var.h"
! 79: #include "handler.h"
! 80: #include "isakmp.h"
! 81: #include "nattraversal.h"
! 82: #include "isakmp_frag.h"
! 83: #ifdef ENABLE_HYBRID
! 84: #include "resolv.h"
! 85: #include "isakmp_unity.h"
! 86: #include "isakmp_xauth.h"
! 87: #include "isakmp_cfg.h"
! 88: #endif
! 89: #include "ipsec_doi.h"
! 90: #include "strnames.h"
! 91: #include "gcmalloc.h"
! 92: #ifdef HAVE_GSSAPI
! 93: #include "gssapi.h"
! 94: #endif
! 95: #include "vendorid.h"
! 96: #include "rsalist.h"
! 97: #include "crypto_openssl.h"
! 98:
! 99: struct secprotospec {
! 100: int prop_no;
! 101: int trns_no;
! 102: int strength; /* for isakmp/ipsec */
! 103: int encklen; /* for isakmp/ipsec */
! 104: time_t lifetime; /* for isakmp */
! 105: int lifebyte; /* for isakmp */
! 106: int proto_id; /* for ipsec (isakmp?) */
! 107: int ipsec_level; /* for ipsec */
! 108: int encmode; /* for ipsec */
! 109: int vendorid; /* for isakmp */
! 110: char *gssid;
! 111: struct sockaddr *remote;
! 112: int algclass[MAXALGCLASS];
! 113:
! 114: struct secprotospec *next; /* the tail is the most prefiered. */
! 115: struct secprotospec *prev;
! 116: };
! 117:
! 118: static int num2dhgroup[] = {
! 119: 0,
! 120: OAKLEY_ATTR_GRP_DESC_MODP768,
! 121: OAKLEY_ATTR_GRP_DESC_MODP1024,
! 122: OAKLEY_ATTR_GRP_DESC_EC2N155,
! 123: OAKLEY_ATTR_GRP_DESC_EC2N185,
! 124: OAKLEY_ATTR_GRP_DESC_MODP1536,
! 125: 0,
! 126: 0,
! 127: 0,
! 128: 0,
! 129: 0,
! 130: 0,
! 131: 0,
! 132: 0,
! 133: OAKLEY_ATTR_GRP_DESC_MODP2048,
! 134: OAKLEY_ATTR_GRP_DESC_MODP3072,
! 135: OAKLEY_ATTR_GRP_DESC_MODP4096,
! 136: OAKLEY_ATTR_GRP_DESC_MODP6144,
! 137: OAKLEY_ATTR_GRP_DESC_MODP8192
! 138: };
! 139:
! 140: static struct remoteconf *cur_rmconf;
! 141: static int tmpalgtype[MAXALGCLASS];
! 142: static struct sainfo *cur_sainfo;
! 143: static int cur_algclass;
! 144: static int oldloglevel = LLV_BASE;
! 145:
! 146: static struct secprotospec *newspspec __P((void));
! 147: static void insspspec __P((struct remoteconf *, struct secprotospec *));
! 148: void dupspspec_list __P((struct remoteconf *dst, struct remoteconf *src));
! 149: void flushspspec __P((struct remoteconf *));
! 150: static void adminsock_conf __P((vchar_t *, vchar_t *, vchar_t *, int));
! 151:
! 152: static int set_isakmp_proposal __P((struct remoteconf *));
! 153: static void clean_tmpalgtype __P((void));
! 154: static int expand_isakmpspec __P((int, int, int *,
! 155: int, int, time_t, int, int, int, char *, struct remoteconf *));
! 156:
! 157: void freeetypes (struct etypes **etypes);
! 158:
! 159: static int load_x509(const char *file, char **filenameptr,
! 160: vchar_t **certptr)
! 161: {
! 162: char path[PATH_MAX];
! 163:
! 164: getpathname(path, sizeof(path), LC_PATHTYPE_CERT, file);
! 165: *certptr = eay_get_x509cert(path);
! 166: if (*certptr == NULL)
! 167: return -1;
! 168:
! 169: *filenameptr = racoon_strdup(file);
! 170: STRDUP_FATAL(*filenameptr);
! 171:
! 172: return 0;
! 173: }
! 174:
! 175: %}
! 176:
! 177: %union {
! 178: unsigned long num;
! 179: vchar_t *val;
! 180: struct remoteconf *rmconf;
! 181: struct sockaddr *saddr;
! 182: struct sainfoalg *alg;
! 183: }
! 184:
! 185: /* privsep */
! 186: %token PRIVSEP USER GROUP CHROOT
! 187: /* path */
! 188: %token PATH PATHTYPE
! 189: /* include */
! 190: %token INCLUDE
! 191: /* PFKEY_BUFFER */
! 192: %token PFKEY_BUFFER
! 193: /* logging */
! 194: %token LOGGING LOGLEV
! 195: /* padding */
! 196: %token PADDING PAD_RANDOMIZE PAD_RANDOMIZELEN PAD_MAXLEN PAD_STRICT PAD_EXCLTAIL
! 197: /* listen */
! 198: %token LISTEN X_ISAKMP X_ISAKMP_NATT X_ADMIN STRICT_ADDRESS ADMINSOCK DISABLED
! 199: /* ldap config */
! 200: %token LDAPCFG LDAP_HOST LDAP_PORT LDAP_PVER LDAP_BASE LDAP_BIND_DN LDAP_BIND_PW LDAP_SUBTREE
! 201: %token LDAP_ATTR_USER LDAP_ATTR_ADDR LDAP_ATTR_MASK LDAP_ATTR_GROUP LDAP_ATTR_MEMBER
! 202: /* radius config */
! 203: %token RADCFG RAD_AUTH RAD_ACCT RAD_TIMEOUT RAD_RETRIES
! 204: /* modecfg */
! 205: %token MODECFG CFG_NET4 CFG_MASK4 CFG_DNS4 CFG_NBNS4 CFG_DEFAULT_DOMAIN
! 206: %token CFG_AUTH_SOURCE CFG_AUTH_GROUPS CFG_SYSTEM CFG_RADIUS CFG_PAM CFG_LDAP CFG_LOCAL CFG_NONE
! 207: %token CFG_GROUP_SOURCE CFG_ACCOUNTING CFG_CONF_SOURCE CFG_MOTD CFG_POOL_SIZE CFG_AUTH_THROTTLE
! 208: %token CFG_SPLIT_NETWORK CFG_SPLIT_LOCAL CFG_SPLIT_INCLUDE CFG_SPLIT_DNS
! 209: %token CFG_PFS_GROUP CFG_SAVE_PASSWD
! 210:
! 211: /* timer */
! 212: %token RETRY RETRY_COUNTER RETRY_INTERVAL RETRY_PERSEND
! 213: %token RETRY_PHASE1 RETRY_PHASE2 NATT_KA
! 214: /* algorithm */
! 215: %token ALGORITHM_CLASS ALGORITHMTYPE STRENGTHTYPE
! 216: /* sainfo */
! 217: %token SAINFO FROM
! 218: /* remote */
! 219: %token REMOTE ANONYMOUS CLIENTADDR INHERIT REMOTE_ADDRESS
! 220: %token EXCHANGE_MODE EXCHANGETYPE DOI DOITYPE SITUATION SITUATIONTYPE
! 221: %token CERTIFICATE_TYPE CERTTYPE PEERS_CERTFILE CA_TYPE
! 222: %token VERIFY_CERT SEND_CERT SEND_CR MATCH_EMPTY_CR
! 223: %token IDENTIFIERTYPE IDENTIFIERQUAL MY_IDENTIFIER
! 224: %token PEERS_IDENTIFIER VERIFY_IDENTIFIER
! 225: %token DNSSEC CERT_X509 CERT_PLAINRSA
! 226: %token NONCE_SIZE DH_GROUP KEEPALIVE PASSIVE INITIAL_CONTACT
! 227: %token NAT_TRAVERSAL REMOTE_FORCE_LEVEL
! 228: %token PROPOSAL_CHECK PROPOSAL_CHECK_LEVEL
! 229: %token GENERATE_POLICY GENERATE_LEVEL SUPPORT_PROXY
! 230: %token PROPOSAL
! 231: %token EXEC_PATH EXEC_COMMAND EXEC_SUCCESS EXEC_FAILURE
! 232: %token GSS_ID GSS_ID_ENC GSS_ID_ENCTYPE
! 233: %token COMPLEX_BUNDLE
! 234: %token DPD DPD_DELAY DPD_RETRY DPD_MAXFAIL
! 235: %token PH1ID
! 236: %token XAUTH_LOGIN WEAK_PHASE1_CHECK
! 237: %token REKEY
! 238:
! 239: %token PREFIX PORT PORTANY UL_PROTO ANY IKE_FRAG ESP_FRAG MODE_CFG
! 240: %token PFS_GROUP LIFETIME LIFETYPE_TIME LIFETYPE_BYTE STRENGTH REMOTEID
! 241:
! 242: %token SCRIPT PHASE1_UP PHASE1_DOWN PHASE1_DEAD
! 243:
! 244: %token NUMBER SWITCH BOOLEAN
! 245: %token HEXSTRING QUOTEDSTRING ADDRSTRING ADDRRANGE
! 246: %token UNITTYPE_BYTE UNITTYPE_KBYTES UNITTYPE_MBYTES UNITTYPE_TBYTES
! 247: %token UNITTYPE_SEC UNITTYPE_MIN UNITTYPE_HOUR
! 248: %token EOS BOC EOC COMMA
! 249:
! 250: %type <num> NUMBER BOOLEAN SWITCH keylength
! 251: %type <num> PATHTYPE IDENTIFIERTYPE IDENTIFIERQUAL LOGLEV GSS_ID_ENCTYPE
! 252: %type <num> ALGORITHM_CLASS dh_group_num
! 253: %type <num> ALGORITHMTYPE STRENGTHTYPE
! 254: %type <num> PREFIX prefix PORT port ike_port
! 255: %type <num> ul_proto UL_PROTO
! 256: %type <num> EXCHANGETYPE DOITYPE SITUATIONTYPE
! 257: %type <num> CERTTYPE CERT_X509 CERT_PLAINRSA PROPOSAL_CHECK_LEVEL REMOTE_FORCE_LEVEL GENERATE_LEVEL
! 258: %type <num> unittype_time unittype_byte
! 259: %type <val> QUOTEDSTRING HEXSTRING ADDRSTRING ADDRRANGE sainfo_id
! 260: %type <val> identifierstring
! 261: %type <saddr> remote_index ike_addrinfo_port
! 262: %type <alg> algorithm
! 263:
! 264: %%
! 265:
! 266: statements
! 267: : /* nothing */
! 268: | statements statement
! 269: ;
! 270: statement
! 271: : privsep_statement
! 272: | path_statement
! 273: | include_statement
! 274: | pfkey_statement
! 275: | gssenc_statement
! 276: | logging_statement
! 277: | padding_statement
! 278: | listen_statement
! 279: | ldapcfg_statement
! 280: | radcfg_statement
! 281: | modecfg_statement
! 282: | timer_statement
! 283: | sainfo_statement
! 284: | remote_statement
! 285: | special_statement
! 286: ;
! 287:
! 288: /* privsep */
! 289: privsep_statement
! 290: : PRIVSEP BOC privsep_stmts EOC
! 291: ;
! 292: privsep_stmts
! 293: : /* nothing */
! 294: | privsep_stmts privsep_stmt
! 295: ;
! 296: privsep_stmt
! 297: : USER QUOTEDSTRING
! 298: {
! 299: struct passwd *pw;
! 300:
! 301: if ((pw = getpwnam($2->v)) == NULL) {
! 302: yyerror("unknown user \"%s\"", $2->v);
! 303: return -1;
! 304: }
! 305: lcconf->uid = pw->pw_uid;
! 306: }
! 307: EOS
! 308: | USER NUMBER { lcconf->uid = $2; } EOS
! 309: | GROUP QUOTEDSTRING
! 310: {
! 311: struct group *gr;
! 312:
! 313: if ((gr = getgrnam($2->v)) == NULL) {
! 314: yyerror("unknown group \"%s\"", $2->v);
! 315: return -1;
! 316: }
! 317: lcconf->gid = gr->gr_gid;
! 318: }
! 319: EOS
! 320: | GROUP NUMBER { lcconf->gid = $2; } EOS
! 321: | CHROOT QUOTEDSTRING { lcconf->chroot = $2->v; } EOS
! 322: ;
! 323:
! 324: /* path */
! 325: path_statement
! 326: : PATH PATHTYPE QUOTEDSTRING
! 327: {
! 328: if ($2 >= LC_PATHTYPE_MAX) {
! 329: yyerror("invalid path type %d", $2);
! 330: return -1;
! 331: }
! 332:
! 333: /* free old pathinfo */
! 334: if (lcconf->pathinfo[$2])
! 335: racoon_free(lcconf->pathinfo[$2]);
! 336:
! 337: /* set new pathinfo */
! 338: lcconf->pathinfo[$2] = racoon_strdup($3->v);
! 339: STRDUP_FATAL(lcconf->pathinfo[$2]);
! 340: vfree($3);
! 341: }
! 342: EOS
! 343: ;
! 344:
! 345: /* special */
! 346: special_statement
! 347: : COMPLEX_BUNDLE SWITCH { lcconf->complex_bundle = $2; } EOS
! 348: ;
! 349:
! 350: /* include */
! 351: include_statement
! 352: : INCLUDE QUOTEDSTRING EOS
! 353: {
! 354: char path[MAXPATHLEN];
! 355:
! 356: getpathname(path, sizeof(path),
! 357: LC_PATHTYPE_INCLUDE, $2->v);
! 358: vfree($2);
! 359: if (yycf_switch_buffer(path) != 0)
! 360: return -1;
! 361: }
! 362: ;
! 363:
! 364: /* pfkey_buffer */
! 365: pfkey_statement
! 366: : PFKEY_BUFFER NUMBER EOS
! 367: {
! 368: lcconf->pfkey_buffer_size = $2;
! 369: }
! 370: ;
! 371: /* gss_id_enc */
! 372: gssenc_statement
! 373: : GSS_ID_ENC GSS_ID_ENCTYPE EOS
! 374: {
! 375: if ($2 >= LC_GSSENC_MAX) {
! 376: yyerror("invalid GSS ID encoding %d", $2);
! 377: return -1;
! 378: }
! 379: lcconf->gss_id_enc = $2;
! 380: }
! 381: ;
! 382:
! 383: /* logging */
! 384: logging_statement
! 385: : LOGGING log_level EOS
! 386: ;
! 387: log_level
! 388: : LOGLEV
! 389: {
! 390: /*
! 391: * set the loglevel to the value specified
! 392: * in the configuration file plus the number
! 393: * of -d options specified on the command line
! 394: */
! 395: loglevel += $1 - oldloglevel;
! 396: oldloglevel = $1;
! 397: }
! 398: ;
! 399:
! 400: /* padding */
! 401: padding_statement
! 402: : PADDING BOC padding_stmts EOC
! 403: ;
! 404: padding_stmts
! 405: : /* nothing */
! 406: | padding_stmts padding_stmt
! 407: ;
! 408: padding_stmt
! 409: : PAD_RANDOMIZE SWITCH { lcconf->pad_random = $2; } EOS
! 410: | PAD_RANDOMIZELEN SWITCH { lcconf->pad_randomlen = $2; } EOS
! 411: | PAD_MAXLEN NUMBER { lcconf->pad_maxsize = $2; } EOS
! 412: | PAD_STRICT SWITCH { lcconf->pad_strict = $2; } EOS
! 413: | PAD_EXCLTAIL SWITCH { lcconf->pad_excltail = $2; } EOS
! 414: ;
! 415:
! 416: /* listen */
! 417: listen_statement
! 418: : LISTEN BOC listen_stmts EOC
! 419: ;
! 420: listen_stmts
! 421: : /* nothing */
! 422: | listen_stmts listen_stmt
! 423: ;
! 424: listen_stmt
! 425: : X_ISAKMP ike_addrinfo_port
! 426: {
! 427: myaddr_listen($2, FALSE);
! 428: racoon_free($2);
! 429: }
! 430: EOS
! 431: | X_ISAKMP_NATT ike_addrinfo_port
! 432: {
! 433: #ifdef ENABLE_NATT
! 434: myaddr_listen($2, TRUE);
! 435: racoon_free($2);
! 436: #else
! 437: racoon_free($2);
! 438: yyerror("NAT-T support not compiled in.");
! 439: #endif
! 440: }
! 441: EOS
! 442: | ADMINSOCK QUOTEDSTRING QUOTEDSTRING QUOTEDSTRING NUMBER
! 443: {
! 444: #ifdef ENABLE_ADMINPORT
! 445: adminsock_conf($2, $3, $4, $5);
! 446: #else
! 447: yywarn("admin port support not compiled in");
! 448: #endif
! 449: }
! 450: EOS
! 451: | ADMINSOCK QUOTEDSTRING
! 452: {
! 453: #ifdef ENABLE_ADMINPORT
! 454: adminsock_conf($2, NULL, NULL, -1);
! 455: #else
! 456: yywarn("admin port support not compiled in");
! 457: #endif
! 458: }
! 459: EOS
! 460: | ADMINSOCK DISABLED
! 461: {
! 462: #ifdef ENABLE_ADMINPORT
! 463: adminsock_path = NULL;
! 464: #else
! 465: yywarn("admin port support not compiled in");
! 466: #endif
! 467: }
! 468: EOS
! 469: | STRICT_ADDRESS { lcconf->strict_address = TRUE; } EOS
! 470: ;
! 471: ike_addrinfo_port
! 472: : ADDRSTRING ike_port
! 473: {
! 474: char portbuf[10];
! 475:
! 476: snprintf(portbuf, sizeof(portbuf), "%ld", $2);
! 477: $$ = str2saddr($1->v, portbuf);
! 478: vfree($1);
! 479: if (!$$)
! 480: return -1;
! 481: }
! 482: ;
! 483: ike_port
! 484: : /* nothing */ { $$ = PORT_ISAKMP; }
! 485: | PORT { $$ = $1; }
! 486: ;
! 487:
! 488: /* radius configuration */
! 489: radcfg_statement
! 490: : RADCFG {
! 491: #ifndef ENABLE_HYBRID
! 492: yyerror("racoon not configured with --enable-hybrid");
! 493: return -1;
! 494: #endif
! 495: #ifndef HAVE_LIBRADIUS
! 496: yyerror("racoon not configured with --with-libradius");
! 497: return -1;
! 498: #endif
! 499: #ifdef ENABLE_HYBRID
! 500: #ifdef HAVE_LIBRADIUS
! 501: xauth_rad_config.timeout = 3;
! 502: xauth_rad_config.retries = 3;
! 503: #endif
! 504: #endif
! 505: } BOC radcfg_stmts EOC
! 506: ;
! 507: radcfg_stmts
! 508: : /* nothing */
! 509: | radcfg_stmts radcfg_stmt
! 510: ;
! 511: radcfg_stmt
! 512: : RAD_AUTH QUOTEDSTRING QUOTEDSTRING
! 513: {
! 514: #ifdef ENABLE_HYBRID
! 515: #ifdef HAVE_LIBRADIUS
! 516: int i = xauth_rad_config.auth_server_count;
! 517: if (i == RADIUS_MAX_SERVERS) {
! 518: yyerror("maximum radius auth servers exceeded");
! 519: return -1;
! 520: }
! 521:
! 522: xauth_rad_config.auth_server_list[i].host = vdup($2);
! 523: xauth_rad_config.auth_server_list[i].secret = vdup($3);
! 524: xauth_rad_config.auth_server_list[i].port = 0; // default port
! 525: xauth_rad_config.auth_server_count++;
! 526: #endif
! 527: #endif
! 528: }
! 529: EOS
! 530: | RAD_AUTH QUOTEDSTRING NUMBER QUOTEDSTRING
! 531: {
! 532: #ifdef ENABLE_HYBRID
! 533: #ifdef HAVE_LIBRADIUS
! 534: int i = xauth_rad_config.auth_server_count;
! 535: if (i == RADIUS_MAX_SERVERS) {
! 536: yyerror("maximum radius auth servers exceeded");
! 537: return -1;
! 538: }
! 539:
! 540: xauth_rad_config.auth_server_list[i].host = vdup($2);
! 541: xauth_rad_config.auth_server_list[i].secret = vdup($4);
! 542: xauth_rad_config.auth_server_list[i].port = $3;
! 543: xauth_rad_config.auth_server_count++;
! 544: #endif
! 545: #endif
! 546: }
! 547: EOS
! 548: | RAD_ACCT QUOTEDSTRING QUOTEDSTRING
! 549: {
! 550: #ifdef ENABLE_HYBRID
! 551: #ifdef HAVE_LIBRADIUS
! 552: int i = xauth_rad_config.acct_server_count;
! 553: if (i == RADIUS_MAX_SERVERS) {
! 554: yyerror("maximum radius account servers exceeded");
! 555: return -1;
! 556: }
! 557:
! 558: xauth_rad_config.acct_server_list[i].host = vdup($2);
! 559: xauth_rad_config.acct_server_list[i].secret = vdup($3);
! 560: xauth_rad_config.acct_server_list[i].port = 0; // default port
! 561: xauth_rad_config.acct_server_count++;
! 562: #endif
! 563: #endif
! 564: }
! 565: EOS
! 566: | RAD_ACCT QUOTEDSTRING NUMBER QUOTEDSTRING
! 567: {
! 568: #ifdef ENABLE_HYBRID
! 569: #ifdef HAVE_LIBRADIUS
! 570: int i = xauth_rad_config.acct_server_count;
! 571: if (i == RADIUS_MAX_SERVERS) {
! 572: yyerror("maximum radius account servers exceeded");
! 573: return -1;
! 574: }
! 575:
! 576: xauth_rad_config.acct_server_list[i].host = vdup($2);
! 577: xauth_rad_config.acct_server_list[i].secret = vdup($4);
! 578: xauth_rad_config.acct_server_list[i].port = $3;
! 579: xauth_rad_config.acct_server_count++;
! 580: #endif
! 581: #endif
! 582: }
! 583: EOS
! 584: | RAD_TIMEOUT NUMBER
! 585: {
! 586: #ifdef ENABLE_HYBRID
! 587: #ifdef HAVE_LIBRADIUS
! 588: xauth_rad_config.timeout = $2;
! 589: #endif
! 590: #endif
! 591: }
! 592: EOS
! 593: | RAD_RETRIES NUMBER
! 594: {
! 595: #ifdef ENABLE_HYBRID
! 596: #ifdef HAVE_LIBRADIUS
! 597: xauth_rad_config.retries = $2;
! 598: #endif
! 599: #endif
! 600: }
! 601: EOS
! 602: ;
! 603:
! 604: /* ldap configuration */
! 605: ldapcfg_statement
! 606: : LDAPCFG {
! 607: #ifndef ENABLE_HYBRID
! 608: yyerror("racoon not configured with --enable-hybrid");
! 609: return -1;
! 610: #endif
! 611: #ifndef HAVE_LIBLDAP
! 612: yyerror("racoon not configured with --with-libldap");
! 613: return -1;
! 614: #endif
! 615: } BOC ldapcfg_stmts EOC
! 616: ;
! 617: ldapcfg_stmts
! 618: : /* nothing */
! 619: | ldapcfg_stmts ldapcfg_stmt
! 620: ;
! 621: ldapcfg_stmt
! 622: : LDAP_PVER NUMBER
! 623: {
! 624: #ifdef ENABLE_HYBRID
! 625: #ifdef HAVE_LIBLDAP
! 626: if (($2<2)||($2>3))
! 627: yyerror("invalid ldap protocol version (2|3)");
! 628: xauth_ldap_config.pver = $2;
! 629: #endif
! 630: #endif
! 631: }
! 632: EOS
! 633: | LDAP_HOST QUOTEDSTRING
! 634: {
! 635: #ifdef ENABLE_HYBRID
! 636: #ifdef HAVE_LIBLDAP
! 637: if (xauth_ldap_config.host != NULL)
! 638: vfree(xauth_ldap_config.host);
! 639: xauth_ldap_config.host = vdup($2);
! 640: #endif
! 641: #endif
! 642: }
! 643: EOS
! 644: | LDAP_PORT NUMBER
! 645: {
! 646: #ifdef ENABLE_HYBRID
! 647: #ifdef HAVE_LIBLDAP
! 648: xauth_ldap_config.port = $2;
! 649: #endif
! 650: #endif
! 651: }
! 652: EOS
! 653: | LDAP_BASE QUOTEDSTRING
! 654: {
! 655: #ifdef ENABLE_HYBRID
! 656: #ifdef HAVE_LIBLDAP
! 657: if (xauth_ldap_config.base != NULL)
! 658: vfree(xauth_ldap_config.base);
! 659: xauth_ldap_config.base = vdup($2);
! 660: #endif
! 661: #endif
! 662: }
! 663: EOS
! 664: | LDAP_SUBTREE SWITCH
! 665: {
! 666: #ifdef ENABLE_HYBRID
! 667: #ifdef HAVE_LIBLDAP
! 668: xauth_ldap_config.subtree = $2;
! 669: #endif
! 670: #endif
! 671: }
! 672: EOS
! 673: | LDAP_BIND_DN QUOTEDSTRING
! 674: {
! 675: #ifdef ENABLE_HYBRID
! 676: #ifdef HAVE_LIBLDAP
! 677: if (xauth_ldap_config.bind_dn != NULL)
! 678: vfree(xauth_ldap_config.bind_dn);
! 679: xauth_ldap_config.bind_dn = vdup($2);
! 680: #endif
! 681: #endif
! 682: }
! 683: EOS
! 684: | LDAP_BIND_PW QUOTEDSTRING
! 685: {
! 686: #ifdef ENABLE_HYBRID
! 687: #ifdef HAVE_LIBLDAP
! 688: if (xauth_ldap_config.bind_pw != NULL)
! 689: vfree(xauth_ldap_config.bind_pw);
! 690: xauth_ldap_config.bind_pw = vdup($2);
! 691: #endif
! 692: #endif
! 693: }
! 694: EOS
! 695: | LDAP_ATTR_USER QUOTEDSTRING
! 696: {
! 697: #ifdef ENABLE_HYBRID
! 698: #ifdef HAVE_LIBLDAP
! 699: if (xauth_ldap_config.attr_user != NULL)
! 700: vfree(xauth_ldap_config.attr_user);
! 701: xauth_ldap_config.attr_user = vdup($2);
! 702: #endif
! 703: #endif
! 704: }
! 705: EOS
! 706: | LDAP_ATTR_ADDR QUOTEDSTRING
! 707: {
! 708: #ifdef ENABLE_HYBRID
! 709: #ifdef HAVE_LIBLDAP
! 710: if (xauth_ldap_config.attr_addr != NULL)
! 711: vfree(xauth_ldap_config.attr_addr);
! 712: xauth_ldap_config.attr_addr = vdup($2);
! 713: #endif
! 714: #endif
! 715: }
! 716: EOS
! 717: | LDAP_ATTR_MASK QUOTEDSTRING
! 718: {
! 719: #ifdef ENABLE_HYBRID
! 720: #ifdef HAVE_LIBLDAP
! 721: if (xauth_ldap_config.attr_mask != NULL)
! 722: vfree(xauth_ldap_config.attr_mask);
! 723: xauth_ldap_config.attr_mask = vdup($2);
! 724: #endif
! 725: #endif
! 726: }
! 727: EOS
! 728: | LDAP_ATTR_GROUP QUOTEDSTRING
! 729: {
! 730: #ifdef ENABLE_HYBRID
! 731: #ifdef HAVE_LIBLDAP
! 732: if (xauth_ldap_config.attr_group != NULL)
! 733: vfree(xauth_ldap_config.attr_group);
! 734: xauth_ldap_config.attr_group = vdup($2);
! 735: #endif
! 736: #endif
! 737: }
! 738: EOS
! 739: | LDAP_ATTR_MEMBER QUOTEDSTRING
! 740: {
! 741: #ifdef ENABLE_HYBRID
! 742: #ifdef HAVE_LIBLDAP
! 743: if (xauth_ldap_config.attr_member != NULL)
! 744: vfree(xauth_ldap_config.attr_member);
! 745: xauth_ldap_config.attr_member = vdup($2);
! 746: #endif
! 747: #endif
! 748: }
! 749: EOS
! 750: ;
! 751:
! 752: /* modecfg */
! 753: modecfg_statement
! 754: : MODECFG BOC modecfg_stmts EOC
! 755: ;
! 756: modecfg_stmts
! 757: : /* nothing */
! 758: | modecfg_stmts modecfg_stmt
! 759: ;
! 760: modecfg_stmt
! 761: : CFG_NET4 ADDRSTRING
! 762: {
! 763: #ifdef ENABLE_HYBRID
! 764: if (inet_pton(AF_INET, $2->v,
! 765: &isakmp_cfg_config.network4) != 1)
! 766: yyerror("bad IPv4 network address.");
! 767: #else
! 768: yyerror("racoon not configured with --enable-hybrid");
! 769: #endif
! 770: }
! 771: EOS
! 772: | CFG_MASK4 ADDRSTRING
! 773: {
! 774: #ifdef ENABLE_HYBRID
! 775: if (inet_pton(AF_INET, $2->v,
! 776: &isakmp_cfg_config.netmask4) != 1)
! 777: yyerror("bad IPv4 netmask address.");
! 778: #else
! 779: yyerror("racoon not configured with --enable-hybrid");
! 780: #endif
! 781: }
! 782: EOS
! 783: | CFG_DNS4 addrdnslist
! 784: EOS
! 785: | CFG_NBNS4 addrwinslist
! 786: EOS
! 787: | CFG_SPLIT_NETWORK CFG_SPLIT_LOCAL splitnetlist
! 788: {
! 789: #ifdef ENABLE_HYBRID
! 790: isakmp_cfg_config.splitnet_type = UNITY_LOCAL_LAN;
! 791: #else
! 792: yyerror("racoon not configured with --enable-hybrid");
! 793: #endif
! 794: }
! 795: EOS
! 796: | CFG_SPLIT_NETWORK CFG_SPLIT_INCLUDE splitnetlist
! 797: {
! 798: #ifdef ENABLE_HYBRID
! 799: isakmp_cfg_config.splitnet_type = UNITY_SPLIT_INCLUDE;
! 800: #else
! 801: yyerror("racoon not configured with --enable-hybrid");
! 802: #endif
! 803: }
! 804: EOS
! 805: | CFG_SPLIT_DNS splitdnslist
! 806: {
! 807: #ifndef ENABLE_HYBRID
! 808: yyerror("racoon not configured with --enable-hybrid");
! 809: #endif
! 810: }
! 811: EOS
! 812: | CFG_DEFAULT_DOMAIN QUOTEDSTRING
! 813: {
! 814: #ifdef ENABLE_HYBRID
! 815: strncpy(&isakmp_cfg_config.default_domain[0],
! 816: $2->v, MAXPATHLEN);
! 817: isakmp_cfg_config.default_domain[MAXPATHLEN] = '\0';
! 818: vfree($2);
! 819: #else
! 820: yyerror("racoon not configured with --enable-hybrid");
! 821: #endif
! 822: }
! 823: EOS
! 824: | CFG_AUTH_SOURCE CFG_SYSTEM
! 825: {
! 826: #ifdef ENABLE_HYBRID
! 827: isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_SYSTEM;
! 828: #else
! 829: yyerror("racoon not configured with --enable-hybrid");
! 830: #endif
! 831: }
! 832: EOS
! 833: | CFG_AUTH_SOURCE CFG_RADIUS
! 834: {
! 835: #ifdef ENABLE_HYBRID
! 836: #ifdef HAVE_LIBRADIUS
! 837: isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_RADIUS;
! 838: #else /* HAVE_LIBRADIUS */
! 839: yyerror("racoon not configured with --with-libradius");
! 840: #endif /* HAVE_LIBRADIUS */
! 841: #else /* ENABLE_HYBRID */
! 842: yyerror("racoon not configured with --enable-hybrid");
! 843: #endif /* ENABLE_HYBRID */
! 844: }
! 845: EOS
! 846: | CFG_AUTH_SOURCE CFG_PAM
! 847: {
! 848: #ifdef ENABLE_HYBRID
! 849: #ifdef HAVE_LIBPAM
! 850: isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_PAM;
! 851: #else /* HAVE_LIBPAM */
! 852: yyerror("racoon not configured with --with-libpam");
! 853: #endif /* HAVE_LIBPAM */
! 854: #else /* ENABLE_HYBRID */
! 855: yyerror("racoon not configured with --enable-hybrid");
! 856: #endif /* ENABLE_HYBRID */
! 857: }
! 858: EOS
! 859: | CFG_AUTH_SOURCE CFG_LDAP
! 860: {
! 861: #ifdef ENABLE_HYBRID
! 862: #ifdef HAVE_LIBLDAP
! 863: isakmp_cfg_config.authsource = ISAKMP_CFG_AUTH_LDAP;
! 864: #else /* HAVE_LIBLDAP */
! 865: yyerror("racoon not configured with --with-libldap");
! 866: #endif /* HAVE_LIBLDAP */
! 867: #else /* ENABLE_HYBRID */
! 868: yyerror("racoon not configured with --enable-hybrid");
! 869: #endif /* ENABLE_HYBRID */
! 870: }
! 871: EOS
! 872: | CFG_AUTH_GROUPS authgrouplist
! 873: {
! 874: #ifndef ENABLE_HYBRID
! 875: yyerror("racoon not configured with --enable-hybrid");
! 876: #endif
! 877: }
! 878: EOS
! 879: | CFG_GROUP_SOURCE CFG_SYSTEM
! 880: {
! 881: #ifdef ENABLE_HYBRID
! 882: isakmp_cfg_config.groupsource = ISAKMP_CFG_GROUP_SYSTEM;
! 883: #else
! 884: yyerror("racoon not configured with --enable-hybrid");
! 885: #endif
! 886: }
! 887: EOS
! 888: | CFG_GROUP_SOURCE CFG_LDAP
! 889: {
! 890: #ifdef ENABLE_HYBRID
! 891: #ifdef HAVE_LIBLDAP
! 892: isakmp_cfg_config.groupsource = ISAKMP_CFG_GROUP_LDAP;
! 893: #else /* HAVE_LIBLDAP */
! 894: yyerror("racoon not configured with --with-libldap");
! 895: #endif /* HAVE_LIBLDAP */
! 896: #else /* ENABLE_HYBRID */
! 897: yyerror("racoon not configured with --enable-hybrid");
! 898: #endif /* ENABLE_HYBRID */
! 899: }
! 900: EOS
! 901: | CFG_ACCOUNTING CFG_NONE
! 902: {
! 903: #ifdef ENABLE_HYBRID
! 904: isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_NONE;
! 905: #else
! 906: yyerror("racoon not configured with --enable-hybrid");
! 907: #endif
! 908: }
! 909: EOS
! 910: | CFG_ACCOUNTING CFG_SYSTEM
! 911: {
! 912: #ifdef ENABLE_HYBRID
! 913: isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_SYSTEM;
! 914: #else
! 915: yyerror("racoon not configured with --enable-hybrid");
! 916: #endif
! 917: }
! 918: EOS
! 919: | CFG_ACCOUNTING CFG_RADIUS
! 920: {
! 921: #ifdef ENABLE_HYBRID
! 922: #ifdef HAVE_LIBRADIUS
! 923: isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_RADIUS;
! 924: #else /* HAVE_LIBRADIUS */
! 925: yyerror("racoon not configured with --with-libradius");
! 926: #endif /* HAVE_LIBRADIUS */
! 927: #else /* ENABLE_HYBRID */
! 928: yyerror("racoon not configured with --enable-hybrid");
! 929: #endif /* ENABLE_HYBRID */
! 930: }
! 931: EOS
! 932: | CFG_ACCOUNTING CFG_PAM
! 933: {
! 934: #ifdef ENABLE_HYBRID
! 935: #ifdef HAVE_LIBPAM
! 936: isakmp_cfg_config.accounting = ISAKMP_CFG_ACCT_PAM;
! 937: #else /* HAVE_LIBPAM */
! 938: yyerror("racoon not configured with --with-libpam");
! 939: #endif /* HAVE_LIBPAM */
! 940: #else /* ENABLE_HYBRID */
! 941: yyerror("racoon not configured with --enable-hybrid");
! 942: #endif /* ENABLE_HYBRID */
! 943: }
! 944: EOS
! 945: | CFG_POOL_SIZE NUMBER
! 946: {
! 947: #ifdef ENABLE_HYBRID
! 948: if (isakmp_cfg_resize_pool($2) != 0)
! 949: yyerror("cannot allocate memory for pool");
! 950: #else /* ENABLE_HYBRID */
! 951: yyerror("racoon not configured with --enable-hybrid");
! 952: #endif /* ENABLE_HYBRID */
! 953: }
! 954: EOS
! 955: | CFG_PFS_GROUP NUMBER
! 956: {
! 957: #ifdef ENABLE_HYBRID
! 958: isakmp_cfg_config.pfs_group = $2;
! 959: #else /* ENABLE_HYBRID */
! 960: yyerror("racoon not configured with --enable-hybrid");
! 961: #endif /* ENABLE_HYBRID */
! 962: }
! 963: EOS
! 964: | CFG_SAVE_PASSWD SWITCH
! 965: {
! 966: #ifdef ENABLE_HYBRID
! 967: isakmp_cfg_config.save_passwd = $2;
! 968: #else /* ENABLE_HYBRID */
! 969: yyerror("racoon not configured with --enable-hybrid");
! 970: #endif /* ENABLE_HYBRID */
! 971: }
! 972: EOS
! 973: | CFG_AUTH_THROTTLE NUMBER
! 974: {
! 975: #ifdef ENABLE_HYBRID
! 976: isakmp_cfg_config.auth_throttle = $2;
! 977: #else /* ENABLE_HYBRID */
! 978: yyerror("racoon not configured with --enable-hybrid");
! 979: #endif /* ENABLE_HYBRID */
! 980: }
! 981: EOS
! 982: | CFG_CONF_SOURCE CFG_LOCAL
! 983: {
! 984: #ifdef ENABLE_HYBRID
! 985: isakmp_cfg_config.confsource = ISAKMP_CFG_CONF_LOCAL;
! 986: #else /* ENABLE_HYBRID */
! 987: yyerror("racoon not configured with --enable-hybrid");
! 988: #endif /* ENABLE_HYBRID */
! 989: }
! 990: EOS
! 991: | CFG_CONF_SOURCE CFG_RADIUS
! 992: {
! 993: #ifdef ENABLE_HYBRID
! 994: #ifdef HAVE_LIBRADIUS
! 995: isakmp_cfg_config.confsource = ISAKMP_CFG_CONF_RADIUS;
! 996: #else /* HAVE_LIBRADIUS */
! 997: yyerror("racoon not configured with --with-libradius");
! 998: #endif /* HAVE_LIBRADIUS */
! 999: #else /* ENABLE_HYBRID */
! 1000: yyerror("racoon not configured with --enable-hybrid");
! 1001: #endif /* ENABLE_HYBRID */
! 1002: }
! 1003: EOS
! 1004: | CFG_CONF_SOURCE CFG_LDAP
! 1005: {
! 1006: #ifdef ENABLE_HYBRID
! 1007: #ifdef HAVE_LIBLDAP
! 1008: isakmp_cfg_config.confsource = ISAKMP_CFG_CONF_LDAP;
! 1009: #else /* HAVE_LIBLDAP */
! 1010: yyerror("racoon not configured with --with-libldap");
! 1011: #endif /* HAVE_LIBLDAP */
! 1012: #else /* ENABLE_HYBRID */
! 1013: yyerror("racoon not configured with --enable-hybrid");
! 1014: #endif /* ENABLE_HYBRID */
! 1015: }
! 1016: EOS
! 1017: | CFG_MOTD QUOTEDSTRING
! 1018: {
! 1019: #ifdef ENABLE_HYBRID
! 1020: strncpy(&isakmp_cfg_config.motd[0], $2->v, MAXPATHLEN);
! 1021: isakmp_cfg_config.motd[MAXPATHLEN] = '\0';
! 1022: vfree($2);
! 1023: #else
! 1024: yyerror("racoon not configured with --enable-hybrid");
! 1025: #endif
! 1026: }
! 1027: EOS
! 1028: ;
! 1029:
! 1030: addrdnslist
! 1031: : addrdns
! 1032: | addrdns COMMA addrdnslist
! 1033: ;
! 1034: addrdns
! 1035: : ADDRSTRING
! 1036: {
! 1037: #ifdef ENABLE_HYBRID
! 1038: struct isakmp_cfg_config *icc = &isakmp_cfg_config;
! 1039:
! 1040: if (icc->dns4_index > MAXNS)
! 1041: yyerror("No more than %d DNS", MAXNS);
! 1042: if (inet_pton(AF_INET, $1->v,
! 1043: &icc->dns4[icc->dns4_index++]) != 1)
! 1044: yyerror("bad IPv4 DNS address.");
! 1045: #else
! 1046: yyerror("racoon not configured with --enable-hybrid");
! 1047: #endif
! 1048: }
! 1049: ;
! 1050:
! 1051: addrwinslist
! 1052: : addrwins
! 1053: | addrwins COMMA addrwinslist
! 1054: ;
! 1055: addrwins
! 1056: : ADDRSTRING
! 1057: {
! 1058: #ifdef ENABLE_HYBRID
! 1059: struct isakmp_cfg_config *icc = &isakmp_cfg_config;
! 1060:
! 1061: if (icc->nbns4_index > MAXWINS)
! 1062: yyerror("No more than %d WINS", MAXWINS);
! 1063: if (inet_pton(AF_INET, $1->v,
! 1064: &icc->nbns4[icc->nbns4_index++]) != 1)
! 1065: yyerror("bad IPv4 WINS address.");
! 1066: #else
! 1067: yyerror("racoon not configured with --enable-hybrid");
! 1068: #endif
! 1069: }
! 1070: ;
! 1071:
! 1072: splitnetlist
! 1073: : splitnet
! 1074: | splitnetlist COMMA splitnet
! 1075: ;
! 1076: splitnet
! 1077: : ADDRSTRING PREFIX
! 1078: {
! 1079: #ifdef ENABLE_HYBRID
! 1080: struct isakmp_cfg_config *icc = &isakmp_cfg_config;
! 1081: struct unity_network network;
! 1082: memset(&network,0,sizeof(network));
! 1083:
! 1084: if (inet_pton(AF_INET, $1->v, &network.addr4) != 1)
! 1085: yyerror("bad IPv4 SPLIT address.");
! 1086:
! 1087: /* Turn $2 (the prefix) into a subnet mask */
! 1088: network.mask4.s_addr = ($2) ? htonl(~((1 << (32 - $2)) - 1)) : 0;
! 1089:
! 1090: /* add the network to our list */
! 1091: if (splitnet_list_add(&icc->splitnet_list, &network,&icc->splitnet_count))
! 1092: yyerror("Unable to allocate split network");
! 1093: #else
! 1094: yyerror("racoon not configured with --enable-hybrid");
! 1095: #endif
! 1096: }
! 1097: ;
! 1098:
! 1099: authgrouplist
! 1100: : authgroup
! 1101: | authgroup COMMA authgrouplist
! 1102: ;
! 1103: authgroup
! 1104: : QUOTEDSTRING
! 1105: {
! 1106: #ifdef ENABLE_HYBRID
! 1107: char * groupname = NULL;
! 1108: char ** grouplist = NULL;
! 1109: struct isakmp_cfg_config *icc = &isakmp_cfg_config;
! 1110:
! 1111: grouplist = racoon_realloc(icc->grouplist,
! 1112: sizeof(char**)*(icc->groupcount+1));
! 1113: if (grouplist == NULL) {
! 1114: yyerror("unable to allocate auth group list");
! 1115: return -1;
! 1116: }
! 1117:
! 1118: groupname = racoon_malloc($1->l+1);
! 1119: if (groupname == NULL) {
! 1120: yyerror("unable to allocate auth group name");
! 1121: return -1;
! 1122: }
! 1123:
! 1124: memcpy(groupname,$1->v,$1->l);
! 1125: groupname[$1->l]=0;
! 1126: grouplist[icc->groupcount]=groupname;
! 1127: icc->grouplist = grouplist;
! 1128: icc->groupcount++;
! 1129:
! 1130: vfree($1);
! 1131: #else
! 1132: yyerror("racoon not configured with --enable-hybrid");
! 1133: #endif
! 1134: }
! 1135: ;
! 1136:
! 1137: splitdnslist
! 1138: : splitdns
! 1139: | splitdns COMMA splitdnslist
! 1140: ;
! 1141: splitdns
! 1142: : QUOTEDSTRING
! 1143: {
! 1144: #ifdef ENABLE_HYBRID
! 1145: struct isakmp_cfg_config *icc = &isakmp_cfg_config;
! 1146:
! 1147: if (!icc->splitdns_len)
! 1148: {
! 1149: icc->splitdns_list = racoon_malloc($1->l);
! 1150: if(icc->splitdns_list == NULL) {
! 1151: yyerror("error allocating splitdns list buffer");
! 1152: return -1;
! 1153: }
! 1154: memcpy(icc->splitdns_list,$1->v,$1->l);
! 1155: icc->splitdns_len = $1->l;
! 1156: }
! 1157: else
! 1158: {
! 1159: int len = icc->splitdns_len + $1->l + 1;
! 1160: icc->splitdns_list = racoon_realloc(icc->splitdns_list,len);
! 1161: if(icc->splitdns_list == NULL) {
! 1162: yyerror("error allocating splitdns list buffer");
! 1163: return -1;
! 1164: }
! 1165: icc->splitdns_list[icc->splitdns_len] = ',';
! 1166: memcpy(icc->splitdns_list + icc->splitdns_len + 1, $1->v, $1->l);
! 1167: icc->splitdns_len = len;
! 1168: }
! 1169: vfree($1);
! 1170: #else
! 1171: yyerror("racoon not configured with --enable-hybrid");
! 1172: #endif
! 1173: }
! 1174: ;
! 1175:
! 1176:
! 1177: /* timer */
! 1178: timer_statement
! 1179: : RETRY BOC timer_stmts EOC
! 1180: ;
! 1181: timer_stmts
! 1182: : /* nothing */
! 1183: | timer_stmts timer_stmt
! 1184: ;
! 1185: timer_stmt
! 1186: : RETRY_COUNTER NUMBER
! 1187: {
! 1188: lcconf->retry_counter = $2;
! 1189: }
! 1190: EOS
! 1191: | RETRY_INTERVAL NUMBER unittype_time
! 1192: {
! 1193: lcconf->retry_interval = $2 * $3;
! 1194: }
! 1195: EOS
! 1196: | RETRY_PERSEND NUMBER
! 1197: {
! 1198: lcconf->count_persend = $2;
! 1199: }
! 1200: EOS
! 1201: | RETRY_PHASE1 NUMBER unittype_time
! 1202: {
! 1203: lcconf->retry_checkph1 = $2 * $3;
! 1204: }
! 1205: EOS
! 1206: | RETRY_PHASE2 NUMBER unittype_time
! 1207: {
! 1208: lcconf->wait_ph2complete = $2 * $3;
! 1209: }
! 1210: EOS
! 1211: | NATT_KA NUMBER unittype_time
! 1212: {
! 1213: #ifdef ENABLE_NATT
! 1214: if (libipsec_opt & LIBIPSEC_OPT_NATT)
! 1215: lcconf->natt_ka_interval = $2 * $3;
! 1216: else
! 1217: yyerror("libipsec lacks NAT-T support");
! 1218: #else
! 1219: yyerror("NAT-T support not compiled in.");
! 1220: #endif
! 1221: }
! 1222: EOS
! 1223: ;
! 1224:
! 1225: /* sainfo */
! 1226: sainfo_statement
! 1227: : SAINFO
! 1228: {
! 1229: cur_sainfo = newsainfo();
! 1230: if (cur_sainfo == NULL) {
! 1231: yyerror("failed to allocate sainfo");
! 1232: return -1;
! 1233: }
! 1234: }
! 1235: sainfo_name sainfo_param BOC sainfo_specs
! 1236: {
! 1237: struct sainfo *check;
! 1238:
! 1239: /* default */
! 1240: if (cur_sainfo->algs[algclass_ipsec_enc] == 0) {
! 1241: yyerror("no encryption algorithm at %s",
! 1242: sainfo2str(cur_sainfo));
! 1243: return -1;
! 1244: }
! 1245: if (cur_sainfo->algs[algclass_ipsec_auth] == 0) {
! 1246: yyerror("no authentication algorithm at %s",
! 1247: sainfo2str(cur_sainfo));
! 1248: return -1;
! 1249: }
! 1250: if (cur_sainfo->algs[algclass_ipsec_comp] == 0) {
! 1251: yyerror("no compression algorithm at %s",
! 1252: sainfo2str(cur_sainfo));
! 1253: return -1;
! 1254: }
! 1255:
! 1256: /* duplicate check */
! 1257: check = getsainfo(cur_sainfo->idsrc,
! 1258: cur_sainfo->iddst,
! 1259: cur_sainfo->id_i,
! 1260: NULL,
! 1261: cur_sainfo->remoteid);
! 1262:
! 1263: if (check && ((check->idsrc != SAINFO_ANONYMOUS) &&
! 1264: (cur_sainfo->idsrc != SAINFO_ANONYMOUS))) {
! 1265: yyerror("duplicated sainfo: %s",
! 1266: sainfo2str(cur_sainfo));
! 1267: return -1;
! 1268: }
! 1269:
! 1270: inssainfo(cur_sainfo);
! 1271: }
! 1272: EOC
! 1273: ;
! 1274: sainfo_name
! 1275: : ANONYMOUS
! 1276: {
! 1277: cur_sainfo->idsrc = SAINFO_ANONYMOUS;
! 1278: cur_sainfo->iddst = SAINFO_ANONYMOUS;
! 1279: }
! 1280: | ANONYMOUS CLIENTADDR
! 1281: {
! 1282: cur_sainfo->idsrc = SAINFO_ANONYMOUS;
! 1283: cur_sainfo->iddst = SAINFO_CLIENTADDR;
! 1284: }
! 1285: | ANONYMOUS sainfo_id
! 1286: {
! 1287: cur_sainfo->idsrc = SAINFO_ANONYMOUS;
! 1288: cur_sainfo->iddst = $2;
! 1289: }
! 1290: | sainfo_id ANONYMOUS
! 1291: {
! 1292: cur_sainfo->idsrc = $1;
! 1293: cur_sainfo->iddst = SAINFO_ANONYMOUS;
! 1294: }
! 1295: | sainfo_id CLIENTADDR
! 1296: {
! 1297: cur_sainfo->idsrc = $1;
! 1298: cur_sainfo->iddst = SAINFO_CLIENTADDR;
! 1299: }
! 1300: | sainfo_id sainfo_id
! 1301: {
! 1302: cur_sainfo->idsrc = $1;
! 1303: cur_sainfo->iddst = $2;
! 1304: }
! 1305: ;
! 1306: sainfo_id
! 1307: : IDENTIFIERTYPE ADDRSTRING prefix port ul_proto
! 1308: {
! 1309: char portbuf[10];
! 1310: struct sockaddr *saddr;
! 1311:
! 1312: if (($5 == IPPROTO_ICMP || $5 == IPPROTO_ICMPV6)
! 1313: && ($4 != IPSEC_PORT_ANY || $4 != IPSEC_PORT_ANY)) {
! 1314: yyerror("port number must be \"any\".");
! 1315: return -1;
! 1316: }
! 1317:
! 1318: snprintf(portbuf, sizeof(portbuf), "%lu", $4);
! 1319: saddr = str2saddr($2->v, portbuf);
! 1320: vfree($2);
! 1321: if (saddr == NULL)
! 1322: return -1;
! 1323:
! 1324: switch (saddr->sa_family) {
! 1325: case AF_INET:
! 1326: if ($5 == IPPROTO_ICMPV6) {
! 1327: yyerror("upper layer protocol mismatched.\n");
! 1328: racoon_free(saddr);
! 1329: return -1;
! 1330: }
! 1331: $$ = ipsecdoi_sockaddr2id(saddr,
! 1332: $3 == ~0 ? (sizeof(struct in_addr) << 3): $3,
! 1333: $5);
! 1334: break;
! 1335: #ifdef INET6
! 1336: case AF_INET6:
! 1337: if ($5 == IPPROTO_ICMP) {
! 1338: yyerror("upper layer protocol mismatched.\n");
! 1339: racoon_free(saddr);
! 1340: return -1;
! 1341: }
! 1342: $$ = ipsecdoi_sockaddr2id(saddr,
! 1343: $3 == ~0 ? (sizeof(struct in6_addr) << 3): $3,
! 1344: $5);
! 1345: break;
! 1346: #endif
! 1347: default:
! 1348: yyerror("invalid family: %d", saddr->sa_family);
! 1349: $$ = NULL;
! 1350: break;
! 1351: }
! 1352: racoon_free(saddr);
! 1353: if ($$ == NULL)
! 1354: return -1;
! 1355: }
! 1356: | IDENTIFIERTYPE ADDRSTRING ADDRRANGE prefix port ul_proto
! 1357: {
! 1358: char portbuf[10];
! 1359: struct sockaddr *laddr = NULL, *haddr = NULL;
! 1360: char *cur = NULL;
! 1361:
! 1362: if (($6 == IPPROTO_ICMP || $6 == IPPROTO_ICMPV6)
! 1363: && ($5 != IPSEC_PORT_ANY || $5 != IPSEC_PORT_ANY)) {
! 1364: yyerror("port number must be \"any\".");
! 1365: return -1;
! 1366: }
! 1367:
! 1368: snprintf(portbuf, sizeof(portbuf), "%lu", $5);
! 1369:
! 1370: laddr = str2saddr($2->v, portbuf);
! 1371: if (laddr == NULL) {
! 1372: return -1;
! 1373: }
! 1374: vfree($2);
! 1375: haddr = str2saddr($3->v, portbuf);
! 1376: if (haddr == NULL) {
! 1377: racoon_free(laddr);
! 1378: return -1;
! 1379: }
! 1380: vfree($3);
! 1381:
! 1382: switch (laddr->sa_family) {
! 1383: case AF_INET:
! 1384: if ($6 == IPPROTO_ICMPV6) {
! 1385: yyerror("upper layer protocol mismatched.\n");
! 1386: if (laddr)
! 1387: racoon_free(laddr);
! 1388: if (haddr)
! 1389: racoon_free(haddr);
! 1390: return -1;
! 1391: }
! 1392: $$ = ipsecdoi_sockrange2id(laddr, haddr,
! 1393: $6);
! 1394: break;
! 1395: #ifdef INET6
! 1396: case AF_INET6:
! 1397: if ($6 == IPPROTO_ICMP) {
! 1398: yyerror("upper layer protocol mismatched.\n");
! 1399: if (laddr)
! 1400: racoon_free(laddr);
! 1401: if (haddr)
! 1402: racoon_free(haddr);
! 1403: return -1;
! 1404: }
! 1405: $$ = ipsecdoi_sockrange2id(laddr, haddr,
! 1406: $6);
! 1407: break;
! 1408: #endif
! 1409: default:
! 1410: yyerror("invalid family: %d", laddr->sa_family);
! 1411: $$ = NULL;
! 1412: break;
! 1413: }
! 1414: if (laddr)
! 1415: racoon_free(laddr);
! 1416: if (haddr)
! 1417: racoon_free(haddr);
! 1418: if ($$ == NULL)
! 1419: return -1;
! 1420: }
! 1421: | IDENTIFIERTYPE QUOTEDSTRING
! 1422: {
! 1423: struct ipsecdoi_id_b *id_b;
! 1424:
! 1425: if ($1 == IDTYPE_ASN1DN) {
! 1426: yyerror("id type forbidden: %d", $1);
! 1427: $$ = NULL;
! 1428: return -1;
! 1429: }
! 1430:
! 1431: $2->l--;
! 1432:
! 1433: $$ = vmalloc(sizeof(*id_b) + $2->l);
! 1434: if ($$ == NULL) {
! 1435: yyerror("failed to allocate identifier");
! 1436: return -1;
! 1437: }
! 1438:
! 1439: id_b = (struct ipsecdoi_id_b *)$$->v;
! 1440: id_b->type = idtype2doi($1);
! 1441:
! 1442: id_b->proto_id = 0;
! 1443: id_b->port = 0;
! 1444:
! 1445: memcpy($$->v + sizeof(*id_b), $2->v, $2->l);
! 1446: }
! 1447: ;
! 1448: sainfo_param
! 1449: : /* nothing */
! 1450: {
! 1451: cur_sainfo->id_i = NULL;
! 1452: }
! 1453: | FROM IDENTIFIERTYPE identifierstring
! 1454: {
! 1455: struct ipsecdoi_id_b *id_b;
! 1456: vchar_t *idv;
! 1457:
! 1458: if (set_identifier(&idv, $2, $3) != 0) {
! 1459: yyerror("failed to set identifer.\n");
! 1460: return -1;
! 1461: }
! 1462: cur_sainfo->id_i = vmalloc(sizeof(*id_b) + idv->l);
! 1463: if (cur_sainfo->id_i == NULL) {
! 1464: yyerror("failed to allocate identifier");
! 1465: return -1;
! 1466: }
! 1467:
! 1468: id_b = (struct ipsecdoi_id_b *)cur_sainfo->id_i->v;
! 1469: id_b->type = idtype2doi($2);
! 1470:
! 1471: id_b->proto_id = 0;
! 1472: id_b->port = 0;
! 1473:
! 1474: memcpy(cur_sainfo->id_i->v + sizeof(*id_b),
! 1475: idv->v, idv->l);
! 1476: vfree(idv);
! 1477: }
! 1478: | GROUP QUOTEDSTRING
! 1479: {
! 1480: #ifdef ENABLE_HYBRID
! 1481: if ((cur_sainfo->group = vdup($2)) == NULL) {
! 1482: yyerror("failed to set sainfo xauth group.\n");
! 1483: return -1;
! 1484: }
! 1485: #else
! 1486: yyerror("racoon not configured with --enable-hybrid");
! 1487: return -1;
! 1488: #endif
! 1489: }
! 1490: ;
! 1491: sainfo_specs
! 1492: : /* nothing */
! 1493: | sainfo_specs sainfo_spec
! 1494: ;
! 1495: sainfo_spec
! 1496: : PFS_GROUP dh_group_num
! 1497: {
! 1498: cur_sainfo->pfs_group = $2;
! 1499: }
! 1500: EOS
! 1501: | REMOTEID NUMBER
! 1502: {
! 1503: cur_sainfo->remoteid = $2;
! 1504: }
! 1505: EOS
! 1506: | LIFETIME LIFETYPE_TIME NUMBER unittype_time
! 1507: {
! 1508: cur_sainfo->lifetime = $3 * $4;
! 1509: }
! 1510: EOS
! 1511: | LIFETIME LIFETYPE_BYTE NUMBER unittype_byte
! 1512: {
! 1513: #if 1
! 1514: yyerror("byte lifetime support is deprecated");
! 1515: return -1;
! 1516: #else
! 1517: cur_sainfo->lifebyte = fix_lifebyte($3 * $4);
! 1518: if (cur_sainfo->lifebyte == 0)
! 1519: return -1;
! 1520: #endif
! 1521: }
! 1522: EOS
! 1523: | ALGORITHM_CLASS {
! 1524: cur_algclass = $1;
! 1525: }
! 1526: algorithms EOS
! 1527: ;
! 1528:
! 1529: algorithms
! 1530: : algorithm
! 1531: {
! 1532: inssainfoalg(&cur_sainfo->algs[cur_algclass], $1);
! 1533: }
! 1534: | algorithm
! 1535: {
! 1536: inssainfoalg(&cur_sainfo->algs[cur_algclass], $1);
! 1537: }
! 1538: COMMA algorithms
! 1539: ;
! 1540: algorithm
! 1541: : ALGORITHMTYPE keylength
! 1542: {
! 1543: int defklen;
! 1544:
! 1545: $$ = newsainfoalg();
! 1546: if ($$ == NULL) {
! 1547: yyerror("failed to get algorithm allocation");
! 1548: return -1;
! 1549: }
! 1550:
! 1551: $$->alg = algtype2doi(cur_algclass, $1);
! 1552: if ($$->alg == -1) {
! 1553: yyerror("algorithm mismatched");
! 1554: racoon_free($$);
! 1555: $$ = NULL;
! 1556: return -1;
! 1557: }
! 1558:
! 1559: defklen = default_keylen(cur_algclass, $1);
! 1560: if (defklen == 0) {
! 1561: if ($2) {
! 1562: yyerror("keylen not allowed");
! 1563: racoon_free($$);
! 1564: $$ = NULL;
! 1565: return -1;
! 1566: }
! 1567: } else {
! 1568: if ($2 && check_keylen(cur_algclass, $1, $2) < 0) {
! 1569: yyerror("invalid keylen %d", $2);
! 1570: racoon_free($$);
! 1571: $$ = NULL;
! 1572: return -1;
! 1573: }
! 1574: }
! 1575:
! 1576: if ($2)
! 1577: $$->encklen = $2;
! 1578: else
! 1579: $$->encklen = defklen;
! 1580:
! 1581: /* check if it's supported algorithm by kernel */
! 1582: if (!(cur_algclass == algclass_ipsec_auth && $1 == algtype_non_auth)
! 1583: && pk_checkalg(cur_algclass, $1, $$->encklen)) {
! 1584: int a = algclass2doi(cur_algclass);
! 1585: int b = algtype2doi(cur_algclass, $1);
! 1586: if (a == IPSECDOI_ATTR_AUTH)
! 1587: a = IPSECDOI_PROTO_IPSEC_AH;
! 1588: yyerror("algorithm %s not supported by the kernel (missing module?)",
! 1589: s_ipsecdoi_trns(a, b));
! 1590: racoon_free($$);
! 1591: $$ = NULL;
! 1592: return -1;
! 1593: }
! 1594: }
! 1595: ;
! 1596: prefix
! 1597: : /* nothing */ { $$ = ~0; }
! 1598: | PREFIX { $$ = $1; }
! 1599: ;
! 1600: port
! 1601: : /* nothing */ { $$ = IPSEC_PORT_ANY; }
! 1602: | PORT { $$ = $1; }
! 1603: | PORTANY { $$ = IPSEC_PORT_ANY; }
! 1604: ;
! 1605: ul_proto
! 1606: : NUMBER { $$ = $1; }
! 1607: | UL_PROTO { $$ = $1; }
! 1608: | ANY { $$ = IPSEC_ULPROTO_ANY; }
! 1609: ;
! 1610: keylength
! 1611: : /* nothing */ { $$ = 0; }
! 1612: | NUMBER { $$ = $1; }
! 1613: ;
! 1614:
! 1615: /* remote */
! 1616: remote_statement
! 1617: : REMOTE QUOTEDSTRING INHERIT QUOTEDSTRING
! 1618: {
! 1619: struct remoteconf *from, *new;
! 1620:
! 1621: if (getrmconf_by_name($2->v) != NULL) {
! 1622: yyerror("named remoteconf \"%s\" already exists.");
! 1623: return -1;
! 1624: }
! 1625:
! 1626: from = getrmconf_by_name($4->v);
! 1627: if (from == NULL) {
! 1628: yyerror("named parent remoteconf \"%s\" does not exist.",
! 1629: $4->v);
! 1630: return -1;
! 1631: }
! 1632:
! 1633: new = duprmconf_shallow(from);
! 1634: if (new == NULL) {
! 1635: yyerror("failed to duplicate remoteconf from \"%s\".",
! 1636: $4->v);
! 1637: return -1;
! 1638: }
! 1639:
! 1640: new->name = racoon_strdup($2->v);
! 1641: cur_rmconf = new;
! 1642:
! 1643: vfree($2);
! 1644: vfree($4);
! 1645: }
! 1646: remote_specs_block
! 1647: | REMOTE QUOTEDSTRING
! 1648: {
! 1649: struct remoteconf *new;
! 1650:
! 1651: if (getrmconf_by_name($2->v) != NULL) {
! 1652: yyerror("Named remoteconf \"%s\" already exists.");
! 1653: return -1;
! 1654: }
! 1655:
! 1656: new = newrmconf();
! 1657: if (new == NULL) {
! 1658: yyerror("failed to get new remoteconf.");
! 1659: return -1;
! 1660: }
! 1661: new->name = racoon_strdup($2->v);
! 1662: cur_rmconf = new;
! 1663:
! 1664: vfree($2);
! 1665: }
! 1666: remote_specs_block
! 1667: | REMOTE remote_index INHERIT remote_index
! 1668: {
! 1669: struct remoteconf *from, *new;
! 1670:
! 1671: from = getrmconf($4, GETRMCONF_F_NO_ANONYMOUS);
! 1672: if (from == NULL) {
! 1673: yyerror("failed to get remoteconf for %s.",
! 1674: saddr2str($4));
! 1675: return -1;
! 1676: }
! 1677:
! 1678: new = duprmconf_shallow(from);
! 1679: if (new == NULL) {
! 1680: yyerror("failed to duplicate remoteconf from %s.",
! 1681: saddr2str($4));
! 1682: return -1;
! 1683: }
! 1684:
! 1685: racoon_free($4);
! 1686: new->remote = $2;
! 1687: cur_rmconf = new;
! 1688: }
! 1689: remote_specs_block
! 1690: | REMOTE remote_index
! 1691: {
! 1692: struct remoteconf *new;
! 1693:
! 1694: new = newrmconf();
! 1695: if (new == NULL) {
! 1696: yyerror("failed to get new remoteconf.");
! 1697: return -1;
! 1698: }
! 1699:
! 1700: new->remote = $2;
! 1701: cur_rmconf = new;
! 1702: }
! 1703: remote_specs_block
! 1704: ;
! 1705:
! 1706: remote_specs_block
! 1707: : BOC remote_specs EOC
! 1708: {
! 1709: /* check a exchange mode */
! 1710: if (cur_rmconf->etypes == NULL) {
! 1711: yyerror("no exchange mode specified.\n");
! 1712: return -1;
! 1713: }
! 1714:
! 1715: if (cur_rmconf->idvtype == IDTYPE_UNDEFINED)
! 1716: cur_rmconf->idvtype = IDTYPE_ADDRESS;
! 1717:
! 1718: if (cur_rmconf->idvtype == IDTYPE_ASN1DN) {
! 1719: if (cur_rmconf->mycertfile) {
! 1720: if (cur_rmconf->idv)
! 1721: yywarn("Both CERT and ASN1 ID "
! 1722: "are set. Hope this is OK.\n");
! 1723: /* TODO: Preparse the DN here */
! 1724: } else if (cur_rmconf->idv) {
! 1725: /* OK, using asn1dn without X.509. */
! 1726: } else {
! 1727: yyerror("ASN1 ID not specified "
! 1728: "and no CERT defined!\n");
! 1729: return -1;
! 1730: }
! 1731: }
! 1732:
! 1733: if (duprmconf_finish(cur_rmconf))
! 1734: return -1;
! 1735:
! 1736: #if 0
! 1737: /* this pointer copy will never happen, because duprmconf_shallow
! 1738: * already copied all pointers.
! 1739: */
! 1740: if (cur_rmconf->spspec == NULL &&
! 1741: cur_rmconf->inherited_from != NULL) {
! 1742: cur_rmconf->spspec = cur_rmconf->inherited_from->spspec;
! 1743: }
! 1744: #endif
! 1745: if (set_isakmp_proposal(cur_rmconf) != 0)
! 1746: return -1;
! 1747:
! 1748: /* DH group settting if aggressive mode is there. */
! 1749: if (check_etypeok(cur_rmconf, (void*) ISAKMP_ETYPE_AGG)) {
! 1750: struct isakmpsa *p;
! 1751: int b = 0;
! 1752:
! 1753: /* DH group */
! 1754: for (p = cur_rmconf->proposal; p; p = p->next) {
! 1755: if (b == 0 || (b && b == p->dh_group)) {
! 1756: b = p->dh_group;
! 1757: continue;
! 1758: }
! 1759: yyerror("DH group must be equal "
! 1760: "in all proposals "
! 1761: "when aggressive mode is "
! 1762: "used.\n");
! 1763: return -1;
! 1764: }
! 1765: cur_rmconf->dh_group = b;
! 1766:
! 1767: if (cur_rmconf->dh_group == 0) {
! 1768: yyerror("DH group must be set in the proposal.\n");
! 1769: return -1;
! 1770: }
! 1771:
! 1772: /* DH group settting if PFS is required. */
! 1773: if (oakley_setdhgroup(cur_rmconf->dh_group,
! 1774: &cur_rmconf->dhgrp) < 0) {
! 1775: yyerror("failed to set DH value.\n");
! 1776: return -1;
! 1777: }
! 1778: }
! 1779:
! 1780: insrmconf(cur_rmconf);
! 1781: }
! 1782: ;
! 1783: remote_index
! 1784: : ANONYMOUS ike_port
! 1785: {
! 1786: $$ = newsaddr(sizeof(struct sockaddr));
! 1787: $$->sa_family = AF_UNSPEC;
! 1788: ((struct sockaddr_in *)$$)->sin_port = htons($2);
! 1789: }
! 1790: | ike_addrinfo_port
! 1791: {
! 1792: $$ = $1;
! 1793: if ($$ == NULL) {
! 1794: yyerror("failed to allocate sockaddr");
! 1795: return -1;
! 1796: }
! 1797: }
! 1798: ;
! 1799: remote_specs
! 1800: : /* nothing */
! 1801: | remote_specs remote_spec
! 1802: ;
! 1803: remote_spec
! 1804: : REMOTE_ADDRESS ike_addrinfo_port
! 1805: {
! 1806: if (cur_rmconf->remote != NULL) {
! 1807: yyerror("remote_address already specified");
! 1808: return -1;
! 1809: }
! 1810: cur_rmconf->remote = $2;
! 1811: }
! 1812: EOS
! 1813: | EXCHANGE_MODE
! 1814: {
! 1815: cur_rmconf->etypes = NULL;
! 1816: }
! 1817: exchange_types EOS
! 1818: | DOI DOITYPE { cur_rmconf->doitype = $2; } EOS
! 1819: | SITUATION SITUATIONTYPE { cur_rmconf->sittype = $2; } EOS
! 1820: | CERTIFICATE_TYPE cert_spec
! 1821: | PEERS_CERTFILE QUOTEDSTRING
! 1822: {
! 1823: yywarn("This directive without certtype will be removed!\n");
! 1824: yywarn("Please use 'peers_certfile x509 \"%s\";' instead\n", $2->v);
! 1825:
! 1826: if (cur_rmconf->peerscert != NULL) {
! 1827: yyerror("peers_certfile already defined\n");
! 1828: return -1;
! 1829: }
! 1830:
! 1831: if (load_x509($2->v, &cur_rmconf->peerscertfile,
! 1832: &cur_rmconf->peerscert)) {
! 1833: yyerror("failed to load certificate \"%s\"\n",
! 1834: $2->v);
! 1835: return -1;
! 1836: }
! 1837:
! 1838: vfree($2);
! 1839: }
! 1840: EOS
! 1841: | PEERS_CERTFILE CERT_X509 QUOTEDSTRING
! 1842: {
! 1843: if (cur_rmconf->peerscert != NULL) {
! 1844: yyerror("peers_certfile already defined\n");
! 1845: return -1;
! 1846: }
! 1847:
! 1848: if (load_x509($3->v, &cur_rmconf->peerscertfile,
! 1849: &cur_rmconf->peerscert)) {
! 1850: yyerror("failed to load certificate \"%s\"\n",
! 1851: $3->v);
! 1852: return -1;
! 1853: }
! 1854:
! 1855: vfree($3);
! 1856: }
! 1857: EOS
! 1858: | PEERS_CERTFILE CERT_PLAINRSA QUOTEDSTRING
! 1859: {
! 1860: char path[MAXPATHLEN];
! 1861: int ret = 0;
! 1862:
! 1863: if (cur_rmconf->peerscert != NULL) {
! 1864: yyerror("peers_certfile already defined\n");
! 1865: return -1;
! 1866: }
! 1867:
! 1868: cur_rmconf->peerscert = vmalloc(1);
! 1869: if (cur_rmconf->peerscert == NULL) {
! 1870: yyerror("failed to allocate peerscert");
! 1871: return -1;
! 1872: }
! 1873: cur_rmconf->peerscert->v[0] = ISAKMP_CERT_PLAINRSA;
! 1874:
! 1875: getpathname(path, sizeof(path),
! 1876: LC_PATHTYPE_CERT, $3->v);
! 1877: if (rsa_parse_file(cur_rmconf->rsa_public, path,
! 1878: RSA_TYPE_PUBLIC)) {
! 1879: yyerror("Couldn't parse keyfile.\n", path);
! 1880: return -1;
! 1881: }
! 1882: plog(LLV_DEBUG, LOCATION, NULL,
! 1883: "Public PlainRSA keyfile parsed: %s\n", path);
! 1884:
! 1885: vfree($3);
! 1886: }
! 1887: EOS
! 1888: | PEERS_CERTFILE DNSSEC
! 1889: {
! 1890: if (cur_rmconf->peerscert != NULL) {
! 1891: yyerror("peers_certfile already defined\n");
! 1892: return -1;
! 1893: }
! 1894: cur_rmconf->peerscert = vmalloc(1);
! 1895: if (cur_rmconf->peerscert == NULL) {
! 1896: yyerror("failed to allocate peerscert");
! 1897: return -1;
! 1898: }
! 1899: cur_rmconf->peerscert->v[0] = ISAKMP_CERT_DNS;
! 1900: }
! 1901: EOS
! 1902: | CA_TYPE CERT_X509 QUOTEDSTRING
! 1903: {
! 1904: if (cur_rmconf->cacert != NULL) {
! 1905: yyerror("ca_type already defined\n");
! 1906: return -1;
! 1907: }
! 1908:
! 1909: if (load_x509($3->v, &cur_rmconf->cacertfile,
! 1910: &cur_rmconf->cacert)) {
! 1911: yyerror("failed to load certificate \"%s\"\n",
! 1912: $3->v);
! 1913: return -1;
! 1914: }
! 1915:
! 1916: vfree($3);
! 1917: }
! 1918: EOS
! 1919: | VERIFY_CERT SWITCH { cur_rmconf->verify_cert = $2; } EOS
! 1920: | SEND_CERT SWITCH { cur_rmconf->send_cert = $2; } EOS
! 1921: | SEND_CR SWITCH { cur_rmconf->send_cr = $2; } EOS
! 1922: | MATCH_EMPTY_CR SWITCH { cur_rmconf->match_empty_cr = $2; } EOS
! 1923: | MY_IDENTIFIER IDENTIFIERTYPE identifierstring
! 1924: {
! 1925: if (set_identifier(&cur_rmconf->idv, $2, $3) != 0) {
! 1926: yyerror("failed to set identifer.\n");
! 1927: return -1;
! 1928: }
! 1929: cur_rmconf->idvtype = $2;
! 1930: }
! 1931: EOS
! 1932: | MY_IDENTIFIER IDENTIFIERTYPE IDENTIFIERQUAL identifierstring
! 1933: {
! 1934: if (set_identifier_qual(&cur_rmconf->idv, $2, $4, $3) != 0) {
! 1935: yyerror("failed to set identifer.\n");
! 1936: return -1;
! 1937: }
! 1938: cur_rmconf->idvtype = $2;
! 1939: }
! 1940: EOS
! 1941: | XAUTH_LOGIN identifierstring
! 1942: {
! 1943: #ifdef ENABLE_HYBRID
! 1944: /* formerly identifier type login */
! 1945: if (xauth_rmconf_used(&cur_rmconf->xauth) == -1) {
! 1946: yyerror("failed to allocate xauth state\n");
! 1947: return -1;
! 1948: }
! 1949: if ((cur_rmconf->xauth->login = vdup($2)) == NULL) {
! 1950: yyerror("failed to set identifer.\n");
! 1951: return -1;
! 1952: }
! 1953: #else
! 1954: yyerror("racoon not configured with --enable-hybrid");
! 1955: #endif
! 1956: }
! 1957: EOS
! 1958: | PEERS_IDENTIFIER IDENTIFIERTYPE identifierstring
! 1959: {
! 1960: struct idspec *id;
! 1961: id = newidspec();
! 1962: if (id == NULL) {
! 1963: yyerror("failed to allocate idspec");
! 1964: return -1;
! 1965: }
! 1966: if (set_identifier(&id->id, $2, $3) != 0) {
! 1967: yyerror("failed to set identifer.\n");
! 1968: racoon_free(id);
! 1969: return -1;
! 1970: }
! 1971: id->idtype = $2;
! 1972: genlist_append (cur_rmconf->idvl_p, id);
! 1973: }
! 1974: EOS
! 1975: | PEERS_IDENTIFIER IDENTIFIERTYPE IDENTIFIERQUAL identifierstring
! 1976: {
! 1977: struct idspec *id;
! 1978: id = newidspec();
! 1979: if (id == NULL) {
! 1980: yyerror("failed to allocate idspec");
! 1981: return -1;
! 1982: }
! 1983: if (set_identifier_qual(&id->id, $2, $4, $3) != 0) {
! 1984: yyerror("failed to set identifer.\n");
! 1985: racoon_free(id);
! 1986: return -1;
! 1987: }
! 1988: id->idtype = $2;
! 1989: genlist_append (cur_rmconf->idvl_p, id);
! 1990: }
! 1991: EOS
! 1992: | VERIFY_IDENTIFIER SWITCH { cur_rmconf->verify_identifier = $2; } EOS
! 1993: | NONCE_SIZE NUMBER { cur_rmconf->nonce_size = $2; } EOS
! 1994: | DH_GROUP
! 1995: {
! 1996: yyerror("dh_group cannot be defined here.");
! 1997: return -1;
! 1998: }
! 1999: dh_group_num EOS
! 2000: | PASSIVE SWITCH { cur_rmconf->passive = $2; } EOS
! 2001: | IKE_FRAG SWITCH { cur_rmconf->ike_frag = $2; } EOS
! 2002: | IKE_FRAG REMOTE_FORCE_LEVEL { cur_rmconf->ike_frag = ISAKMP_FRAG_FORCE; } EOS
! 2003: | ESP_FRAG NUMBER {
! 2004: #ifdef SADB_X_EXT_NAT_T_FRAG
! 2005: if (libipsec_opt & LIBIPSEC_OPT_FRAG)
! 2006: cur_rmconf->esp_frag = $2;
! 2007: else
! 2008: yywarn("libipsec lacks IKE frag support");
! 2009: #else
! 2010: yywarn("Your kernel does not support esp_frag");
! 2011: #endif
! 2012: } EOS
! 2013: | SCRIPT QUOTEDSTRING PHASE1_UP {
! 2014: if (cur_rmconf->script[SCRIPT_PHASE1_UP] != NULL)
! 2015: vfree(cur_rmconf->script[SCRIPT_PHASE1_UP]);
! 2016:
! 2017: cur_rmconf->script[SCRIPT_PHASE1_UP] =
! 2018: script_path_add(vdup($2));
! 2019: } EOS
! 2020: | SCRIPT QUOTEDSTRING PHASE1_DOWN {
! 2021: if (cur_rmconf->script[SCRIPT_PHASE1_DOWN] != NULL)
! 2022: vfree(cur_rmconf->script[SCRIPT_PHASE1_DOWN]);
! 2023:
! 2024: cur_rmconf->script[SCRIPT_PHASE1_DOWN] =
! 2025: script_path_add(vdup($2));
! 2026: } EOS
! 2027: | SCRIPT QUOTEDSTRING PHASE1_DEAD {
! 2028: if (cur_rmconf->script[SCRIPT_PHASE1_DEAD] != NULL)
! 2029: vfree(cur_rmconf->script[SCRIPT_PHASE1_DEAD]);
! 2030:
! 2031: cur_rmconf->script[SCRIPT_PHASE1_DEAD] =
! 2032: script_path_add(vdup($2));
! 2033: } EOS
! 2034: | MODE_CFG SWITCH { cur_rmconf->mode_cfg = $2; } EOS
! 2035: | WEAK_PHASE1_CHECK SWITCH {
! 2036: cur_rmconf->weak_phase1_check = $2;
! 2037: } EOS
! 2038: | GENERATE_POLICY SWITCH { cur_rmconf->gen_policy = $2; } EOS
! 2039: | GENERATE_POLICY GENERATE_LEVEL { cur_rmconf->gen_policy = $2; } EOS
! 2040: | SUPPORT_PROXY SWITCH { cur_rmconf->support_proxy = $2; } EOS
! 2041: | INITIAL_CONTACT SWITCH { cur_rmconf->ini_contact = $2; } EOS
! 2042: | NAT_TRAVERSAL SWITCH
! 2043: {
! 2044: #ifdef ENABLE_NATT
! 2045: if (libipsec_opt & LIBIPSEC_OPT_NATT)
! 2046: cur_rmconf->nat_traversal = $2;
! 2047: else
! 2048: yyerror("libipsec lacks NAT-T support");
! 2049: #else
! 2050: yyerror("NAT-T support not compiled in.");
! 2051: #endif
! 2052: } EOS
! 2053: | NAT_TRAVERSAL REMOTE_FORCE_LEVEL
! 2054: {
! 2055: #ifdef ENABLE_NATT
! 2056: if (libipsec_opt & LIBIPSEC_OPT_NATT)
! 2057: cur_rmconf->nat_traversal = NATT_FORCE;
! 2058: else
! 2059: yyerror("libipsec lacks NAT-T support");
! 2060: #else
! 2061: yyerror("NAT-T support not compiled in.");
! 2062: #endif
! 2063: } EOS
! 2064: | DPD SWITCH
! 2065: {
! 2066: #ifdef ENABLE_DPD
! 2067: cur_rmconf->dpd = $2;
! 2068: #else
! 2069: yyerror("DPD support not compiled in.");
! 2070: #endif
! 2071: } EOS
! 2072: | DPD_DELAY NUMBER
! 2073: {
! 2074: #ifdef ENABLE_DPD
! 2075: cur_rmconf->dpd_interval = $2;
! 2076: #else
! 2077: yyerror("DPD support not compiled in.");
! 2078: #endif
! 2079: }
! 2080: EOS
! 2081: | DPD_RETRY NUMBER
! 2082: {
! 2083: #ifdef ENABLE_DPD
! 2084: cur_rmconf->dpd_retry = $2;
! 2085: #else
! 2086: yyerror("DPD support not compiled in.");
! 2087: #endif
! 2088: }
! 2089: EOS
! 2090: | DPD_MAXFAIL NUMBER
! 2091: {
! 2092: #ifdef ENABLE_DPD
! 2093: cur_rmconf->dpd_maxfails = $2;
! 2094: #else
! 2095: yyerror("DPD support not compiled in.");
! 2096: #endif
! 2097: }
! 2098: EOS
! 2099: | REKEY SWITCH { cur_rmconf->rekey = $2; } EOS
! 2100: | REKEY REMOTE_FORCE_LEVEL { cur_rmconf->rekey = REKEY_FORCE; } EOS
! 2101: | PH1ID NUMBER
! 2102: {
! 2103: cur_rmconf->ph1id = $2;
! 2104: }
! 2105: EOS
! 2106: | LIFETIME LIFETYPE_TIME NUMBER unittype_time
! 2107: {
! 2108: cur_rmconf->lifetime = $3 * $4;
! 2109: }
! 2110: EOS
! 2111: | PROPOSAL_CHECK PROPOSAL_CHECK_LEVEL { cur_rmconf->pcheck_level = $2; } EOS
! 2112: | LIFETIME LIFETYPE_BYTE NUMBER unittype_byte
! 2113: {
! 2114: #if 1
! 2115: yyerror("byte lifetime support is deprecated in Phase1");
! 2116: return -1;
! 2117: #else
! 2118: yywarn("the lifetime of bytes in phase 1 "
! 2119: "will be ignored at the moment.");
! 2120: cur_rmconf->lifebyte = fix_lifebyte($3 * $4);
! 2121: if (cur_rmconf->lifebyte == 0)
! 2122: return -1;
! 2123: #endif
! 2124: }
! 2125: EOS
! 2126: | PROPOSAL
! 2127: {
! 2128: struct secprotospec *spspec;
! 2129:
! 2130: spspec = newspspec();
! 2131: if (spspec == NULL)
! 2132: return -1;
! 2133: insspspec(cur_rmconf, spspec);
! 2134: }
! 2135: BOC isakmpproposal_specs EOC
! 2136: ;
! 2137: exchange_types
! 2138: : /* nothing */
! 2139: | exchange_types EXCHANGETYPE
! 2140: {
! 2141: struct etypes *new;
! 2142: new = racoon_malloc(sizeof(struct etypes));
! 2143: if (new == NULL) {
! 2144: yyerror("failed to allocate etypes");
! 2145: return -1;
! 2146: }
! 2147: new->type = $2;
! 2148: new->next = NULL;
! 2149: if (cur_rmconf->etypes == NULL)
! 2150: cur_rmconf->etypes = new;
! 2151: else {
! 2152: struct etypes *p;
! 2153: for (p = cur_rmconf->etypes;
! 2154: p->next != NULL;
! 2155: p = p->next)
! 2156: ;
! 2157: p->next = new;
! 2158: }
! 2159: }
! 2160: ;
! 2161: cert_spec
! 2162: : CERT_X509 QUOTEDSTRING QUOTEDSTRING
! 2163: {
! 2164: if (cur_rmconf->mycert != NULL) {
! 2165: yyerror("certificate_type already defined\n");
! 2166: return -1;
! 2167: }
! 2168:
! 2169: if (load_x509($2->v, &cur_rmconf->mycertfile,
! 2170: &cur_rmconf->mycert)) {
! 2171: yyerror("failed to load certificate \"%s\"\n",
! 2172: $2->v);
! 2173: return -1;
! 2174: }
! 2175:
! 2176: cur_rmconf->myprivfile = racoon_strdup($3->v);
! 2177: STRDUP_FATAL(cur_rmconf->myprivfile);
! 2178:
! 2179: vfree($2);
! 2180: vfree($3);
! 2181: }
! 2182: EOS
! 2183: | CERT_PLAINRSA QUOTEDSTRING
! 2184: {
! 2185: char path[MAXPATHLEN];
! 2186: int ret = 0;
! 2187:
! 2188: if (cur_rmconf->mycert != NULL) {
! 2189: yyerror("certificate_type already defined\n");
! 2190: return -1;
! 2191: }
! 2192:
! 2193: cur_rmconf->mycert = vmalloc(1);
! 2194: if (cur_rmconf->mycert == NULL) {
! 2195: yyerror("failed to allocate mycert");
! 2196: return -1;
! 2197: }
! 2198: cur_rmconf->mycert->v[0] = ISAKMP_CERT_PLAINRSA;
! 2199:
! 2200: getpathname(path, sizeof(path),
! 2201: LC_PATHTYPE_CERT, $2->v);
! 2202: cur_rmconf->send_cr = FALSE;
! 2203: cur_rmconf->send_cert = FALSE;
! 2204: cur_rmconf->verify_cert = FALSE;
! 2205: if (rsa_parse_file(cur_rmconf->rsa_private, path,
! 2206: RSA_TYPE_PRIVATE)) {
! 2207: yyerror("Couldn't parse keyfile.\n", path);
! 2208: return -1;
! 2209: }
! 2210: plog(LLV_DEBUG, LOCATION, NULL,
! 2211: "Private PlainRSA keyfile parsed: %s\n", path);
! 2212: vfree($2);
! 2213: }
! 2214: EOS
! 2215: ;
! 2216: dh_group_num
! 2217: : ALGORITHMTYPE
! 2218: {
! 2219: $$ = algtype2doi(algclass_isakmp_dh, $1);
! 2220: if ($$ == -1) {
! 2221: yyerror("must be DH group");
! 2222: return -1;
! 2223: }
! 2224: }
! 2225: | NUMBER
! 2226: {
! 2227: if (ARRAYLEN(num2dhgroup) > $1 && num2dhgroup[$1] != 0) {
! 2228: $$ = num2dhgroup[$1];
! 2229: } else {
! 2230: yyerror("must be DH group");
! 2231: $$ = 0;
! 2232: return -1;
! 2233: }
! 2234: }
! 2235: ;
! 2236: identifierstring
! 2237: : /* nothing */ { $$ = NULL; }
! 2238: | ADDRSTRING { $$ = $1; }
! 2239: | QUOTEDSTRING { $$ = $1; }
! 2240: ;
! 2241: isakmpproposal_specs
! 2242: : /* nothing */
! 2243: | isakmpproposal_specs isakmpproposal_spec
! 2244: ;
! 2245: isakmpproposal_spec
! 2246: : LIFETIME LIFETYPE_TIME NUMBER unittype_time
! 2247: {
! 2248: cur_rmconf->spspec->lifetime = $3 * $4;
! 2249: }
! 2250: EOS
! 2251: | LIFETIME LIFETYPE_BYTE NUMBER unittype_byte
! 2252: {
! 2253: #if 1
! 2254: yyerror("byte lifetime support is deprecated");
! 2255: return -1;
! 2256: #else
! 2257: cur_rmconf->spspec->lifebyte = fix_lifebyte($3 * $4);
! 2258: if (cur_rmconf->spspec->lifebyte == 0)
! 2259: return -1;
! 2260: #endif
! 2261: }
! 2262: EOS
! 2263: | DH_GROUP dh_group_num
! 2264: {
! 2265: cur_rmconf->spspec->algclass[algclass_isakmp_dh] = $2;
! 2266: }
! 2267: EOS
! 2268: | GSS_ID QUOTEDSTRING
! 2269: {
! 2270: if (cur_rmconf->spspec->vendorid != VENDORID_GSSAPI) {
! 2271: yyerror("wrong Vendor ID for gssapi_id");
! 2272: return -1;
! 2273: }
! 2274: if (cur_rmconf->spspec->gssid != NULL)
! 2275: racoon_free(cur_rmconf->spspec->gssid);
! 2276: cur_rmconf->spspec->gssid =
! 2277: racoon_strdup($2->v);
! 2278: STRDUP_FATAL(cur_rmconf->spspec->gssid);
! 2279: }
! 2280: EOS
! 2281: | ALGORITHM_CLASS ALGORITHMTYPE keylength
! 2282: {
! 2283: int doi;
! 2284: int defklen;
! 2285:
! 2286: doi = algtype2doi($1, $2);
! 2287: if (doi == -1) {
! 2288: yyerror("algorithm mismatched 1");
! 2289: return -1;
! 2290: }
! 2291:
! 2292: switch ($1) {
! 2293: case algclass_isakmp_enc:
! 2294: /* reject suppressed algorithms */
! 2295: #ifndef HAVE_OPENSSL_RC5_H
! 2296: if ($2 == algtype_rc5) {
! 2297: yyerror("algorithm %s not supported",
! 2298: s_attr_isakmp_enc(doi));
! 2299: return -1;
! 2300: }
! 2301: #endif
! 2302: #ifndef HAVE_OPENSSL_IDEA_H
! 2303: if ($2 == algtype_idea) {
! 2304: yyerror("algorithm %s not supported",
! 2305: s_attr_isakmp_enc(doi));
! 2306: return -1;
! 2307: }
! 2308: #endif
! 2309:
! 2310: cur_rmconf->spspec->algclass[algclass_isakmp_enc] = doi;
! 2311: defklen = default_keylen($1, $2);
! 2312: if (defklen == 0) {
! 2313: if ($3) {
! 2314: yyerror("keylen not allowed");
! 2315: return -1;
! 2316: }
! 2317: } else {
! 2318: if ($3 && check_keylen($1, $2, $3) < 0) {
! 2319: yyerror("invalid keylen %d", $3);
! 2320: return -1;
! 2321: }
! 2322: }
! 2323: if ($3)
! 2324: cur_rmconf->spspec->encklen = $3;
! 2325: else
! 2326: cur_rmconf->spspec->encklen = defklen;
! 2327: break;
! 2328: case algclass_isakmp_hash:
! 2329: cur_rmconf->spspec->algclass[algclass_isakmp_hash] = doi;
! 2330: break;
! 2331: case algclass_isakmp_ameth:
! 2332: cur_rmconf->spspec->algclass[algclass_isakmp_ameth] = doi;
! 2333: /*
! 2334: * We may have to set the Vendor ID for the
! 2335: * authentication method we're using.
! 2336: */
! 2337: switch ($2) {
! 2338: case algtype_gssapikrb:
! 2339: if (cur_rmconf->spspec->vendorid !=
! 2340: VENDORID_UNKNOWN) {
! 2341: yyerror("Vendor ID mismatch "
! 2342: "for auth method");
! 2343: return -1;
! 2344: }
! 2345: /*
! 2346: * For interoperability with Win2k,
! 2347: * we set the Vendor ID to "GSSAPI".
! 2348: */
! 2349: cur_rmconf->spspec->vendorid =
! 2350: VENDORID_GSSAPI;
! 2351: break;
! 2352: case algtype_rsasig:
! 2353: if (oakley_get_certtype(cur_rmconf->peerscert) == ISAKMP_CERT_PLAINRSA) {
! 2354: if (rsa_list_count(cur_rmconf->rsa_private) == 0) {
! 2355: yyerror ("Private PlainRSA key not set. "
! 2356: "Use directive 'certificate_type plainrsa ...'\n");
! 2357: return -1;
! 2358: }
! 2359: if (rsa_list_count(cur_rmconf->rsa_public) == 0) {
! 2360: yyerror ("Public PlainRSA keys not set. "
! 2361: "Use directive 'peers_certfile plainrsa ...'\n");
! 2362: return -1;
! 2363: }
! 2364: }
! 2365: break;
! 2366: default:
! 2367: break;
! 2368: }
! 2369: break;
! 2370: default:
! 2371: yyerror("algorithm mismatched 2");
! 2372: return -1;
! 2373: }
! 2374: }
! 2375: EOS
! 2376: ;
! 2377:
! 2378: unittype_time
! 2379: : UNITTYPE_SEC { $$ = 1; }
! 2380: | UNITTYPE_MIN { $$ = 60; }
! 2381: | UNITTYPE_HOUR { $$ = (60 * 60); }
! 2382: ;
! 2383: unittype_byte
! 2384: : UNITTYPE_BYTE { $$ = 1; }
! 2385: | UNITTYPE_KBYTES { $$ = 1024; }
! 2386: | UNITTYPE_MBYTES { $$ = (1024 * 1024); }
! 2387: | UNITTYPE_TBYTES { $$ = (1024 * 1024 * 1024); }
! 2388: ;
! 2389: %%
! 2390:
! 2391: static struct secprotospec *
! 2392: newspspec()
! 2393: {
! 2394: struct secprotospec *new;
! 2395:
! 2396: new = racoon_calloc(1, sizeof(*new));
! 2397: if (new == NULL) {
! 2398: yyerror("failed to allocate spproto");
! 2399: return NULL;
! 2400: }
! 2401:
! 2402: new->encklen = 0; /*XXX*/
! 2403:
! 2404: /*
! 2405: * Default to "uknown" vendor -- we will override this
! 2406: * as necessary. When we send a Vendor ID payload, an
! 2407: * "unknown" will be translated to a KAME/racoon ID.
! 2408: */
! 2409: new->vendorid = VENDORID_UNKNOWN;
! 2410:
! 2411: return new;
! 2412: }
! 2413:
! 2414: /*
! 2415: * insert into head of list.
! 2416: */
! 2417: static void
! 2418: insspspec(rmconf, spspec)
! 2419: struct remoteconf *rmconf;
! 2420: struct secprotospec *spspec;
! 2421: {
! 2422: if (rmconf->spspec != NULL)
! 2423: rmconf->spspec->prev = spspec;
! 2424: spspec->next = rmconf->spspec;
! 2425: rmconf->spspec = spspec;
! 2426: }
! 2427:
! 2428: static struct secprotospec *
! 2429: dupspspec(spspec)
! 2430: struct secprotospec *spspec;
! 2431: {
! 2432: struct secprotospec *new;
! 2433:
! 2434: new = newspspec();
! 2435: if (new == NULL) {
! 2436: plog(LLV_ERROR, LOCATION, NULL,
! 2437: "dupspspec: malloc failed\n");
! 2438: return NULL;
! 2439: }
! 2440: memcpy(new, spspec, sizeof(*new));
! 2441:
! 2442: if (spspec->gssid) {
! 2443: new->gssid = racoon_strdup(spspec->gssid);
! 2444: STRDUP_FATAL(new->gssid);
! 2445: }
! 2446: if (spspec->remote) {
! 2447: new->remote = racoon_malloc(sizeof(*new->remote));
! 2448: if (new->remote == NULL) {
! 2449: plog(LLV_ERROR, LOCATION, NULL,
! 2450: "dupspspec: malloc failed (remote)\n");
! 2451: return NULL;
! 2452: }
! 2453: memcpy(new->remote, spspec->remote, sizeof(*new->remote));
! 2454: }
! 2455:
! 2456: return new;
! 2457: }
! 2458:
! 2459: /*
! 2460: * copy the whole list
! 2461: */
! 2462: void
! 2463: dupspspec_list(dst, src)
! 2464: struct remoteconf *dst, *src;
! 2465: {
! 2466: struct secprotospec *p, *new, *last;
! 2467:
! 2468: for(p = src->spspec, last = NULL; p; p = p->next, last = new) {
! 2469: new = dupspspec(p);
! 2470: if (new == NULL)
! 2471: exit(1);
! 2472:
! 2473: new->prev = last;
! 2474: new->next = NULL; /* not necessary but clean */
! 2475:
! 2476: if (last)
! 2477: last->next = new;
! 2478: else /* first element */
! 2479: dst->spspec = new;
! 2480:
! 2481: }
! 2482: }
! 2483:
! 2484: /*
! 2485: * delete the whole list
! 2486: */
! 2487: void
! 2488: flushspspec(rmconf)
! 2489: struct remoteconf *rmconf;
! 2490: {
! 2491: struct secprotospec *p;
! 2492:
! 2493: while(rmconf->spspec != NULL) {
! 2494: p = rmconf->spspec;
! 2495: rmconf->spspec = p->next;
! 2496: if (p->next != NULL)
! 2497: p->next->prev = NULL; /* not necessary but clean */
! 2498:
! 2499: if (p->gssid)
! 2500: racoon_free(p->gssid);
! 2501: if (p->remote)
! 2502: racoon_free(p->remote);
! 2503: racoon_free(p);
! 2504: }
! 2505: rmconf->spspec = NULL;
! 2506: }
! 2507:
! 2508: /* set final acceptable proposal */
! 2509: static int
! 2510: set_isakmp_proposal(rmconf)
! 2511: struct remoteconf *rmconf;
! 2512: {
! 2513: struct secprotospec *s;
! 2514: int prop_no = 1;
! 2515: int trns_no = 1;
! 2516: int32_t types[MAXALGCLASS];
! 2517:
! 2518: /* mandatory check */
! 2519: if (rmconf->spspec == NULL) {
! 2520: yyerror("no remote specification found: %s.\n",
! 2521: saddr2str(rmconf->remote));
! 2522: return -1;
! 2523: }
! 2524: for (s = rmconf->spspec; s != NULL; s = s->next) {
! 2525: /* XXX need more to check */
! 2526: if (s->algclass[algclass_isakmp_enc] == 0) {
! 2527: yyerror("encryption algorithm required.");
! 2528: return -1;
! 2529: }
! 2530: if (s->algclass[algclass_isakmp_hash] == 0) {
! 2531: yyerror("hash algorithm required.");
! 2532: return -1;
! 2533: }
! 2534: if (s->algclass[algclass_isakmp_dh] == 0) {
! 2535: yyerror("DH group required.");
! 2536: return -1;
! 2537: }
! 2538: if (s->algclass[algclass_isakmp_ameth] == 0) {
! 2539: yyerror("authentication method required.");
! 2540: return -1;
! 2541: }
! 2542: }
! 2543:
! 2544: /* skip to last part */
! 2545: for (s = rmconf->spspec; s->next != NULL; s = s->next)
! 2546: ;
! 2547:
! 2548: while (s != NULL) {
! 2549: plog(LLV_DEBUG2, LOCATION, NULL,
! 2550: "lifetime = %ld\n", (long)
! 2551: (s->lifetime ? s->lifetime : rmconf->lifetime));
! 2552: plog(LLV_DEBUG2, LOCATION, NULL,
! 2553: "lifebyte = %d\n",
! 2554: s->lifebyte ? s->lifebyte : rmconf->lifebyte);
! 2555: plog(LLV_DEBUG2, LOCATION, NULL,
! 2556: "encklen=%d\n", s->encklen);
! 2557:
! 2558: memset(types, 0, ARRAYLEN(types));
! 2559: types[algclass_isakmp_enc] = s->algclass[algclass_isakmp_enc];
! 2560: types[algclass_isakmp_hash] = s->algclass[algclass_isakmp_hash];
! 2561: types[algclass_isakmp_dh] = s->algclass[algclass_isakmp_dh];
! 2562: types[algclass_isakmp_ameth] =
! 2563: s->algclass[algclass_isakmp_ameth];
! 2564:
! 2565: /* expanding spspec */
! 2566: clean_tmpalgtype();
! 2567: trns_no = expand_isakmpspec(prop_no, trns_no, types,
! 2568: algclass_isakmp_enc, algclass_isakmp_ameth + 1,
! 2569: s->lifetime ? s->lifetime : rmconf->lifetime,
! 2570: s->lifebyte ? s->lifebyte : rmconf->lifebyte,
! 2571: s->encklen, s->vendorid, s->gssid,
! 2572: rmconf);
! 2573: if (trns_no == -1) {
! 2574: plog(LLV_ERROR, LOCATION, NULL,
! 2575: "failed to expand isakmp proposal.\n");
! 2576: return -1;
! 2577: }
! 2578:
! 2579: s = s->prev;
! 2580: }
! 2581:
! 2582: if (rmconf->proposal == NULL) {
! 2583: plog(LLV_ERROR, LOCATION, NULL,
! 2584: "no proposal found.\n");
! 2585: return -1;
! 2586: }
! 2587:
! 2588: return 0;
! 2589: }
! 2590:
! 2591: static void
! 2592: clean_tmpalgtype()
! 2593: {
! 2594: int i;
! 2595: for (i = 0; i < MAXALGCLASS; i++)
! 2596: tmpalgtype[i] = 0; /* means algorithm undefined. */
! 2597: }
! 2598:
! 2599: static int
! 2600: expand_isakmpspec(prop_no, trns_no, types,
! 2601: class, last, lifetime, lifebyte, encklen, vendorid, gssid,
! 2602: rmconf)
! 2603: int prop_no, trns_no;
! 2604: int *types, class, last;
! 2605: time_t lifetime;
! 2606: int lifebyte;
! 2607: int encklen;
! 2608: int vendorid;
! 2609: char *gssid;
! 2610: struct remoteconf *rmconf;
! 2611: {
! 2612: struct isakmpsa *new;
! 2613:
! 2614: /* debugging */
! 2615: {
! 2616: int j;
! 2617: char tb[10];
! 2618: plog(LLV_DEBUG2, LOCATION, NULL,
! 2619: "p:%d t:%d\n", prop_no, trns_no);
! 2620: for (j = class; j < MAXALGCLASS; j++) {
! 2621: snprintf(tb, sizeof(tb), "%d", types[j]);
! 2622: plog(LLV_DEBUG2, LOCATION, NULL,
! 2623: "%s%s%s%s\n",
! 2624: s_algtype(j, types[j]),
! 2625: types[j] ? "(" : "",
! 2626: tb[0] == '0' ? "" : tb,
! 2627: types[j] ? ")" : "");
! 2628: }
! 2629: plog(LLV_DEBUG2, LOCATION, NULL, "\n");
! 2630: }
! 2631:
! 2632: #define TMPALGTYPE2STR(n) \
! 2633: s_algtype(algclass_isakmp_##n, types[algclass_isakmp_##n])
! 2634: /* check mandatory values */
! 2635: if (types[algclass_isakmp_enc] == 0
! 2636: || types[algclass_isakmp_ameth] == 0
! 2637: || types[algclass_isakmp_hash] == 0
! 2638: || types[algclass_isakmp_dh] == 0) {
! 2639: yyerror("few definition of algorithm "
! 2640: "enc=%s ameth=%s hash=%s dhgroup=%s.\n",
! 2641: TMPALGTYPE2STR(enc),
! 2642: TMPALGTYPE2STR(ameth),
! 2643: TMPALGTYPE2STR(hash),
! 2644: TMPALGTYPE2STR(dh));
! 2645: return -1;
! 2646: }
! 2647: #undef TMPALGTYPE2STR
! 2648:
! 2649: /* set new sa */
! 2650: new = newisakmpsa();
! 2651: if (new == NULL) {
! 2652: yyerror("failed to allocate isakmp sa");
! 2653: return -1;
! 2654: }
! 2655: new->prop_no = prop_no;
! 2656: new->trns_no = trns_no++;
! 2657: new->lifetime = lifetime;
! 2658: new->lifebyte = lifebyte;
! 2659: new->enctype = types[algclass_isakmp_enc];
! 2660: new->encklen = encklen;
! 2661: new->authmethod = types[algclass_isakmp_ameth];
! 2662: new->hashtype = types[algclass_isakmp_hash];
! 2663: new->dh_group = types[algclass_isakmp_dh];
! 2664: new->vendorid = vendorid;
! 2665: #ifdef HAVE_GSSAPI
! 2666: if (new->authmethod == OAKLEY_ATTR_AUTH_METHOD_GSSAPI_KRB) {
! 2667: if (gssid != NULL) {
! 2668: if ((new->gssid = vmalloc(strlen(gssid))) == NULL) {
! 2669: racoon_free(new);
! 2670: yyerror("failed to allocate gssid");
! 2671: return -1;
! 2672: }
! 2673: memcpy(new->gssid->v, gssid, new->gssid->l);
! 2674: racoon_free(gssid);
! 2675: } else {
! 2676: /*
! 2677: * Allocate the default ID so that it gets put
! 2678: * into a GSS ID attribute during the Phase 1
! 2679: * exchange.
! 2680: */
! 2681: new->gssid = gssapi_get_default_gss_id();
! 2682: }
! 2683: }
! 2684: #endif
! 2685: insisakmpsa(new, rmconf);
! 2686:
! 2687: return trns_no;
! 2688: }
! 2689:
! 2690: #if 0
! 2691: /*
! 2692: * fix lifebyte.
! 2693: * Must be more than 1024B because its unit is kilobytes.
! 2694: * That is defined RFC2407.
! 2695: */
! 2696: static int
! 2697: fix_lifebyte(t)
! 2698: unsigned long t;
! 2699: {
! 2700: if (t < 1024) {
! 2701: yyerror("byte size should be more than 1024B.");
! 2702: return 0;
! 2703: }
! 2704:
! 2705: return(t / 1024);
! 2706: }
! 2707: #endif
! 2708:
! 2709: int
! 2710: cfparse()
! 2711: {
! 2712: int error;
! 2713:
! 2714: yyerrorcount = 0;
! 2715: yycf_init_buffer();
! 2716:
! 2717: if (yycf_switch_buffer(lcconf->racoon_conf) != 0) {
! 2718: plog(LLV_ERROR, LOCATION, NULL,
! 2719: "could not read configuration file \"%s\"\n",
! 2720: lcconf->racoon_conf);
! 2721: return -1;
! 2722: }
! 2723:
! 2724: error = yyparse();
! 2725: if (error != 0) {
! 2726: if (yyerrorcount) {
! 2727: plog(LLV_ERROR, LOCATION, NULL,
! 2728: "fatal parse failure (%d errors)\n",
! 2729: yyerrorcount);
! 2730: } else {
! 2731: plog(LLV_ERROR, LOCATION, NULL,
! 2732: "fatal parse failure.\n");
! 2733: }
! 2734: return -1;
! 2735: }
! 2736:
! 2737: if (error == 0 && yyerrorcount) {
! 2738: plog(LLV_ERROR, LOCATION, NULL,
! 2739: "parse error is nothing, but yyerrorcount is %d.\n",
! 2740: yyerrorcount);
! 2741: exit(1);
! 2742: }
! 2743:
! 2744: yycf_clean_buffer();
! 2745:
! 2746: plog(LLV_DEBUG2, LOCATION, NULL, "parse successed.\n");
! 2747:
! 2748: return 0;
! 2749: }
! 2750:
! 2751: int
! 2752: cfreparse()
! 2753: {
! 2754: flushph2();
! 2755: flushph1();
! 2756: flushrmconf();
! 2757: flushsainfo();
! 2758: clean_tmpalgtype();
! 2759: return(cfparse());
! 2760: }
! 2761:
! 2762: #ifdef ENABLE_ADMINPORT
! 2763: static void
! 2764: adminsock_conf(path, owner, group, mode_dec)
! 2765: vchar_t *path;
! 2766: vchar_t *owner;
! 2767: vchar_t *group;
! 2768: int mode_dec;
! 2769: {
! 2770: struct passwd *pw = NULL;
! 2771: struct group *gr = NULL;
! 2772: mode_t mode = 0;
! 2773: uid_t uid;
! 2774: gid_t gid;
! 2775: int isnum;
! 2776:
! 2777: adminsock_path = path->v;
! 2778:
! 2779: if (owner == NULL)
! 2780: return;
! 2781:
! 2782: errno = 0;
! 2783: uid = atoi(owner->v);
! 2784: isnum = !errno;
! 2785: if (((pw = getpwnam(owner->v)) == NULL) && !isnum)
! 2786: yyerror("User \"%s\" does not exist", owner->v);
! 2787:
! 2788: if (pw)
! 2789: adminsock_owner = pw->pw_uid;
! 2790: else
! 2791: adminsock_owner = uid;
! 2792:
! 2793: if (group == NULL)
! 2794: return;
! 2795:
! 2796: errno = 0;
! 2797: gid = atoi(group->v);
! 2798: isnum = !errno;
! 2799: if (((gr = getgrnam(group->v)) == NULL) && !isnum)
! 2800: yyerror("Group \"%s\" does not exist", group->v);
! 2801:
! 2802: if (gr)
! 2803: adminsock_group = gr->gr_gid;
! 2804: else
! 2805: adminsock_group = gid;
! 2806:
! 2807: if (mode_dec == -1)
! 2808: return;
! 2809:
! 2810: if (mode_dec > 777)
! 2811: yyerror("Mode 0%03o is invalid", mode_dec);
! 2812: if (mode_dec >= 400) { mode += 0400; mode_dec -= 400; }
! 2813: if (mode_dec >= 200) { mode += 0200; mode_dec -= 200; }
! 2814: if (mode_dec >= 100) { mode += 0200; mode_dec -= 100; }
! 2815:
! 2816: if (mode_dec > 77)
! 2817: yyerror("Mode 0%03o is invalid", mode_dec);
! 2818: if (mode_dec >= 40) { mode += 040; mode_dec -= 40; }
! 2819: if (mode_dec >= 20) { mode += 020; mode_dec -= 20; }
! 2820: if (mode_dec >= 10) { mode += 020; mode_dec -= 10; }
! 2821:
! 2822: if (mode_dec > 7)
! 2823: yyerror("Mode 0%03o is invalid", mode_dec);
! 2824: if (mode_dec >= 4) { mode += 04; mode_dec -= 4; }
! 2825: if (mode_dec >= 2) { mode += 02; mode_dec -= 2; }
! 2826: if (mode_dec >= 1) { mode += 02; mode_dec -= 1; }
! 2827:
! 2828: adminsock_mode = mode;
! 2829:
! 2830: return;
! 2831: }
! 2832: #endif
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>