Annotation of embedaddon/ipsec-tools/src/racoon/cftoken.l, revision 1.1.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>