1/*	$FreeBSD: src/usr.sbin/setkey/token.l,v 1.5 2001/06/11 12:39:28 ume Exp $	*/
2/*	$KAME: token.l,v 1.21 2001/05/18 05:35:01 sakane Exp $	*/
3
4/*
5 * Copyright (C) 1995, 1996, 1997, 1998, and 1999 WIDE Project.
6 * All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 * 1. Redistributions of source code must retain the above copyright
12 *    notice, this list of conditions and the following disclaimer.
13 * 2. Redistributions in binary form must reproduce the above copyright
14 *    notice, this list of conditions and the following disclaimer in the
15 *    documentation and/or other materials provided with the distribution.
16 * 3. Neither the name of the project nor the names of its contributors
17 *    may be used to endorse or promote products derived from this software
18 *    without specific prior written permission.
19 *
20 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23 * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30 * SUCH DAMAGE.
31 */
32
33%{
34#include <sys/types.h>
35#include <sys/param.h>
36#include <sys/socket.h>
37#include <net/pfkeyv2.h>
38#include <netinet/in.h>
39#include <netinet/ipsec.h>
40
41#include <stdlib.h>
42#include <limits.h>
43#include <string.h>
44#include <unistd.h>
45#include <errno.h>
46#include "libipsec.h"
47#include "vchar.h"
48#include "parse.h"
49
50#define DECHO \
51	if (f_debug) {printf("<%d>", yy_start); ECHO ; printf("\n"); }
52
53#define CMDARG \
54{ \
55	char *__buf__ = strdup(yytext), *__p__; \
56	for (__p__ = __buf__; *__p__; __p__++) \
57		if (*__p__ == '\n' || *__p__ == '\t') \
58			*__p__ = ' '; \
59	strcat(cmdarg, __buf__); \
60	free(__buf__); \
61}
62
63#define PREPROC	DECHO CMDARG
64
65int lineno = 1;
66char cmdarg[8192]; /* XXX: BUFSIZ is the better ? */
67
68extern u_char m_buf[BUFSIZ];
69extern u_int m_len;
70extern int f_debug;
71
72int yylex __P((void));
73void yyfatal __P((const char *s));
74void yyerror __P((const 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	[a-fA-F0-9:]([a-fA-F0-9:\.]*|[a-fA-F0-9:\.]*%[a-zA-Z0-9]*)
110ipaddrmask	{slash}{digit}{1,3}
111ipaddrport	{blcl}{decstring}{elcl}
112keyword		{letter}{letter}+
113name		{letter}(({letter}|{digit}|{hyphen})*({letter}|{digit}))*
114hostname	{name}(({dot}{name})+{dot}?)?
115
116%s S_PL
117
118%%
119
120add		{ PREPROC; return(ADD); }
121delete		{ PREPROC; return(DELETE); }
122deleteall	{ PREPROC; return(DELETEALL); }
123get		{ PREPROC; return(GET); }
124flush		{ PREPROC; return(FLUSH); }
125dump		{ PREPROC; return(DUMP); }
126
127	/* for management SPD */
128spdadd		{ PREPROC; return(SPDADD); }
129spddelete	{ PREPROC; return(SPDDELETE); }
130spddump		{ PREPROC; return(SPDDUMP); }
131spdflush	{ PREPROC; return(SPDFLUSH); }
132{hyphen}P	{ BEGIN S_PL; PREPROC; return(F_POLICY); }
133<S_PL>[a-zA-Z0-9:\.\-_/ \n\t][a-zA-Z0-9:\.\-_/ \n\t]* {
134		yymore();
135
136		/* count up for nl */
137		    {
138			char *p;
139			for (p = yytext; *p; p++)
140				if (*p == '\n')
141					lineno++;
142		    }
143
144		yylval.val.len = strlen(yytext);
145		yylval.val.buf = strdup(yytext);
146
147		return(PL_REQUESTS);
148}
149<S_PL>{semi}	{ PREPROC; BEGIN INITIAL; return(EOT); }
150
151	/* security protocols */
152ah		{ PREPROC; yylval.num = 0; return(PR_AH); }
153esp		{ PREPROC; yylval.num = 0; return(PR_ESP); }
154ah-old		{ PREPROC; yylval.num = 1; return(PR_AH); }
155esp-old		{ PREPROC; yylval.num = 1; return(PR_ESP); }
156ipcomp		{ PREPROC; yylval.num = 0; return(PR_IPCOMP); }
157
158	/* authentication alogorithm */
159{hyphen}A	{ PREPROC; return(F_AUTH); }
160hmac-md5	{ PREPROC; yylval.num = SADB_AALG_MD5HMAC; return(ALG_AUTH); }
161hmac-sha1	{ PREPROC; yylval.num = SADB_AALG_SHA1HMAC; return(ALG_AUTH); }
162keyed-md5	{ PREPROC; yylval.num = SADB_X_AALG_MD5; return(ALG_AUTH); }
163keyed-sha1	{ PREPROC; yylval.num = SADB_X_AALG_SHA; return(ALG_AUTH); }
164hmac-sha2-256	{ PREPROC; yylval.num = SADB_X_AALG_SHA2_256; return(ALG_AUTH); }
165hmac-sha2-384	{ PREPROC; yylval.num = SADB_X_AALG_SHA2_384; return(ALG_AUTH); }
166hmac-sha2-512	{ PREPROC; yylval.num = SADB_X_AALG_SHA2_512; return(ALG_AUTH); }
167null		{ PREPROC; yylval.num = SADB_X_AALG_NULL; return(ALG_AUTH); }
168
169	/* encryption alogorithm */
170{hyphen}E	{ PREPROC; return(F_ENC); }
171des-cbc		{ PREPROC; yylval.num = SADB_EALG_DESCBC; return(ALG_ENC); }
1723des-cbc	{ PREPROC; yylval.num = SADB_EALG_3DESCBC; return(ALG_ENC); }
173simple		{ PREPROC; yylval.num = SADB_EALG_NULL; return(ALG_ENC); }
174blowfish-cbc	{ PREPROC; yylval.num = SADB_X_EALG_BLOWFISHCBC; return(ALG_ENC); }
175cast128-cbc	{ PREPROC; yylval.num = SADB_X_EALG_CAST128CBC; return(ALG_ENC); }
176des-deriv	{ PREPROC; yylval.num = SADB_EALG_DESCBC; return(ALG_ENC_DESDERIV); }
177des-32iv	{ PREPROC; yylval.num = SADB_EALG_DESCBC; return(ALG_ENC_DES32IV); }
178rijndael-cbc	{ PREPROC; yylval.num = SADB_X_EALG_RIJNDAELCBC; return(ALG_ENC); }
179
180	/* compression algorithms */
181{hyphen}C	{ PREPROC; return(F_COMP); }
182oui		{ PREPROC; yylval.num = SADB_X_CALG_OUI; return(ALG_COMP); }
183deflate		{ PREPROC; yylval.num = SADB_X_CALG_DEFLATE; return(ALG_COMP); }
184lzs		{ PREPROC; yylval.num = SADB_X_CALG_LZS; return(ALG_COMP); }
185{hyphen}R	{ PREPROC; return(F_RAWCPI); }
186
187	/* extension */
188{hyphen}m	{ PREPROC; return(F_MODE); }
189transport	{ PREPROC; yylval.num = IPSEC_MODE_TRANSPORT; return(MODE); }
190tunnel		{ PREPROC; yylval.num = IPSEC_MODE_TUNNEL; return(MODE); }
191{hyphen}u	{ PREPROC; return(F_REQID); }
192{hyphen}f	{ PREPROC; return(F_EXT); }
193random-pad	{ PREPROC; yylval.num = SADB_X_EXT_PRAND; return(EXTENSION); }
194seq-pad		{ PREPROC; yylval.num = SADB_X_EXT_PSEQ; return(EXTENSION); }
195zero-pad	{ PREPROC; yylval.num = SADB_X_EXT_PZERO; return(EXTENSION); }
196nocyclic-seq	{ PREPROC; return(NOCYCLICSEQ); }
197{hyphen}r	{ PREPROC; return(F_REPLAY); }
198{hyphen}lh	{ PREPROC; return(F_LIFETIME_HARD); }
199{hyphen}ls	{ PREPROC; return(F_LIFETIME_SOFT); }
200
201	/* ... */
202any		{ PREPROC; return(ANY); }
203{ws}		{ PREPROC; }
204{nl}		{ lineno++; }
205{comment}
206{semi}		{ PREPROC; return(EOT); }
207
208	/* parameter */
209{decstring}	{
210			char *bp;
211
212			PREPROC;
213			yylval.num = strtoul(yytext, &bp, 10);
214			return(DECSTRING);
215		}
216
217{ipaddress}	{
218			PREPROC;
219
220			yylval.val.len = yyleng;
221			yylval.val.buf = strdup(yytext);
222
223			return(ADDRESS);
224		}
225
226{ipaddrmask}	{
227			PREPROC;
228			yytext++;
229			yylval.num = atoi(yytext);
230			return(PREFIX);
231		}
232
233{ipaddrport}	{
234			char *p = yytext;
235			PREPROC;
236			while (*++p != ']') ;
237			*p = 0;
238			yytext++;
239			yylval.num = atoi(yytext);
240			return(PORT);
241		}
242
243{blcl}any{elcl}	{
244			PREPROC;
245			return(PORTANY);
246		}
247
248{hexstring}	{
249			int len = yyleng - 2; /* (str - "0x") */
250			PREPROC;
251			yylval.val.len = (len & 1) + (len / 2);
252			/* fixed string if length is odd. */
253			if (len & 1) {
254				yytext[1] = '0';
255				yylval.val.buf = strdup(yytext + 1);
256			} else
257				yylval.val.buf = strdup(yytext + 2);
258
259			return(HEXSTRING);
260		}
261
262{quotedstring}	{
263			char *p = yytext;
264			PREPROC;
265			while (*++p != '"') ;
266			*p = 0;
267			yytext++;
268			yylval.val.len = yyleng - 2;
269			yylval.val.buf = strdup(yytext);
270
271			return(QUOTEDSTRING);
272		}
273
274[a-z0-9.\-]*	{
275			yylval.val.len = yyleng;
276			yylval.val.buf = strdup(yytext);
277			return(STRING);
278		}
279
280.		{
281			yyfatal("Syntax error");
282			/*NOTREACHED*/
283		}
284
285%%
286
287void
288yyfatal(s)
289	const char *s;
290{
291	yyerror(s);
292	exit(1);
293}
294
295void
296yyerror(s)
297	const char *s;
298{
299	printf("line %d: %s at [%s]\n", lineno, s, yytext);
300}
301
302int
303parse(fp)
304	FILE **fp;
305{
306	yyin = *fp;
307
308	parse_init();
309
310	if (yyparse()) {
311		printf("parse failed, line %d.\n", lineno);
312		return(-1);
313	}
314
315	return(0);
316}
317