token.l revision 55505
1234852Sbapt/*
2 * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of the project nor the names of its contributors
14 *    may be used to endorse or promote products derived from this software
15 *    without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 * $FreeBSD: head/sbin/setkey/token.l 55505 2000-01-06 12:40:54Z shin $
30 */
31
32%{
33#include <sys/types.h>
34#include <sys/param.h>
35#include <sys/socket.h>
36#include <net/route.h>
37#include <net/pfkeyv2.h>
38#include <netkey/keydb.h>
39#include <netkey/key_debug.h>
40#include <netinet/in.h>
41#include <netinet6/ipsec.h>
42
43#include <stdlib.h>
44#include <limits.h>
45#include <string.h>
46#include <unistd.h>
47#include <errno.h>
48#include "vchar.h"
49#include "y.tab.h"
50
51#define DECHO \
52	if (f_debug) {printf("<%d>", yy_start); ECHO ; printf("\n"); }
53
54#define CMDARG \
55{ \
56	char *__buf__ = strdup(yytext), *__p__; \
57	for (__p__ = __buf__; *__p__ != NULL; __p__++) \
58		if (*__p__ == '\n' || *__p__ == '\t') \
59			*__p__ = ' '; \
60	strcat(cmdarg, __buf__); \
61	free(__buf__); \
62}
63
64#define PREPROC	DECHO CMDARG
65
66int	lineno = 1;
67char	cmdarg[8192]; /* XXX: BUFSIZ is the better ? */
68
69extern u_char	m_buf[BUFSIZ];
70extern u_int	m_len;
71extern int	f_debug;
72
73int	yylex __P((void));
74void	yyerror __P((char *s));
75extern void	parse_init __P((void));
76int	parse __P((FILE **));
77int	yyparse __P((void));
78
79%}
80
81/* common section */
82nl		\n
83ws		[ \t]+
84digit		[0-9]
85letter		[0-9A-Za-z]
86hexdigit	[0-9A-Fa-f]
87/*octet		(([01]?{digit}?{digit})|((2([0-4]{digit}))|(25[0-5])))*/
88special		[()+\|\?\*,]
89dot		\.
90comma		\,
91hyphen		\-
92colon		\:
93slash		\/
94bcl		\{
95ecl		\}
96blcl		\[
97elcl		\]
98percent		\%
99semi		\;
100usec		{dot}{digit}{1,6}
101comment		\#.*
102ccomment	"/*"
103bracketstring	\<[^>]*\>
104quotedstring	\"[^"]*\"
105decstring	{digit}+
106hexpair		{hexdigit}{hexdigit}
107hexstring	0[xX]{hexdigit}+
108octetstring	{octet}({dot}{octet})+
109ipaddress	{ipv4addr}|{ipv6addr}
110ipv4addr	{digit}{1,3}({dot}{digit}{1,3}){0,3}
111ipv6addr	{hexdigit}{0,4}({colon}{hexdigit}{0,4}){2,7}(@{letter}{letter}+)?
112ipaddrmask	{slash}{digit}{1,3}
113ipaddrport	{blcl}{decstring}{elcl}
114keyword		{letter}{letter}+
115name		{letter}(({letter}|{digit}|{hyphen})*({letter}|{digit}))*
116hostname	{name}(({dot}{name})+{dot}?)?
117
118%s S_PL
119
120%%
121
122add		{ PREPROC; return(ADD); }
123delete		{ PREPROC; return(DELETE); }
124get		{ PREPROC; return(GET); }
125flush		{ PREPROC; return(FLUSH); }
126dump		{ PREPROC; return(DUMP); }
127
128	/* for management SPD */
129spdadd		{ PREPROC; return(SPDADD); }
130spddelete	{ PREPROC; return(SPDDELETE); }
131spddump		{ PREPROC; return(SPDDUMP); }
132spdflush	{ PREPROC; return(SPDFLUSH); }
133{hyphen}P	{ BEGIN S_PL; PREPROC; return(F_POLICY); }
134<S_PL>[a-zA-Z0-9:\.\-_/ \n\t][a-zA-Z0-9:\.\-_/ \n\t]* {
135		yymore();
136
137		/* count up for nl */
138		    {
139			char *p;
140			for (p = yytext; *p != NULL; p++)
141				if (*p == '\n')
142					lineno++;
143		    }
144
145		yylval.val.len = strlen(yytext);
146		yylval.val.buf = strdup(yytext);
147
148		return(PL_REQUESTS);
149}
150<S_PL>{semi}	{ PREPROC; BEGIN INITIAL; return(EOT); }
151
152	/* security protocols */
153ah		{ PREPROC; yylval.num = 0; return(PR_AH); }
154esp		{ PREPROC; yylval.num = 0; return(PR_ESP); }
155ah-old		{ PREPROC; yylval.num = 1; return(PR_AH); }
156esp-old		{ PREPROC; yylval.num = 1; return(PR_ESP); }
157ipcomp		{ PREPROC; yylval.num = 0; return(PR_IPCOMP); }
158
159	/* authentication alogorithm */
160{hyphen}A	{ PREPROC; return(F_AUTH); }
161hmac-md5	{ PREPROC; yylval.num = SADB_AALG_MD5HMAC; return(ALG_AUTH); }
162hmac-sha1	{ PREPROC; yylval.num = SADB_AALG_SHA1HMAC; return(ALG_AUTH); }
163keyed-md5	{ PREPROC; yylval.num = SADB_AALG_MD5; return(ALG_AUTH); }
164keyed-sha1	{ PREPROC; yylval.num = SADB_AALG_SHA; return(ALG_AUTH); }
165null		{ PREPROC; yylval.num = SADB_AALG_NULL; return(ALG_AUTH); }
166
167	/* encryption alogorithm */
168{hyphen}E	{ PREPROC; return(F_ENC); }
169des-cbc		{ PREPROC; yylval.num = SADB_EALG_DESCBC; return(ALG_ENC); }
1703des-cbc	{ PREPROC; yylval.num = SADB_EALG_3DESCBC; return(ALG_ENC); }
171simple		{ PREPROC; yylval.num = SADB_EALG_NULL; return(ALG_ENC); }
172blowfish-cbc	{ PREPROC; yylval.num = SADB_EALG_BLOWFISHCBC; return(ALG_ENC); }
173cast128-cbc	{ PREPROC; yylval.num = SADB_EALG_CAST128CBC; return(ALG_ENC); }
174rc5-cbc		{ PREPROC; yylval.num = SADB_EALG_RC5CBC; return(ALG_ENC); }
175des-deriv	{ PREPROC; yylval.num = SADB_EALG_DESCBC; return(ALG_ENC_DESDERIV); }
176des-32iv	{ PREPROC; yylval.num = SADB_EALG_DESCBC; return(ALG_ENC_DES32IV); }
177
178	/* compression algorithms */
179{hyphen}C	{ PREPROC; return(F_COMP); }
180oui		{ PREPROC; yylval.num = SADB_X_CALG_OUI; return(ALG_COMP); }
181deflate		{ PREPROC; yylval.num = SADB_X_CALG_DEFLATE; return(ALG_COMP); }
182lzs		{ PREPROC; yylval.num = SADB_X_CALG_LZS; return(ALG_COMP); }
183{hyphen}R	{ PREPROC; return(F_RAWCPI); }
184
185	/* extension */
186{hyphen}m	{ PREPROC; return(F_MODE); }
187transport	{ PREPROC; yylval.num = IPSEC_MODE_TRANSPORT; return(MODE); }
188tunnel		{ PREPROC; yylval.num = IPSEC_MODE_TUNNEL; return(MODE); }
189{hyphen}f	{ PREPROC; return(F_EXT); }
190random-pad	{ PREPROC; yylval.num = SADB_X_EXT_PRAND; return(EXTENSION); }
191seq-pad		{ PREPROC; yylval.num = SADB_X_EXT_PSEQ; return(EXTENSION); }
192zero-pad	{ PREPROC; yylval.num = SADB_X_EXT_PZERO; return(EXTENSION); }
193cyclic-seq	{ PREPROC; yylval.num = SADB_X_EXT_CYCSEQ; return(EXTENSION); }
194{hyphen}r	{ PREPROC; return(F_REPLAY); }
195{hyphen}lh	{ PREPROC; return(F_LIFETIME_HARD); }
196{hyphen}ls	{ PREPROC; return(F_LIFETIME_SOFT); }
197
198
199	/* upper layer protocols */
200icmp		{ PREPROC; yylval.num = IPPROTO_ICMP; return(UP_PROTO); }
201icmp6		{ PREPROC; yylval.num = IPPROTO_ICMPV6; return(UP_PROTO); }
202tcp		{ PREPROC; yylval.num = IPPROTO_TCP; return(UP_PROTO); }
203udp		{ PREPROC; yylval.num = IPPROTO_UDP; return(UP_PROTO); }
204
205	/* ... */
206any		{ PREPROC; return(ANY); }
207{ws}		{ PREPROC; }
208{nl}		{ lineno++; }
209{comment}
210{semi}		{ PREPROC; return(EOT); }
211
212	/* parameter */
213{decstring}	{
214			char *bp;
215
216			PREPROC;
217			yylval.num = strtol(yytext, &bp, 10);
218			return(DECSTRING);
219		}
220
221{ipv4addr}	{
222			/*
223			 * I can't supprt the type without dot,
224			 * because it's umbiguous against {decstring}.
225			 * e.g. 127
226			 */
227			PREPROC;
228
229			yylval.val.len = sizeof(struct sockaddr_in);
230			yylval.val.buf = strdup(yytext);
231
232			return(IP4_ADDRESS);
233		}
234
235{ipv6addr}	{
236#ifdef INET6
237			PREPROC;
238
239			yylval.val.len = sizeof(struct sockaddr_in6);
240			yylval.val.buf = strdup(yytext);
241
242			return(IP6_ADDRESS);
243#else
244			yyerror("IPv6 address not supported");
245#endif
246		}
247
248{ipaddrmask}	{
249			PREPROC;
250			yytext++;
251			yylval.num = atoi(yytext);
252			return(PREFIX);
253		}
254
255{ipaddrport}	{
256			char *p = yytext;
257			PREPROC;
258			while (*++p != ']') ;
259			*p = NULL;
260			yytext++;
261			yylval.num = atoi(yytext);
262			return(PORT);
263		}
264
265{blcl}any{elcl}	{
266			char *p = yytext;
267			PREPROC;
268			return(PORTANY);
269		}
270
271{hexstring}	{
272			int len = yyleng - 2; /* (str - "0x") */
273			PREPROC;
274			yylval.val.len = (len & 1) + (len / 2);
275			/* fixed string if length is odd. */
276			if (len & 1) {
277				yytext[1] = '0';
278				yylval.val.buf = strdup(yytext + 1);
279			} else
280				yylval.val.buf = strdup(yytext + 2);
281
282			return(HEXSTRING);
283		}
284
285{quotedstring}	{
286			char *p = yytext;
287			PREPROC;
288			while (*++p != '"') ;
289			*p = NULL;
290			yytext++;
291			yylval.val.len = yyleng - 2;
292			yylval.val.buf = strdup(yytext);
293
294			return(QUOTEDSTRING);
295		}
296
297.		{ yyerror("Syntax error"); }
298
299%%
300
301void
302yyerror(char *s)
303{
304	printf("line %d: %s at [%s]\n", lineno, s, yytext);
305}
306
307int
308parse(fp)
309	FILE **fp;
310{
311	yyin = *fp;
312
313	parse_init();
314
315	if (yyparse()) {
316		printf("parse failed, line %d.\n", lineno);
317		return(-1);
318	}
319
320	return(0);
321}
322
323