Annotation of embedaddon/ipsec-tools/src/racoon/cftoken.l, revision 1.1
1.1 ! misho 1: /* $NetBSD: cftoken.l,v 1.23 2011/02/02 15:21:34 vanhu Exp $ */
! 2:
! 3: /* Id: cftoken.l,v 1.53 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/socket.h>
! 40:
! 41: #include <netinet/in.h>
! 42: #include PATH_IPSEC_H
! 43:
! 44: #include <stdlib.h>
! 45: #include <stdio.h>
! 46: #include <string.h>
! 47: #include <errno.h>
! 48: #include <limits.h>
! 49: #include <ctype.h>
! 50: #include <glob.h>
! 51: #ifdef HAVE_STDARG_H
! 52: #include <stdarg.h>
! 53: #else
! 54: #include <varargs.h>
! 55: #endif
! 56:
! 57: #include "var.h"
! 58: #include "misc.h"
! 59: #include "vmbuf.h"
! 60: #include "plog.h"
! 61: #include "debug.h"
! 62:
! 63: #include "algorithm.h"
! 64: #include "cfparse_proto.h"
! 65: #include "cftoken_proto.h"
! 66: #include "localconf.h"
! 67: #include "oakley.h"
! 68: #include "isakmp_var.h"
! 69: #include "isakmp.h"
! 70: #include "ipsec_doi.h"
! 71: #include "policy.h"
! 72: #include "proposal.h"
! 73: #include "remoteconf.h"
! 74: #ifdef GC
! 75: #include "gcmalloc.h"
! 76: #endif
! 77:
! 78: #include "cfparse.h"
! 79:
! 80: int yyerrorcount = 0;
! 81:
! 82: #if defined(YIPS_DEBUG)
! 83: # define YYDB plog(LLV_DEBUG2, LOCATION, NULL, \
! 84: "begin <%d>%s\n", yy_start, yytext);
! 85: # define YYD { \
! 86: plog(LLV_DEBUG2, LOCATION, NULL, "<%d>%s", \
! 87: yy_start, loglevel >= LLV_DEBUG2 ? "\n" : ""); \
! 88: }
! 89: #else
! 90: # define YYDB
! 91: # define YYD
! 92: #endif /* defined(YIPS_DEBUG) */
! 93:
! 94: #define MAX_INCLUDE_DEPTH 10
! 95:
! 96: static struct include_stack {
! 97: char *path;
! 98: FILE *fp;
! 99: YY_BUFFER_STATE prevstate;
! 100: int lineno;
! 101: glob_t matches;
! 102: int matchon;
! 103: } incstack[MAX_INCLUDE_DEPTH];
! 104: static int incstackp = 0;
! 105:
! 106: static int yy_first_time = 1;
! 107: %}
! 108:
! 109: /* common seciton */
! 110: nl \n
! 111: ws [ \t]+
! 112: digit [0-9]
! 113: letter [A-Za-z]
! 114: hexdigit [0-9A-Fa-f]
! 115: /*octet (([01]?{digit}?{digit})|((2([0-4]{digit}))|(25[0-5]))) */
! 116: special [()+\|\?\*]
! 117: comma \,
! 118: dot \.
! 119: slash \/
! 120: bcl \{
! 121: ecl \}
! 122: blcl \[
! 123: elcl \]
! 124: hyphen \-
! 125: percent \%
! 126: semi \;
! 127: comment \#.*
! 128: ccomment "/*"
! 129: bracketstring \<[^>]*\>
! 130: quotedstring \"[^"]*\"
! 131: addrstring [a-fA-F0-9:]([a-fA-F0-9:\.]*|[a-fA-F0-9:\.]*%[a-zA-Z0-9]*)
! 132: decstring {digit}+
! 133: hexstring 0x{hexdigit}+
! 134:
! 135: %s S_INI S_PRIV S_PTH S_LOG S_PAD S_LST S_RTRY S_CFG S_LDAP S_RAD
! 136: %s S_ALGST S_ALGCL
! 137: %s S_SAINF S_SAINFS
! 138: %s S_RMT S_RMTS S_RMTP
! 139: %s S_SA
! 140: %s S_GSSENC
! 141:
! 142: %%
! 143: %{
! 144: if (yy_first_time) {
! 145: BEGIN S_INI;
! 146: yy_first_time = 0;
! 147: }
! 148: %}
! 149:
! 150: /* privsep */
! 151: <S_INI>privsep { BEGIN S_PRIV; YYDB; return(PRIVSEP); }
! 152: <S_PRIV>{bcl} { return(BOC); }
! 153: <S_PRIV>user { YYD; return(USER); }
! 154: <S_PRIV>group { YYD; return(GROUP); }
! 155: <S_PRIV>chroot { YYD; return(CHROOT); }
! 156: <S_PRIV>{ecl} { BEGIN S_INI; return(EOC); }
! 157:
! 158: /* path */
! 159: <S_INI>path { BEGIN S_PTH; YYDB; return(PATH); }
! 160: <S_PTH>include { YYD; yylval.num = LC_PATHTYPE_INCLUDE;
! 161: return(PATHTYPE); }
! 162: <S_PTH>pre_shared_key { YYD; yylval.num = LC_PATHTYPE_PSK;
! 163: return(PATHTYPE); }
! 164: <S_PTH>certificate { YYD; yylval.num = LC_PATHTYPE_CERT;
! 165: return(PATHTYPE); }
! 166: <S_PTH>script { YYD; yylval.num = LC_PATHTYPE_SCRIPT;
! 167: return(PATHTYPE); }
! 168: <S_PTH>backupsa { YYD; yylval.num = LC_PATHTYPE_BACKUPSA;
! 169: return(PATHTYPE); }
! 170: <S_PTH>pidfile { YYD; yylval.num = LC_PATHTYPE_PIDFILE;
! 171: return(PATHTYPE); }
! 172: <S_PTH>{semi} { BEGIN S_INI; YYDB; return(EOS); }
! 173:
! 174: /* include */
! 175: <S_INI>include { YYDB; return(INCLUDE); }
! 176:
! 177: /* pfkey_buffer */
! 178: <S_INI>pfkey_buffer { YYDB; return(PFKEY_BUFFER); }
! 179:
! 180: /* special */
! 181: <S_INI>complex_bundle { YYDB; return(COMPLEX_BUNDLE); }
! 182:
! 183: /* logging */
! 184: <S_INI>log { BEGIN S_LOG; YYDB; return(LOGGING); }
! 185: <S_LOG>error { YYD; yylval.num = LLV_ERROR; return(LOGLEV); }
! 186: <S_LOG>warning { YYD; yylval.num = LLV_WARNING; return(LOGLEV); }
! 187: <S_LOG>notify { YYD; yylval.num = LLV_NOTIFY; return(LOGLEV); }
! 188: <S_LOG>info { YYD; yylval.num = LLV_INFO; return(LOGLEV); }
! 189: <S_LOG>debug { YYD; yylval.num = LLV_DEBUG; return(LOGLEV); }
! 190: <S_LOG>debug2 { YYD; yylval.num = LLV_DEBUG2; return(LOGLEV); }
! 191: <S_LOG>{semi} { BEGIN S_INI; return(EOS); }
! 192:
! 193: /* padding */
! 194: <S_INI>padding { BEGIN S_PAD; YYDB; return(PADDING); }
! 195: <S_PAD>{bcl} { return(BOC); }
! 196: <S_PAD>randomize { YYD; return(PAD_RANDOMIZE); }
! 197: <S_PAD>randomize_length { YYD; return(PAD_RANDOMIZELEN); }
! 198: <S_PAD>maximum_length { YYD; return(PAD_MAXLEN); }
! 199: <S_PAD>strict_check { YYD; return(PAD_STRICT); }
! 200: <S_PAD>exclusive_tail { YYD; return(PAD_EXCLTAIL); }
! 201: <S_PAD>{ecl} { BEGIN S_INI; return(EOC); }
! 202:
! 203: /* listen */
! 204: <S_INI>listen { BEGIN S_LST; YYDB; return(LISTEN); }
! 205: <S_LST>{bcl} { return(BOC); }
! 206: <S_LST>isakmp { YYD; return(X_ISAKMP); }
! 207: <S_LST>isakmp_natt { YYD; return(X_ISAKMP_NATT); }
! 208: <S_LST>admin { YYD; return(X_ADMIN); }
! 209: <S_LST>adminsock { YYD; return(ADMINSOCK); }
! 210: <S_LST>disabled { YYD; return(DISABLED); }
! 211: <S_LST>strict_address { YYD; return(STRICT_ADDRESS); }
! 212: <S_LST>{ecl} { BEGIN S_INI; return(EOC); }
! 213:
! 214: /* radius config */
! 215: <S_INI>radiuscfg { BEGIN S_RAD; YYDB; return(RADCFG); }
! 216: <S_RAD>{bcl} { return(BOC); }
! 217: <S_RAD>auth { YYD; return(RAD_AUTH); }
! 218: <S_RAD>acct { YYD; return(RAD_ACCT); }
! 219: <S_RAD>timeout { YYD; return(RAD_TIMEOUT); }
! 220: <S_RAD>retries { YYD; return(RAD_RETRIES); }
! 221: <S_RAD>{ecl} { BEGIN S_INI; return(EOC); }
! 222:
! 223: /* ldap config */
! 224: <S_INI>ldapcfg { BEGIN S_LDAP; YYDB; return(LDAPCFG); }
! 225: <S_LDAP>{bcl} { return(BOC); }
! 226: <S_LDAP>version { YYD; return(LDAP_PVER); }
! 227: <S_LDAP>host { YYD; return(LDAP_HOST); }
! 228: <S_LDAP>port { YYD; return(LDAP_PORT); }
! 229: <S_LDAP>base { YYD; return(LDAP_BASE); }
! 230: <S_LDAP>subtree { YYD; return(LDAP_SUBTREE); }
! 231: <S_LDAP>bind_dn { YYD; return(LDAP_BIND_DN); }
! 232: <S_LDAP>bind_pw { YYD; return(LDAP_BIND_PW); }
! 233: <S_LDAP>attr_user { YYD; return(LDAP_ATTR_USER); }
! 234: <S_LDAP>attr_addr { YYD; return(LDAP_ATTR_ADDR); }
! 235: <S_LDAP>attr_mask { YYD; return(LDAP_ATTR_MASK); }
! 236: <S_LDAP>attr_group { YYD; return(LDAP_ATTR_GROUP); }
! 237: <S_LDAP>attr_member { YYD; return(LDAP_ATTR_MEMBER); }
! 238: <S_LDAP>{ecl} { BEGIN S_INI; return(EOC); }
! 239:
! 240: /* mode_cfg */
! 241: <S_INI>mode_cfg { BEGIN S_CFG; YYDB; return(MODECFG); }
! 242: <S_CFG>{bcl} { return(BOC); }
! 243: <S_CFG>network4 { YYD; return(CFG_NET4); }
! 244: <S_CFG>netmask4 { YYD; return(CFG_MASK4); }
! 245: <S_CFG>dns4 { YYD; return(CFG_DNS4); }
! 246: <S_CFG>nbns4 { YYD; return(CFG_NBNS4); }
! 247: <S_CFG>wins4 { YYD; return(CFG_NBNS4); }
! 248: <S_CFG>default_domain { YYD; return(CFG_DEFAULT_DOMAIN); }
! 249: <S_CFG>auth_source { YYD; return(CFG_AUTH_SOURCE); }
! 250: <S_CFG>auth_groups { YYD; return(CFG_AUTH_GROUPS); }
! 251: <S_CFG>group_source { YYD; return(CFG_GROUP_SOURCE); }
! 252: <S_CFG>conf_source { YYD; return(CFG_CONF_SOURCE); }
! 253: <S_CFG>accounting { YYD; return(CFG_ACCOUNTING); }
! 254: <S_CFG>system { YYD; return(CFG_SYSTEM); }
! 255: <S_CFG>local { YYD; return(CFG_LOCAL); }
! 256: <S_CFG>none { YYD; return(CFG_NONE); }
! 257: <S_CFG>radius { YYD; return(CFG_RADIUS); }
! 258: <S_CFG>pam { YYD; return(CFG_PAM); }
! 259: <S_CFG>ldap { YYD; return(CFG_LDAP); }
! 260: <S_CFG>pool_size { YYD; return(CFG_POOL_SIZE); }
! 261: <S_CFG>banner { YYD; return(CFG_MOTD); }
! 262: <S_CFG>auth_throttle { YYD; return(CFG_AUTH_THROTTLE); }
! 263: <S_CFG>split_network { YYD; return(CFG_SPLIT_NETWORK); }
! 264: <S_CFG>local_lan { YYD; return(CFG_SPLIT_LOCAL); }
! 265: <S_CFG>include { YYD; return(CFG_SPLIT_INCLUDE); }
! 266: <S_CFG>split_dns { YYD; return(CFG_SPLIT_DNS); }
! 267: <S_CFG>pfs_group { YYD; return(CFG_PFS_GROUP); }
! 268: <S_CFG>save_passwd { YYD; return(CFG_SAVE_PASSWD); }
! 269: <S_CFG>{comma} { YYD; return(COMMA); }
! 270: <S_CFG>{ecl} { BEGIN S_INI; return(EOC); }
! 271:
! 272: /* timer */
! 273: <S_INI>timer { BEGIN S_RTRY; YYDB; return(RETRY); }
! 274: <S_RTRY>{bcl} { return(BOC); }
! 275: <S_RTRY>counter { YYD; return(RETRY_COUNTER); }
! 276: <S_RTRY>interval { YYD; return(RETRY_INTERVAL); }
! 277: <S_RTRY>persend { YYD; return(RETRY_PERSEND); }
! 278: <S_RTRY>phase1 { YYD; return(RETRY_PHASE1); }
! 279: <S_RTRY>phase2 { YYD; return(RETRY_PHASE2); }
! 280: <S_RTRY>natt_keepalive { YYD; return(NATT_KA); }
! 281: <S_RTRY>{ecl} { BEGIN S_INI; return(EOC); }
! 282:
! 283: /* sainfo */
! 284: <S_INI>sainfo { BEGIN S_SAINF; YYDB; return(SAINFO); }
! 285: <S_SAINF>anonymous { YYD; return(ANONYMOUS); }
! 286: <S_SAINF>clientaddr { YYD; return(CLIENTADDR); }
! 287: <S_SAINF>{blcl}any{elcl} { YYD; return(PORTANY); }
! 288: <S_SAINF>any { YYD; return(ANY); }
! 289: <S_SAINF>from { YYD; return(FROM); }
! 290: <S_SAINF>group { YYD; return(GROUP); }
! 291: /* sainfo spec */
! 292: <S_SAINF>{bcl} { BEGIN S_SAINFS; return(BOC); }
! 293: <S_SAINF>{semi} { BEGIN S_INI; return(EOS); }
! 294: <S_SAINFS>{ecl} { BEGIN S_INI; return(EOC); }
! 295: <S_SAINFS>pfs_group { YYD; return(PFS_GROUP); }
! 296: <S_SAINFS>remoteid { YYD; return(REMOTEID); }
! 297: <S_SAINFS>my_identifier { YYD; return(MY_IDENTIFIER); }
! 298: <S_SAINFS>lifetime { YYD; return(LIFETIME); }
! 299: <S_SAINFS>time { YYD; return(LIFETYPE_TIME); }
! 300: <S_SAINFS>byte { YYD; return(LIFETYPE_BYTE); }
! 301: <S_SAINFS>encryption_algorithm { YYD; yylval.num = algclass_ipsec_enc; return(ALGORITHM_CLASS); }
! 302: <S_SAINFS>authentication_algorithm { YYD; yylval.num = algclass_ipsec_auth; return(ALGORITHM_CLASS); }
! 303: <S_SAINFS>compression_algorithm { YYD; yylval.num = algclass_ipsec_comp; return(ALGORITHM_CLASS); }
! 304: <S_SAINFS>{comma} { YYD; return(COMMA); }
! 305:
! 306: /* remote */
! 307: <S_INI>remote { BEGIN S_RMT; YYDB; return(REMOTE); }
! 308: <S_RMT>anonymous { YYD; return(ANONYMOUS); }
! 309: <S_RMT>inherit { YYD; return(INHERIT); }
! 310: /* remote spec */
! 311: <S_RMT>{bcl} { BEGIN S_RMTS; return(BOC); }
! 312: <S_RMTS>{ecl} { BEGIN S_INI; return(EOC); }
! 313: <S_RMTS>remote_address { YYD; return(REMOTE_ADDRESS); }
! 314: <S_RMTS>exchange_mode { YYD; return(EXCHANGE_MODE); }
! 315: <S_RMTS>{comma} { YYD; /* XXX ignored, but to be handled. */ ; }
! 316: <S_RMTS>base { YYD; yylval.num = ISAKMP_ETYPE_BASE; return(EXCHANGETYPE); }
! 317: <S_RMTS>main { YYD; yylval.num = ISAKMP_ETYPE_IDENT; return(EXCHANGETYPE); }
! 318: <S_RMTS>aggressive { YYD; yylval.num = ISAKMP_ETYPE_AGG; return(EXCHANGETYPE); }
! 319: <S_RMTS>doi { YYD; return(DOI); }
! 320: <S_RMTS>ipsec_doi { YYD; yylval.num = IPSEC_DOI; return(DOITYPE); }
! 321: <S_RMTS>situation { YYD; return(SITUATION); }
! 322: <S_RMTS>identity_only { YYD; yylval.num = IPSECDOI_SIT_IDENTITY_ONLY; return(SITUATIONTYPE); }
! 323: <S_RMTS>secrecy { YYD; yylval.num = IPSECDOI_SIT_SECRECY; return(SITUATIONTYPE); }
! 324: <S_RMTS>integrity { YYD; yylval.num = IPSECDOI_SIT_INTEGRITY; return(SITUATIONTYPE); }
! 325: <S_RMTS>my_identifier { YYD; return(MY_IDENTIFIER); }
! 326: <S_RMTS>xauth_login { YYD; return(XAUTH_LOGIN); /* formerly identifier type login */ }
! 327: <S_RMTS>peers_identifier { YYD; return(PEERS_IDENTIFIER); }
! 328: <S_RMTS>verify_identifier { YYD; return(VERIFY_IDENTIFIER); }
! 329: <S_RMTS>certificate_type { YYD; return(CERTIFICATE_TYPE); }
! 330: <S_RMTS>ca_type { YYD; return(CA_TYPE); }
! 331: <S_RMTS>x509 { YYD; yylval.num = ISAKMP_CERT_X509SIGN; return(CERT_X509); }
! 332: <S_RMTS>plain_rsa { YYD; yylval.num = ISAKMP_CERT_PLAINRSA; return(CERT_PLAINRSA); }
! 333: <S_RMTS>peers_certfile { YYD; return(PEERS_CERTFILE); }
! 334: <S_RMTS>dnssec { YYD; return(DNSSEC); }
! 335: <S_RMTS>verify_cert { YYD; return(VERIFY_CERT); }
! 336: <S_RMTS>send_cert { YYD; return(SEND_CERT); }
! 337: <S_RMTS>send_cr { YYD; return(SEND_CR); }
! 338: <S_RMTS>match_empty_cr { YYD; return(MATCH_EMPTY_CR); }
! 339: <S_RMTS>dh_group { YYD; return(DH_GROUP); }
! 340: <S_RMTS>nonce_size { YYD; return(NONCE_SIZE); }
! 341: <S_RMTS>generate_policy { YYD; return(GENERATE_POLICY); }
! 342: <S_RMTS>unique { YYD; yylval.num = GENERATE_POLICY_UNIQUE; return(GENERATE_LEVEL); }
! 343: <S_RMTS>require { YYD; yylval.num = GENERATE_POLICY_REQUIRE; return(GENERATE_LEVEL); }
! 344: <S_RMTS>support_proxy { YYD; return(SUPPORT_PROXY); }
! 345: <S_RMTS>initial_contact { YYD; return(INITIAL_CONTACT); }
! 346: <S_RMTS>nat_traversal { YYD; return(NAT_TRAVERSAL); }
! 347: <S_RMTS>force { YYD; return(REMOTE_FORCE_LEVEL); }
! 348: <S_RMTS>proposal_check { YYD; return(PROPOSAL_CHECK); }
! 349: <S_RMTS>obey { YYD; yylval.num = PROP_CHECK_OBEY; return(PROPOSAL_CHECK_LEVEL); }
! 350: <S_RMTS>strict { YYD; yylval.num = PROP_CHECK_STRICT; return(PROPOSAL_CHECK_LEVEL); }
! 351: <S_RMTS>exact { YYD; yylval.num = PROP_CHECK_EXACT; return(PROPOSAL_CHECK_LEVEL); }
! 352: <S_RMTS>claim { YYD; yylval.num = PROP_CHECK_CLAIM; return(PROPOSAL_CHECK_LEVEL); }
! 353: <S_RMTS>keepalive { YYD; return(KEEPALIVE); }
! 354: <S_RMTS>passive { YYD; return(PASSIVE); }
! 355: <S_RMTS>lifetime { YYD; return(LIFETIME); }
! 356: <S_RMTS>time { YYD; return(LIFETYPE_TIME); }
! 357: <S_RMTS>byte { YYD; return(LIFETYPE_BYTE); }
! 358: <S_RMTS>dpd { YYD; return(DPD); }
! 359: <S_RMTS>dpd_delay { YYD; return(DPD_DELAY); }
! 360: <S_RMTS>dpd_retry { YYD; return(DPD_RETRY); }
! 361: <S_RMTS>dpd_maxfail { YYD; return(DPD_MAXFAIL); }
! 362: <S_RMTS>ph1id { YYD; return(PH1ID); }
! 363: <S_RMTS>ike_frag { YYD; return(IKE_FRAG); }
! 364: <S_RMTS>esp_frag { YYD; return(ESP_FRAG); }
! 365: <S_RMTS>script { YYD; return(SCRIPT); }
! 366: <S_RMTS>phase1_up { YYD; return(PHASE1_UP); }
! 367: <S_RMTS>phase1_down { YYD; return(PHASE1_DOWN); }
! 368: <S_RMTS>phase1_dead { YYD; return(PHASE1_DEAD); }
! 369: <S_RMTS>mode_cfg { YYD; return(MODE_CFG); }
! 370: <S_RMTS>weak_phase1_check { YYD; return(WEAK_PHASE1_CHECK); }
! 371: <S_RMTS>rekey { YYD; return(REKEY); }
! 372: /* remote proposal */
! 373: <S_RMTS>proposal { BEGIN S_RMTP; YYDB; return(PROPOSAL); }
! 374: <S_RMTP>{bcl} { return(BOC); }
! 375: <S_RMTP>{ecl} { BEGIN S_RMTS; return(EOC); }
! 376: <S_RMTP>lifetime { YYD; return(LIFETIME); }
! 377: <S_RMTP>time { YYD; return(LIFETYPE_TIME); }
! 378: <S_RMTP>byte { YYD; return(LIFETYPE_BYTE); }
! 379: <S_RMTP>encryption_algorithm { YYD; yylval.num = algclass_isakmp_enc; return(ALGORITHM_CLASS); }
! 380: <S_RMTP>authentication_method { YYD; yylval.num = algclass_isakmp_ameth; return(ALGORITHM_CLASS); }
! 381: <S_RMTP>hash_algorithm { YYD; yylval.num = algclass_isakmp_hash; return(ALGORITHM_CLASS); }
! 382: <S_RMTP>dh_group { YYD; return(DH_GROUP); }
! 383: <S_RMTP>gss_id { YYD; return(GSS_ID); }
! 384: <S_RMTP>gssapi_id { YYD; return(GSS_ID); } /* for back compatibility */
! 385:
! 386: /* GSS ID encoding type (global) */
! 387: <S_INI>gss_id_enc { BEGIN S_GSSENC; YYDB; return(GSS_ID_ENC); }
! 388: <S_GSSENC>latin1 { YYD; yylval.num = LC_GSSENC_LATIN1;
! 389: return(GSS_ID_ENCTYPE); }
! 390: <S_GSSENC>utf-16le { YYD; yylval.num = LC_GSSENC_UTF16LE;
! 391: return(GSS_ID_ENCTYPE); }
! 392: <S_GSSENC>{semi} { BEGIN S_INI; YYDB; return(EOS); }
! 393:
! 394: /* parameter */
! 395: on { YYD; yylval.num = TRUE; return(SWITCH); }
! 396: off { YYD; yylval.num = FALSE; return(SWITCH); }
! 397:
! 398: /* prefix */
! 399: {slash}{digit}{1,3} {
! 400: YYD;
! 401: yytext++;
! 402: yylval.num = atoi(yytext);
! 403: return(PREFIX);
! 404: }
! 405:
! 406: /* port number */
! 407: {blcl}{decstring}{elcl} {
! 408: char *p = yytext;
! 409: YYD;
! 410: while (*++p != ']') ;
! 411: *p = 0;
! 412: yytext++;
! 413: yylval.num = atoi(yytext);
! 414: return(PORT);
! 415: }
! 416:
! 417: /* address range */
! 418: {hyphen}{addrstring} {
! 419: YYD;
! 420: yytext++;
! 421: yylval.val = vmalloc(yyleng + 1);
! 422: if (yylval.val == NULL) {
! 423: yyerror("vmalloc failed");
! 424: return -1;
! 425: }
! 426: memcpy(yylval.val->v, yytext, yylval.val->l);
! 427: return(ADDRRANGE);
! 428: }
! 429:
! 430: /* upper protocol */
! 431: esp { YYD; yylval.num = IPPROTO_ESP; return(UL_PROTO); }
! 432: ah { YYD; yylval.num = IPPROTO_AH; return(UL_PROTO); }
! 433: ipcomp { YYD; yylval.num = IPPROTO_IPCOMP; return(UL_PROTO); }
! 434: icmp { YYD; yylval.num = IPPROTO_ICMP; return(UL_PROTO); }
! 435: icmp6 { YYD; yylval.num = IPPROTO_ICMPV6; return(UL_PROTO); }
! 436: tcp { YYD; yylval.num = IPPROTO_TCP; return(UL_PROTO); }
! 437: udp { YYD; yylval.num = IPPROTO_UDP; return(UL_PROTO); }
! 438: gre { YYD; yylval.num = IPPROTO_GRE; return(UL_PROTO); }
! 439:
! 440: /* algorithm type */
! 441: des_iv64 { YYD; yylval.num = algtype_des_iv64; return(ALGORITHMTYPE); }
! 442: des { YYD; yylval.num = algtype_des; return(ALGORITHMTYPE); }
! 443: 3des { YYD; yylval.num = algtype_3des; return(ALGORITHMTYPE); }
! 444: rc5 { YYD; yylval.num = algtype_rc5; return(ALGORITHMTYPE); }
! 445: idea { YYD; yylval.num = algtype_idea; return(ALGORITHMTYPE); }
! 446: cast128 { YYD; yylval.num = algtype_cast128; return(ALGORITHMTYPE); }
! 447: blowfish { YYD; yylval.num = algtype_blowfish; return(ALGORITHMTYPE); }
! 448: 3idea { YYD; yylval.num = algtype_3idea; return(ALGORITHMTYPE); }
! 449: des_iv32 { YYD; yylval.num = algtype_des_iv32; return(ALGORITHMTYPE); }
! 450: rc4 { YYD; yylval.num = algtype_rc4; return(ALGORITHMTYPE); }
! 451: null_enc { YYD; yylval.num = algtype_null_enc; return(ALGORITHMTYPE); }
! 452: null { YYD; yylval.num = algtype_null_enc; return(ALGORITHMTYPE); }
! 453: aes { YYD; yylval.num = algtype_aes; return(ALGORITHMTYPE); }
! 454: rijndael { YYD; yylval.num = algtype_aes; return(ALGORITHMTYPE); }
! 455: twofish { YYD; yylval.num = algtype_twofish; return(ALGORITHMTYPE); }
! 456: camellia { YYD; yylval.num = algtype_camellia; return(ALGORITHMTYPE); }
! 457: non_auth { YYD; yylval.num = algtype_non_auth; return(ALGORITHMTYPE); }
! 458: hmac_md5 { YYD; yylval.num = algtype_hmac_md5; return(ALGORITHMTYPE); }
! 459: hmac_sha1 { YYD; yylval.num = algtype_hmac_sha1; return(ALGORITHMTYPE); }
! 460: hmac_sha2_256 { YYD; yylval.num = algtype_hmac_sha2_256; return(ALGORITHMTYPE); }
! 461: hmac_sha256 { YYD; yylval.num = algtype_hmac_sha2_256; return(ALGORITHMTYPE); }
! 462: hmac_sha2_384 { YYD; yylval.num = algtype_hmac_sha2_384; return(ALGORITHMTYPE); }
! 463: hmac_sha384 { YYD; yylval.num = algtype_hmac_sha2_384; return(ALGORITHMTYPE); }
! 464: hmac_sha2_512 { YYD; yylval.num = algtype_hmac_sha2_512; return(ALGORITHMTYPE); }
! 465: hmac_sha512 { YYD; yylval.num = algtype_hmac_sha2_512; return(ALGORITHMTYPE); }
! 466: des_mac { YYD; yylval.num = algtype_des_mac; return(ALGORITHMTYPE); }
! 467: kpdk { YYD; yylval.num = algtype_kpdk; return(ALGORITHMTYPE); }
! 468: md5 { YYD; yylval.num = algtype_md5; return(ALGORITHMTYPE); }
! 469: sha1 { YYD; yylval.num = algtype_sha1; return(ALGORITHMTYPE); }
! 470: tiger { YYD; yylval.num = algtype_tiger; return(ALGORITHMTYPE); }
! 471: sha2_256 { YYD; yylval.num = algtype_sha2_256; return(ALGORITHMTYPE); }
! 472: sha256 { YYD; yylval.num = algtype_sha2_256; return(ALGORITHMTYPE); }
! 473: sha2_384 { YYD; yylval.num = algtype_sha2_384; return(ALGORITHMTYPE); }
! 474: sha384 { YYD; yylval.num = algtype_sha2_384; return(ALGORITHMTYPE); }
! 475: sha2_512 { YYD; yylval.num = algtype_sha2_512; return(ALGORITHMTYPE); }
! 476: sha512 { YYD; yylval.num = algtype_sha2_512; return(ALGORITHMTYPE); }
! 477: oui { YYD; yylval.num = algtype_oui; return(ALGORITHMTYPE); }
! 478: deflate { YYD; yylval.num = algtype_deflate; return(ALGORITHMTYPE); }
! 479: lzs { YYD; yylval.num = algtype_lzs; return(ALGORITHMTYPE); }
! 480: modp768 { YYD; yylval.num = algtype_modp768; return(ALGORITHMTYPE); }
! 481: modp1024 { YYD; yylval.num = algtype_modp1024; return(ALGORITHMTYPE); }
! 482: modp1536 { YYD; yylval.num = algtype_modp1536; return(ALGORITHMTYPE); }
! 483: ec2n155 { YYD; yylval.num = algtype_ec2n155; return(ALGORITHMTYPE); }
! 484: ec2n185 { YYD; yylval.num = algtype_ec2n185; return(ALGORITHMTYPE); }
! 485: modp2048 { YYD; yylval.num = algtype_modp2048; return(ALGORITHMTYPE); }
! 486: modp3072 { YYD; yylval.num = algtype_modp3072; return(ALGORITHMTYPE); }
! 487: modp4096 { YYD; yylval.num = algtype_modp4096; return(ALGORITHMTYPE); }
! 488: modp6144 { YYD; yylval.num = algtype_modp6144; return(ALGORITHMTYPE); }
! 489: modp8192 { YYD; yylval.num = algtype_modp8192; return(ALGORITHMTYPE); }
! 490: pre_shared_key { YYD; yylval.num = algtype_psk; return(ALGORITHMTYPE); }
! 491: rsasig { YYD; yylval.num = algtype_rsasig; return(ALGORITHMTYPE); }
! 492: dsssig { YYD; yylval.num = algtype_dsssig; return(ALGORITHMTYPE); }
! 493: rsaenc { YYD; yylval.num = algtype_rsaenc; return(ALGORITHMTYPE); }
! 494: rsarev { YYD; yylval.num = algtype_rsarev; return(ALGORITHMTYPE); }
! 495: gssapi_krb { YYD; yylval.num = algtype_gssapikrb; return(ALGORITHMTYPE); }
! 496: hybrid_rsa_server {
! 497: #ifdef ENABLE_HYBRID
! 498: YYD; yylval.num = algtype_hybrid_rsa_s; return(ALGORITHMTYPE);
! 499: #else
! 500: yyerror("racoon not configured with --enable-hybrid");
! 501: #endif
! 502: }
! 503: hybrid_dss_server {
! 504: #ifdef ENABLE_HYBRID
! 505: YYD; yylval.num = algtype_hybrid_dss_s; return(ALGORITHMTYPE);
! 506: #else
! 507: yyerror("racoon not configured with --enable-hybrid");
! 508: #endif
! 509: }
! 510: hybrid_rsa_client {
! 511: #ifdef ENABLE_HYBRID
! 512: YYD; yylval.num = algtype_hybrid_rsa_c; return(ALGORITHMTYPE);
! 513: #else
! 514: yyerror("racoon not configured with --enable-hybrid");
! 515: #endif
! 516: }
! 517: hybrid_dss_client {
! 518: #ifdef ENABLE_HYBRID
! 519: YYD; yylval.num = algtype_hybrid_dss_c; return(ALGORITHMTYPE);
! 520: #else
! 521: yyerror("racoon not configured with --enable-hybrid");
! 522: #endif
! 523: }
! 524: xauth_psk_server {
! 525: #ifdef ENABLE_HYBRID
! 526: YYD; yylval.num = algtype_xauth_psk_s; return(ALGORITHMTYPE);
! 527: #else
! 528: yyerror("racoon not configured with --enable-hybrid");
! 529: #endif
! 530: }
! 531: xauth_psk_client {
! 532: #ifdef ENABLE_HYBRID
! 533: YYD; yylval.num = algtype_xauth_psk_c; return(ALGORITHMTYPE);
! 534: #else
! 535: yyerror("racoon not configured with --enable-hybrid");
! 536: #endif
! 537: }
! 538: xauth_rsa_server {
! 539: #ifdef ENABLE_HYBRID
! 540: YYD; yylval.num = algtype_xauth_rsa_s; return(ALGORITHMTYPE);
! 541: #else
! 542: yyerror("racoon not configured with --enable-hybrid");
! 543: #endif
! 544: }
! 545: xauth_rsa_client {
! 546: #ifdef ENABLE_HYBRID
! 547: YYD; yylval.num = algtype_xauth_rsa_c; return(ALGORITHMTYPE);
! 548: #else
! 549: yyerror("racoon not configured with --enable-hybrid");
! 550: #endif
! 551: }
! 552:
! 553:
! 554: /* identifier type */
! 555: user_fqdn { YYD; yylval.num = IDTYPE_USERFQDN; return(IDENTIFIERTYPE); }
! 556: fqdn { YYD; yylval.num = IDTYPE_FQDN; return(IDENTIFIERTYPE); }
! 557: keyid { YYD; yylval.num = IDTYPE_KEYID; return(IDENTIFIERTYPE); }
! 558: address { YYD; yylval.num = IDTYPE_ADDRESS; return(IDENTIFIERTYPE); }
! 559: subnet { YYD; yylval.num = IDTYPE_SUBNET; return(IDENTIFIERTYPE); }
! 560: asn1dn { YYD; yylval.num = IDTYPE_ASN1DN; return(IDENTIFIERTYPE); }
! 561:
! 562: /* identifier qualifier */
! 563: tag { YYD; yylval.num = IDQUAL_TAG; return(IDENTIFIERQUAL); }
! 564: file { YYD; yylval.num = IDQUAL_FILE; return(IDENTIFIERQUAL); }
! 565:
! 566: /* units */
! 567: B|byte|bytes { YYD; return(UNITTYPE_BYTE); }
! 568: KB { YYD; return(UNITTYPE_KBYTES); }
! 569: MB { YYD; return(UNITTYPE_MBYTES); }
! 570: TB { YYD; return(UNITTYPE_TBYTES); }
! 571: sec|secs|second|seconds { YYD; return(UNITTYPE_SEC); }
! 572: min|mins|minute|minutes { YYD; return(UNITTYPE_MIN); }
! 573: hour|hours { YYD; return(UNITTYPE_HOUR); }
! 574:
! 575: /* boolean */
! 576: yes { YYD; yylval.num = TRUE; return(BOOLEAN); }
! 577: no { YYD; yylval.num = FALSE; return(BOOLEAN); }
! 578:
! 579: {decstring} {
! 580: char *bp;
! 581:
! 582: YYD;
! 583: yylval.num = strtoul(yytext, &bp, 10);
! 584: return(NUMBER);
! 585: }
! 586:
! 587: {hexstring} {
! 588: char *p;
! 589:
! 590: YYD;
! 591: yylval.val = vmalloc(yyleng + (yyleng & 1) + 1);
! 592: if (yylval.val == NULL) {
! 593: yyerror("vmalloc failed");
! 594: return -1;
! 595: }
! 596:
! 597: p = yylval.val->v;
! 598: *p++ = '0';
! 599: *p++ = 'x';
! 600:
! 601: /* fixed string if length is odd. */
! 602: if (yyleng & 1)
! 603: *p++ = '0';
! 604: memcpy(p, &yytext[2], yyleng - 1);
! 605:
! 606: return(HEXSTRING);
! 607: }
! 608:
! 609: {quotedstring} {
! 610: char *p = yytext;
! 611:
! 612: YYD;
! 613: while (*++p != '"') ;
! 614: *p = '\0';
! 615:
! 616: yylval.val = vmalloc(yyleng - 1);
! 617: if (yylval.val == NULL) {
! 618: yyerror("vmalloc failed");
! 619: return -1;
! 620: }
! 621: memcpy(yylval.val->v, &yytext[1], yylval.val->l);
! 622:
! 623: return(QUOTEDSTRING);
! 624: }
! 625:
! 626: {addrstring} {
! 627: YYD;
! 628:
! 629: yylval.val = vmalloc(yyleng + 1);
! 630: if (yylval.val == NULL) {
! 631: yyerror("vmalloc failed");
! 632: return -1;
! 633: }
! 634: memcpy(yylval.val->v, yytext, yylval.val->l);
! 635:
! 636: return(ADDRSTRING);
! 637: }
! 638:
! 639: <<EOF>> {
! 640: yy_delete_buffer(YY_CURRENT_BUFFER);
! 641: fclose (incstack[incstackp].fp);
! 642: incstack[incstackp].fp = NULL;
! 643: racoon_free(incstack[incstackp].path);
! 644: incstack[incstackp].path = NULL;
! 645: incstackp--;
! 646: nextfile:
! 647: if (incstack[incstackp].matchon <
! 648: incstack[incstackp].matches.gl_pathc) {
! 649: char* filepath = incstack[incstackp].matches.gl_pathv[incstack[incstackp].matchon];
! 650: incstack[incstackp].matchon++;
! 651: incstackp++;
! 652: if (yycf_set_buffer(filepath) != 0) {
! 653: incstackp--;
! 654: goto nextfile;
! 655: }
! 656: yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
! 657: BEGIN(S_INI);
! 658: } else {
! 659: globfree(&incstack[incstackp].matches);
! 660: if (incstackp == 0)
! 661: yyterminate();
! 662: else
! 663: yy_switch_to_buffer(incstack[incstackp].prevstate);
! 664: }
! 665: }
! 666:
! 667: /* ... */
! 668: {ws} { ; }
! 669: {nl} { incstack[incstackp].lineno++; }
! 670: {comment} { YYD; }
! 671: {semi} { return(EOS); }
! 672: . { yymore(); }
! 673:
! 674: %%
! 675:
! 676: void
! 677: yyerror(char *s, ...)
! 678: {
! 679: char fmt[512];
! 680:
! 681: va_list ap;
! 682: #ifdef HAVE_STDARG_H
! 683: va_start(ap, s);
! 684: #else
! 685: va_start(ap);
! 686: #endif
! 687: snprintf(fmt, sizeof(fmt), "%s:%d: \"%s\" %s\n",
! 688: incstack[incstackp].path, incstack[incstackp].lineno,
! 689: yytext, s);
! 690: plogv(LLV_ERROR, LOCATION, NULL, fmt, ap);
! 691: va_end(ap);
! 692:
! 693: yyerrorcount++;
! 694: }
! 695:
! 696: void
! 697: yywarn(char *s, ...)
! 698: {
! 699: char fmt[512];
! 700:
! 701: va_list ap;
! 702: #ifdef HAVE_STDARG_H
! 703: va_start(ap, s);
! 704: #else
! 705: va_start(ap);
! 706: #endif
! 707: snprintf(fmt, sizeof(fmt), "%s:%d: \"%s\" %s\n",
! 708: incstack[incstackp].path, incstack[incstackp].lineno,
! 709: yytext, s);
! 710: plogv(LLV_WARNING, LOCATION, NULL, fmt, ap);
! 711: va_end(ap);
! 712: }
! 713:
! 714: int
! 715: yycf_switch_buffer(path)
! 716: char *path;
! 717: {
! 718: char *filepath = NULL;
! 719:
! 720: /* got the include file name */
! 721: if (incstackp >= MAX_INCLUDE_DEPTH) {
! 722: plog(LLV_ERROR, LOCATION, NULL,
! 723: "Includes nested too deeply");
! 724: return -1;
! 725: }
! 726:
! 727: if (glob(path, GLOB_TILDE, NULL, &incstack[incstackp].matches) != 0 ||
! 728: incstack[incstackp].matches.gl_pathc == 0) {
! 729: plog(LLV_ERROR, LOCATION, NULL,
! 730: "glob found no matches for path \"%s\"\n", path);
! 731: return -1;
! 732: }
! 733: incstack[incstackp].matchon = 0;
! 734: incstack[incstackp].prevstate = YY_CURRENT_BUFFER;
! 735:
! 736: nextmatch:
! 737: if (incstack[incstackp].matchon >= incstack[incstackp].matches.gl_pathc)
! 738: return -1;
! 739: filepath =
! 740: incstack[incstackp].matches.gl_pathv[incstack[incstackp].matchon];
! 741: incstack[incstackp].matchon++;
! 742: incstackp++;
! 743:
! 744: if (yycf_set_buffer(filepath) != 0) {
! 745: incstackp--;
! 746: goto nextmatch;
! 747: }
! 748:
! 749: yy_switch_to_buffer(yy_create_buffer(yyin, YY_BUF_SIZE));
! 750:
! 751: BEGIN(S_INI);
! 752:
! 753: return 0;
! 754: }
! 755:
! 756: int
! 757: yycf_set_buffer(path)
! 758: char *path;
! 759: {
! 760: yyin = fopen(path, "r");
! 761: if (yyin == NULL) {
! 762: fprintf(stderr, "failed to open file %s (%s)\n",
! 763: path, strerror(errno));
! 764: plog(LLV_ERROR, LOCATION, NULL,
! 765: "failed to open file %s (%s)\n",
! 766: path, strerror(errno));
! 767: return -1;
! 768: }
! 769:
! 770: /* initialize */
! 771: incstack[incstackp].fp = yyin;
! 772: if (incstack[incstackp].path != NULL)
! 773: racoon_free(incstack[incstackp].path);
! 774: incstack[incstackp].path = racoon_strdup(path);
! 775: STRDUP_FATAL(incstack[incstackp].path);
! 776: incstack[incstackp].lineno = 1;
! 777: plog(LLV_DEBUG, LOCATION, NULL,
! 778: "reading config file %s\n", path);
! 779:
! 780: return 0;
! 781: }
! 782:
! 783: void
! 784: yycf_init_buffer()
! 785: {
! 786: int i;
! 787:
! 788: for (i = 0; i < MAX_INCLUDE_DEPTH; i++)
! 789: memset(&incstack[i], 0, sizeof(incstack[i]));
! 790: incstackp = 0;
! 791: }
! 792:
! 793: void
! 794: yycf_clean_buffer()
! 795: {
! 796: int i;
! 797:
! 798: for (i = 0; i < MAX_INCLUDE_DEPTH; i++) {
! 799: if (incstack[i].path != NULL) {
! 800: fclose(incstack[i].fp);
! 801: racoon_free(incstack[i].path);
! 802: incstack[i].path = NULL;
! 803: }
! 804: }
! 805: }
! 806:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>