- Implemented better matching.

- Pruning for untrusted agent lists in the claim run as well.
- Sloppy M_0 implementation; needs to be fixed.
This commit is contained in:
ccremers 2004-08-15 16:44:54 +00:00
parent c3d5123ab0
commit ca2eeb7235
3 changed files with 119 additions and 47 deletions

View File

@ -10,6 +10,7 @@
#include "termlist.h" #include "termlist.h"
#include "role.h" #include "role.h"
#include "system.h" #include "system.h"
#include "knowledge.h"
#include "compiler.h" #include "compiler.h"
#include "states.h" #include "states.h"
#include "mgu.h" #include "mgu.h"
@ -22,6 +23,7 @@
extern Term CLAIM_Secret; extern Term CLAIM_Secret;
extern Term CLAIM_Nisynch; extern Term CLAIM_Nisynch;
extern Term CLAIM_Niagree; extern Term CLAIM_Niagree;
extern Term TERM_Agent;
static System sys; static System sys;
Protocol INTRUDER; // Pointers, to be set by the Init Protocol INTRUDER; // Pointers, to be set by the Init
@ -31,6 +33,7 @@ Role I_SPLIT;
Role I_TUPLE; Role I_TUPLE;
Role I_ENCRYPT; Role I_ENCRYPT;
Role I_DECRYPT; Role I_DECRYPT;
Role I_M0;
static int indentDepth; static int indentDepth;
@ -66,6 +69,7 @@ void
arachneInit (const System mysys) arachneInit (const System mysys)
{ {
Roledef rd = NULL; Roledef rd = NULL;
Termlist tl, know0;
void add_event (int event, Term message) void add_event (int event, Term message)
{ {
@ -102,6 +106,15 @@ arachneInit (const System mysys)
add_event (READ, NULL); add_event (READ, NULL);
I_GOAL = add_role (" I_GOAL "); I_GOAL = add_role (" I_GOAL ");
know0 = knowledgeSet (sys->know);
tl = know0;
while (tl != NULL)
{
add_event (SEND, tl->term);
I_M0 = add_role (" I_M0 ");
tl = tl->next;
}
termlistDelete (know0);
return; return;
} }
@ -267,10 +280,6 @@ create_intruder_goal (Term t)
int int
add_intruder_goal_iterate (Goal goal) add_intruder_goal_iterate (Goal goal)
{ {
// [x][todo][cc] remove debug you know the drill
//!@debug Remove this
return 1;
int flag; int flag;
int run; int run;
@ -715,7 +724,9 @@ bind_goal (const Goal goal)
int int
prune () prune ()
{ {
if (indentDepth > 10) Termlist tl;
if (indentDepth > 30)
{ {
// Hardcoded limit on iterations // Hardcoded limit on iterations
#ifdef DEBUG #ifdef DEBUG
@ -727,7 +738,7 @@ prune ()
#endif #endif
return 1; return 1;
} }
if (sys->maxruns > 5) if (sys->maxruns > 10)
{ {
// Hardcoded limit on runs // Hardcoded limit on runs
#ifdef DEBUG #ifdef DEBUG
@ -739,6 +750,50 @@ prune ()
#endif #endif
return 1; return 1;
} }
// Check if all agents are valid
tl = sys->runs[0].agents;
while (tl != NULL)
{
Term agent;
agent = deVar (tl->term);
if (!realTermLeaf (agent))
{
#ifdef DEBUG
if (DEBUGL (3))
{
indentPrint ();
eprintf ("Pruned because agent cannot be compound term.\n");
}
#endif
return 1;
}
if (!inTermlist (agent->stype, TERM_Agent))
{
#ifdef DEBUG
if (DEBUGL (3))
{
indentPrint ();
eprintf ("Pruned because agent must contain agent type.\n");
}
#endif
return 1;
}
if (inTermlist (sys->untrusted, agent))
{
#ifdef DEBUG
if (DEBUGL (3))
{
indentPrint ();
eprintf ("Pruned because agents must be untrusted.\n");
}
#endif
return 1;
}
tl = tl->next;
}
return 0; return 0;
} }
@ -889,9 +944,15 @@ arachne ()
cl = sys->claimlist; cl = sys->claimlist;
while (cl != NULL) while (cl != NULL)
{ {
/**
* Check each claim
*/
Protocol p; Protocol p;
Role r; Role r;
if (sys->switchClaimToCheck == NULL
|| sys->switchClaimToCheck == cl->type)
{
explanation = NULL; explanation = NULL;
e_run = INVALID; e_run = INVALID;
e_term1 = NULL; e_term1 = NULL;
@ -920,7 +981,8 @@ arachne ()
/** /**
* Add specific goal info * Add specific goal info
*/ */
add_claim_specifics (cl, roledef_shift (sys->runs[0].start, cl->ev)); add_claim_specifics (cl,
roledef_shift (sys->runs[0].start, cl->ev));
#ifdef DEBUG #ifdef DEBUG
if (DEBUGL (5)) if (DEBUGL (5))
@ -939,7 +1001,7 @@ arachne ()
{ {
roleInstanceDestroy (sys); roleInstanceDestroy (sys);
} }
}
// next // next
cl = cl->next; cl = cl->next;
} }

View File

@ -62,6 +62,8 @@ System sys;
extern struct tacnode *spdltac; extern struct tacnode *spdltac;
extern Term TERM_Claim; extern Term TERM_Claim;
extern int mgu_match;
void scanner_cleanup (void); void scanner_cleanup (void);
void strings_cleanup (void); void strings_cleanup (void);
int yyparse (void); int yyparse (void);
@ -486,6 +488,7 @@ main (int argc, char **argv)
sys->traverse = switch_traversal_method->ival[0]; sys->traverse = switch_traversal_method->ival[0];
sys->match = switch_match_method->ival[0]; sys->match = switch_match_method->ival[0];
mgu_match = sys->match;
sys->prune = switch_pruning_method->ival[0]; sys->prune = switch_pruning_method->ival[0];
if (switch_progress_bar->count > 0) if (switch_progress_bar->count > 0)
/* enable progress display */ /* enable progress display */

View File

@ -15,7 +15,13 @@
*/ */
//! Global constant. If true, typed checking //! Global constant. If true, typed checking
int welltyped = 1; /**
* Analoguous to sys->match
* 0 typed
* 1 basic typeflaws
* 2 all typeflaws
*/
int mgu_match = 0;
void void
showSubst (Term t) showSubst (Term t)
@ -50,7 +56,7 @@ showSubst (Term t)
__inline__ int __inline__ int
goodsubst (Term tvar, Term tsubst) goodsubst (Term tvar, Term tsubst)
{ {
if (tvar->stype == NULL || (!welltyped)) if (tvar->stype == NULL || (mgu_match == 2))
{ {
return 1; return 1;
} }
@ -67,7 +73,8 @@ goodsubst (Term tvar, Term tsubst)
else else
{ {
// It's a leaf, but what type? // It's a leaf, but what type?
if (termlistContained (tvar->stype, tsubst->stype)) if (mgu_match == 1
|| termlistContained (tvar->stype, tsubst->stype))
{ {
return 1; return 1;
} }