2007-06-11 13:01:04 +01:00
|
|
|
/*
|
|
|
|
* Scyther : An automatic verifier for security protocols.
|
|
|
|
* Copyright (C) 2007 Cas Cremers
|
|
|
|
*
|
|
|
|
* This program is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU General Public License
|
|
|
|
* as published by the Free Software Foundation; either version 2
|
|
|
|
* of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This program is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
* GNU General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU General Public License
|
|
|
|
* along with this program; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
|
|
*/
|
|
|
|
|
2004-04-23 11:58:43 +01:00
|
|
|
%{
|
|
|
|
#include "pheading.h"
|
|
|
|
#include "tac.h"
|
2007-01-06 14:45:29 +00:00
|
|
|
#include "error.h"
|
2004-04-23 11:58:43 +01:00
|
|
|
|
|
|
|
struct tacnode* spdltac;
|
|
|
|
|
|
|
|
int yyerror(char *s);
|
|
|
|
int yylex(void);
|
|
|
|
|
|
|
|
%}
|
|
|
|
|
|
|
|
%union{
|
|
|
|
char* str;
|
|
|
|
struct tacnode* tac;
|
|
|
|
Symbol symb;
|
2006-01-02 16:05:53 +00:00
|
|
|
int value;
|
2004-04-23 11:58:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
%token <symb> ID
|
|
|
|
%token PROTOCOL
|
|
|
|
%token ROLE
|
|
|
|
%token READT
|
2008-08-20 15:15:27 +01:00
|
|
|
%token RECVT
|
2004-04-23 11:58:43 +01:00
|
|
|
%token SENDT
|
|
|
|
%token CLAIMT
|
|
|
|
%token VAR
|
|
|
|
%token CONST
|
2010-01-05 12:45:19 +00:00
|
|
|
%token FRESH
|
2004-04-23 11:58:43 +01:00
|
|
|
%token RUN
|
|
|
|
%token SECRET
|
|
|
|
%token COMPROMISED
|
|
|
|
%token INVERSEKEYS
|
|
|
|
%token UNTRUSTED
|
|
|
|
%token USERTYPE
|
2006-01-02 16:05:53 +00:00
|
|
|
%token SINGULAR
|
2006-01-09 09:38:17 +00:00
|
|
|
%token FUNCTION
|
|
|
|
%token HASHFUNCTION
|
|
|
|
%token KNOWS
|
|
|
|
%token TRUSTED
|
2004-04-23 11:58:43 +01:00
|
|
|
|
|
|
|
%type <tac> spdlcomplete
|
|
|
|
%type <tac> spdlrep
|
|
|
|
%type <tac> spdl
|
|
|
|
%type <tac> roles
|
|
|
|
%type <tac> role
|
|
|
|
%type <tac> roledef
|
|
|
|
%type <tac> event
|
|
|
|
%type <tac> declaration
|
|
|
|
%type <tac> secretpref
|
|
|
|
%type <tac> typeinfo1
|
|
|
|
%type <tac> typeinfoN
|
|
|
|
%type <tac> term
|
2006-05-16 16:00:21 +01:00
|
|
|
%type <tac> basicterm
|
2004-04-23 11:58:43 +01:00
|
|
|
%type <tac> termlist
|
2006-05-16 16:00:21 +01:00
|
|
|
%type <tac> basictermlist
|
2004-04-23 11:58:43 +01:00
|
|
|
%type <tac> key
|
|
|
|
%type <tac> roleref
|
2006-07-27 11:44:12 +01:00
|
|
|
%type <tac> knowsdecl
|
2004-04-23 11:58:43 +01:00
|
|
|
|
2006-01-02 16:05:53 +00:00
|
|
|
%type <value> singular
|
|
|
|
|
2004-04-23 11:58:43 +01:00
|
|
|
%type <symb> label
|
2005-12-28 11:50:17 +00:00
|
|
|
%type <symb> optlabel
|
2004-04-23 11:58:43 +01:00
|
|
|
|
|
|
|
%start spdlcomplete
|
|
|
|
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
|
|
|
spdlcomplete : spdlrep
|
|
|
|
{ spdltac = $1; }
|
|
|
|
;
|
|
|
|
|
|
|
|
spdlrep : /* empty */
|
|
|
|
{ $$ = NULL; }
|
|
|
|
| spdl spdlrep
|
|
|
|
{ $$ = tacCat($1,$2); }
|
|
|
|
;
|
|
|
|
|
|
|
|
spdl : UNTRUSTED termlist ';'
|
|
|
|
{
|
|
|
|
Tac t = tacCreate(TAC_UNTRUSTED);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.tac = $2;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
| RUN roleref '(' termlist ')' ';'
|
|
|
|
{
|
|
|
|
Tac t = tacCreate(TAC_RUN);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.tac = $2;
|
|
|
|
t->t2.tac = $4;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
| PROTOCOL ID '(' termlist ')' '{' roles '}' optclosing
|
|
|
|
{
|
|
|
|
Tac t = tacCreate(TAC_PROTOCOL);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.sym = $2;
|
|
|
|
t->t2.tac = $7;
|
|
|
|
t->t3.tac = $4;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
| USERTYPE termlist ';'
|
|
|
|
{
|
|
|
|
Tac t = tacCreate(TAC_USERTYPE);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.tac = $2;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
| declaration
|
|
|
|
{
|
|
|
|
$$ = $1;
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
roles : /* empty */
|
|
|
|
{ $$ = NULL; }
|
|
|
|
| role roles
|
|
|
|
{ $$ = tacCat($1,$2); }
|
|
|
|
| declaration roles
|
|
|
|
{ $$ = tacCat($1,$2); }
|
|
|
|
;
|
|
|
|
|
2006-01-02 16:05:53 +00:00
|
|
|
role : singular ROLE ID '{' roledef '}' optclosing
|
2004-04-23 11:58:43 +01:00
|
|
|
{
|
2006-01-02 16:05:53 +00:00
|
|
|
// TODO process singular (0/1)
|
2004-04-23 11:58:43 +01:00
|
|
|
Tac t = tacCreate(TAC_ROLE);
|
2006-01-02 16:05:53 +00:00
|
|
|
t->t1.sym = $3;
|
|
|
|
t->t2.tac = $5;
|
|
|
|
t->t3.value = $1;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2006-01-02 16:05:53 +00:00
|
|
|
singular : /* empty */
|
|
|
|
{ $$ = 0; }
|
|
|
|
| SINGULAR
|
|
|
|
{ $$ = 1; }
|
|
|
|
;
|
|
|
|
|
2004-04-23 11:58:43 +01:00
|
|
|
optclosing : /* empty */
|
|
|
|
{ }
|
|
|
|
| ';'
|
|
|
|
{ }
|
|
|
|
;
|
|
|
|
|
|
|
|
roledef : /* empty */
|
|
|
|
{ $$ = NULL; }
|
|
|
|
| event roledef
|
|
|
|
{ $$ = tacCat($1,$2); }
|
|
|
|
| declaration roledef
|
|
|
|
{ $$ = tacCat($1,$2); }
|
2006-07-27 11:44:12 +01:00
|
|
|
| knowsdecl roledef
|
|
|
|
{ $$ = tacCat($1,$2); }
|
2004-04-23 11:58:43 +01:00
|
|
|
;
|
|
|
|
|
2008-08-20 15:15:27 +01:00
|
|
|
/*
|
|
|
|
* For now, recv and read are synonyms, but have their own branch below. That's ugly duplication. Ultimately we want to deprecate read,
|
|
|
|
* but that will take a while I guess.
|
|
|
|
*/
|
2004-04-23 11:58:43 +01:00
|
|
|
event : READT label '(' termlist ')' ';'
|
|
|
|
{ Tac t = tacCreate(TAC_READ);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.sym = $2;
|
2004-04-23 11:58:43 +01:00
|
|
|
/* TODO test here: tac2 should have at least 3 elements */
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t2.tac = $4;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
2008-08-20 15:15:27 +01:00
|
|
|
| RECVT label '(' termlist ')' ';'
|
|
|
|
{ Tac t = tacCreate(TAC_READ);
|
|
|
|
t->t1.sym = $2;
|
|
|
|
/* TODO test here: tac2 should have at least 3 elements */
|
|
|
|
t->t2.tac = $4;
|
|
|
|
$$ = t;
|
|
|
|
}
|
2004-04-23 11:58:43 +01:00
|
|
|
| SENDT label '(' termlist ')' ';'
|
|
|
|
{ Tac t = tacCreate(TAC_SEND);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.sym = $2;
|
2004-04-23 11:58:43 +01:00
|
|
|
/* TODO test here: tac2 should have at least 3 elements */
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t2.tac = $4;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
2005-12-28 11:50:17 +00:00
|
|
|
| CLAIMT optlabel '(' termlist ')' ';'
|
2004-04-23 11:58:43 +01:00
|
|
|
/* TODO maybe claims should be in the syntax */
|
|
|
|
{ Tac t = tacCreate(TAC_CLAIM);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.sym = $2;
|
|
|
|
t->t2.tac = $4;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
roleref : ID '.' ID
|
|
|
|
{ Tac t = tacCreate(TAC_ROLEREF);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.sym = $1;
|
|
|
|
t->t2.sym = $3;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2006-07-27 11:44:12 +01:00
|
|
|
knowsdecl : KNOWS termlist ';'
|
|
|
|
{ Tac t = tacCreate(TAC_KNOWS);
|
|
|
|
t->t1.tac = $2;
|
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2006-05-16 16:00:21 +01:00
|
|
|
declaration : secretpref CONST basictermlist typeinfo1 ';'
|
2004-04-23 11:58:43 +01:00
|
|
|
{ Tac t = tacCreate(TAC_CONST);
|
2010-01-05 12:45:19 +00:00
|
|
|
t->t1.tac = $3; // names
|
|
|
|
t->t2.tac = $4; // type
|
|
|
|
t->t3.tac = $1; // secret?
|
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
| FRESH basictermlist typeinfo1 ';'
|
|
|
|
{ Tac t = tacCreate(TAC_FRESH);
|
|
|
|
t->t1.tac = $2; // names
|
|
|
|
t->t2.tac = $3; // type
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
2006-05-16 16:00:21 +01:00
|
|
|
| secretpref VAR basictermlist typeinfoN ';'
|
2004-04-23 11:58:43 +01:00
|
|
|
{ Tac t = tacCreate(TAC_VAR);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.tac = $3;
|
|
|
|
t->t2.tac = $4;
|
2010-01-05 12:45:19 +00:00
|
|
|
t->t3.tac = $1; // obsolete: should not even occur at the global level
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
2006-05-16 16:00:21 +01:00
|
|
|
| SECRET basictermlist typeinfo1 ';'
|
2004-04-23 11:58:43 +01:00
|
|
|
{ Tac t = tacCreate(TAC_SECRET);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.tac = $2;
|
|
|
|
t->t2.tac = $3;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
| INVERSEKEYS '(' term ',' term ')' ';'
|
|
|
|
{ Tac t = tacCreate(TAC_INVERSEKEYS);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.tac = $3;
|
|
|
|
t->t2.tac = $5;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
| COMPROMISED termlist ';'
|
|
|
|
{ Tac t = tacCreate(TAC_COMPROMISED);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.tac= $2;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
2009-04-28 15:28:16 +01:00
|
|
|
| HASHFUNCTION basictermlist ';'
|
|
|
|
{ Tac t = tacCreate(TAC_HASHFUNCTION);
|
|
|
|
t->t1.tac = $2;
|
|
|
|
t->t2.tac = tacCreate(TAC_UNDEF);
|
|
|
|
t->t3.tac = NULL; // Not secret: public
|
|
|
|
$$ = t;
|
|
|
|
}
|
2004-04-23 11:58:43 +01:00
|
|
|
;
|
|
|
|
|
|
|
|
secretpref : /* empty */
|
|
|
|
{
|
|
|
|
$$ = NULL;
|
|
|
|
}
|
|
|
|
| SECRET
|
|
|
|
{
|
|
|
|
Tac t = tacCreate(TAC_SECRET);
|
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
typeinfo1 : /* empty */
|
|
|
|
{
|
|
|
|
Tac t = tacCreate(TAC_UNDEF);
|
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
| ':' ID
|
|
|
|
{ Tac t = tacCreate(TAC_STRING);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.sym = $2;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
typeinfoN : /* empty */
|
|
|
|
{
|
|
|
|
Tac t = tacCreate(TAC_UNDEF);
|
|
|
|
$$ = t;
|
|
|
|
}
|
2006-05-16 16:00:21 +01:00
|
|
|
| ':' basictermlist
|
2004-04-23 11:58:43 +01:00
|
|
|
{
|
|
|
|
$$ = $2;
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
2005-04-29 14:25:43 +01:00
|
|
|
label : '_' ID
|
2004-04-23 11:58:43 +01:00
|
|
|
{ $$ = $2; }
|
|
|
|
;
|
|
|
|
|
2005-12-28 11:50:17 +00:00
|
|
|
optlabel : /* empty */
|
|
|
|
{ $$ = NULL; }
|
|
|
|
| label
|
|
|
|
{ }
|
|
|
|
;
|
|
|
|
|
|
|
|
|
2006-05-16 16:00:21 +01:00
|
|
|
basicterm : ID
|
2004-04-23 11:58:43 +01:00
|
|
|
{
|
|
|
|
Tac t = tacCreate(TAC_STRING);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.sym = $1;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = t;
|
|
|
|
}
|
2006-05-16 16:00:21 +01:00
|
|
|
;
|
|
|
|
|
|
|
|
term : basicterm
|
|
|
|
{ }
|
2004-04-23 11:58:43 +01:00
|
|
|
| ID '(' termlist ')'
|
|
|
|
{
|
|
|
|
Tac t = tacCreate(TAC_STRING);
|
2004-05-26 09:26:40 +01:00
|
|
|
t->t1.sym = $1;
|
2004-04-23 11:58:43 +01:00
|
|
|
$$ = tacJoin(TAC_ENCRYPT,tacTuple($3),t,NULL);
|
|
|
|
}
|
|
|
|
| '{' termlist '}' key
|
|
|
|
{
|
|
|
|
$$ = tacJoin(TAC_ENCRYPT,tacTuple($2),$4,NULL);
|
|
|
|
}
|
|
|
|
| '(' termlist ')'
|
|
|
|
{
|
|
|
|
$$ = tacTuple($2);
|
|
|
|
}
|
|
|
|
;
|
|
|
|
|
|
|
|
termlist : term
|
|
|
|
{ }
|
|
|
|
| term ',' termlist
|
|
|
|
{ $$ = tacCat($1,$3); }
|
|
|
|
;
|
|
|
|
|
2006-05-16 16:00:21 +01:00
|
|
|
basictermlist : basicterm
|
|
|
|
{ }
|
|
|
|
| basicterm ',' basictermlist
|
|
|
|
{ $$ = tacCat($1,$3); }
|
|
|
|
;
|
|
|
|
|
2004-04-23 11:58:43 +01:00
|
|
|
key : term
|
|
|
|
{ }
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
%%
|
|
|
|
|
2006-01-09 09:38:17 +00:00
|
|
|
//! error handler routing
|
2004-04-23 11:58:43 +01:00
|
|
|
int yyerror(char *s)
|
|
|
|
{
|
2006-01-09 09:38:17 +00:00
|
|
|
extern int yylineno; //!< defined and maintained in lex.c
|
|
|
|
extern char *yytext; //!< defined and maintained in lex.c
|
2004-04-23 11:58:43 +01:00
|
|
|
|
2007-02-01 12:18:38 +00:00
|
|
|
error ("[%i] %s at symbol '%s'.\n", yylineno, s, yytext);
|
2007-01-06 14:45:29 +00:00
|
|
|
return 0;
|
2004-04-23 11:58:43 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|