- Iteration seems to work nicely, thank you.

This commit is contained in:
ccremers 2006-07-27 11:55:24 +00:00
parent 4e085f0eb8
commit df1a56c780
5 changed files with 163 additions and 17 deletions

View File

@ -15,6 +15,7 @@
#include "warshall.h"
#include "hidelevel.h"
#include "debug.h"
#include "intruderknowledge.h"
/*
Simple sys pointer as a global. Yields cleaner code although it's against programming standards.
@ -323,6 +324,7 @@ levelTacDeclaration (Tac tc, int isVar)
Tac tscan;
Termlist typetl = NULL;
Term t;
int isAgent;
// tscan contains the type list (as is const x,z: Term or var y: Term,Ding)
tscan = tc->t2.tac;
@ -353,6 +355,9 @@ levelTacDeclaration (Tac tc, int isVar)
typetl = termlistAdd (typetl, t);
tscan = tscan->next;
}
/* check whether the type list contains the agent type */
isAgent = inTermlist (typetl, TERM_Agent);
/* parse all constants and vars, because a single declaration can contain multiple ones */
tscan = tc->t1.tac;
while (tscan != NULL)
@ -379,6 +384,10 @@ levelTacDeclaration (Tac tc, int isVar)
else if (level == 0)
{
sys->globalconstants = termlistAdd (sys->globalconstants, t);
if (isAgent)
{
sys->agentnames = termlistAdd (sys->agentnames, t);
}
}
tscan = tscan->next;
}
@ -1813,21 +1822,8 @@ preprocess (const System sys)
* compute hidelevels
*/
hidelevelCompute (sys);
if (switches.check)
{
/*
* display initial role knowledge
* Initial knowledge
*/
int showRK (Protocol p, Role r)
{
eprintf ("Role ");
termPrint (r->nameterm);
eprintf (" knows ");
termlistPrint (r->knows);
eprintf ("\n");
}
iterateRoles (sys, showRK);
}
initialIntruderKnowledge (sys);
}

140
src/intruderknowledge.c Normal file
View File

@ -0,0 +1,140 @@
/**
* Initial intruder knowledge computation.
*/
#include "intruderknowledge.h"
//! Add a (copy of) a term to the intruder knowledge
void
addSTerm (const System sys, Term t, Termlist fromlist, Termlist tolist)
{
Term t2;
t2 = termLocal (t, fromlist, tolist);
eprintf ("[ Adding ");
termPrint (t2);
eprintf (" to the initial intruder knowledge]\n");
}
//! Unfold the term for all possible options
void
addEnumTerm (const System sys, Term t, Term actor, Termlist todo,
Termlist fromlist, Termlist tolist)
{
if (todo == NULL)
{
addSTerm (sys, t, fromlist, tolist);
}
else
{
if (termSubTerm (t, todo->term))
{
// Occurs, we have to iterate
fromlist = termlistPrepend (fromlist, todo->term);
void iterateThis (Term to)
{
tolist = termlistPrepend (tolist, to);
addEnumTerm (sys, t, actor, todo->next, fromlist, tolist);
tolist = termlistDelTerm (tolist);
}
if (isTermEqual (todo->term, actor))
{
// Untrusted agents only
Termlist tl;
for (tl = sys->untrusted; tl != NULL; tl = tl->next)
{
iterateThis (tl->term);
}
}
else
{
// any agents
Termlist tl;
for (tl = sys->agentnames; tl != NULL; tl = tl->next)
{
iterateThis (tl->term);
}
}
fromlist = termlistDelTerm (fromlist);
}
else
{
// Simply proceed to next
addEnumTerm (sys, t, actor, todo->next, fromlist, tolist);
}
}
}
//! Does t contain any of sublist?
int
anySubTerm (Term t, Termlist sublist)
{
while (sublist != NULL)
{
if (termSubTerm (t, sublist->term))
{
return true;
}
sublist = sublist->next;
}
return false;
}
void
initialIntruderKnowledge (const System sys)
{
eprintf ("Computing initial intruder knowledge.\n\n");
eprintf ("Agent names : ");
termlistPrint (sys->agentnames);
eprintf ("\n");
eprintf ("Untrusted agents : ");
termlistPrint (sys->untrusted);
eprintf ("\n");
/*
* display initial role knowledge
*/
int deriveFromRole (Protocol p, Role r)
{
void addListKnowledge (Termlist tl, Term actor)
{
void addTermKnowledge (Term t)
{
if (anySubTerm (t, p->rolenames))
{
// Has rolename subterms. We have to enumerate those.
addEnumTerm (sys, t, actor, p->rolenames, NULL, NULL);
}
else
{
// No actor subterm. Simply add.
addSTerm (sys, t, NULL, NULL);
}
}
while (tl != NULL)
{
addTermKnowledge (tl->term);
tl = tl->next;
}
}
eprintf ("Role ");
termPrint (r->nameterm);
eprintf (" knows ");
termlistPrint (r->knows);
eprintf ("\n");
addListKnowledge (r->knows, r->nameterm);
return true;
}
iterateRoles (sys, deriveFromRole);
}

8
src/intruderknowledge.h Normal file
View File

@ -0,0 +1,8 @@
#ifndef INTRUDERKNOWLEDGE
#define INTRUDERKNOWLEDGE
#include "system.h"
void initialIntruderKnowledge (const System sys);
#endif

View File

@ -59,6 +59,7 @@ systemInit ()
sys->protocols = NULL;
sys->locals = NULL;
sys->variables = NULL;
sys->agentnames = NULL;
sys->untrusted = NULL;
sys->globalconstants = NULL;
sys->hidden = NULL;

View File

@ -128,6 +128,7 @@ struct system
Protocol protocols; //!< List of protocols in the system
Termlist locals; //!< List of local terms
Termlist variables; //!< List of all variables
Termlist agentnames; //!< List of all agent names (trusted and untrusted)
Termlist untrusted; //!< List of untrusted agent names
Termlist globalconstants; //!< List of global constants
Hiddenterm hidden; //!< List of hiddenterm constructs for Hidelevel lemma