- Further refactoring.
- Some cleanup.
This commit is contained in:
parent
a5acc4984a
commit
e6505a72a3
114
src/arachne.c
114
src/arachne.c
@ -235,32 +235,6 @@ binding_indent_print (const Binding b, const int flag)
|
|||||||
eprintf ("\n");
|
eprintf ("\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Determine whether a term is a functor
|
|
||||||
int
|
|
||||||
isTermFunctionName (Term t)
|
|
||||||
{
|
|
||||||
t = deVar (t);
|
|
||||||
if (t != NULL && isTermLeaf (t) && t->stype != NULL
|
|
||||||
&& inTermlist (t->stype, TERM_Function))
|
|
||||||
return 1;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Determine whether a term is a function application. Returns the function term.
|
|
||||||
Term
|
|
||||||
getTermFunction (Term t)
|
|
||||||
{
|
|
||||||
t = deVar (t);
|
|
||||||
if (t != NULL)
|
|
||||||
{
|
|
||||||
if (realTermEncrypt (t) && isTermFunctionName (TermKey (t)))
|
|
||||||
{
|
|
||||||
return TermKey (t);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Keylevel tester: can this term ever be sent at this keylevel?
|
//! Keylevel tester: can this term ever be sent at this keylevel?
|
||||||
int
|
int
|
||||||
isKeylevelRight (Term t, const int kl)
|
isKeylevelRight (Term t, const int kl)
|
||||||
@ -1892,90 +1866,6 @@ bind_goal (const Binding b)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Prune determination for specific properties
|
|
||||||
/**
|
|
||||||
* Sometimes, a property holds in part of the tree. Thus, we don't need to explore that part further if we want to find an attack.
|
|
||||||
*
|
|
||||||
*@returns true iff this state is invalid for some reason
|
|
||||||
*/
|
|
||||||
int
|
|
||||||
prune_claim_specifics ()
|
|
||||||
{
|
|
||||||
if (sys->current_claim->type == CLAIM_Niagree)
|
|
||||||
{
|
|
||||||
if (arachne_claim_niagree (sys, 0, sys->current_claim->ev))
|
|
||||||
{
|
|
||||||
sys->current_claim->count =
|
|
||||||
statesIncrease (sys->current_claim->count);
|
|
||||||
if (switches.output == PROOF)
|
|
||||||
{
|
|
||||||
indentPrint ();
|
|
||||||
eprintf
|
|
||||||
("Pruned: niagree holds in this part of the proof tree.\n");
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (sys->current_claim->type == CLAIM_Nisynch)
|
|
||||||
{
|
|
||||||
if (arachne_claim_nisynch (sys, 0, sys->current_claim->ev))
|
|
||||||
{
|
|
||||||
sys->current_claim->count =
|
|
||||||
statesIncrease (sys->current_claim->count);
|
|
||||||
if (switches.output == PROOF)
|
|
||||||
{
|
|
||||||
indentPrint ();
|
|
||||||
eprintf
|
|
||||||
("Pruned: nisynch holds in this part of the proof tree.\n");
|
|
||||||
}
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Setup system for specific claim test
|
|
||||||
add_claim_specifics (const Claimlist cl, const Roledef rd)
|
|
||||||
{
|
|
||||||
if (cl->type == CLAIM_Secret)
|
|
||||||
{
|
|
||||||
/**
|
|
||||||
* Secrecy claim
|
|
||||||
*/
|
|
||||||
if (switches.output == PROOF)
|
|
||||||
{
|
|
||||||
indentPrint ();
|
|
||||||
eprintf ("* To verify the secrecy claim, we add the term ");
|
|
||||||
termPrint (rd->message);
|
|
||||||
eprintf (" as a goal.\n");
|
|
||||||
indentPrint ();
|
|
||||||
eprintf
|
|
||||||
("* If all goals can be bound, this constitutes an attack.\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* We say that a state exists for secrecy, but we don't really test wheter the claim can
|
|
||||||
* be reached (without reaching the attack).
|
|
||||||
*/
|
|
||||||
cl->count = statesIncrease (cl->count);
|
|
||||||
goal_add (rd->message, 0, cl->ev, 0); // Assumption that all claims are in run 0
|
|
||||||
}
|
|
||||||
|
|
||||||
if (cl->type == CLAIM_Reachable)
|
|
||||||
{
|
|
||||||
if (switches.check)
|
|
||||||
{
|
|
||||||
// For reachability claims in check mode, we restrict the number of runs to the number of roles of this protocol
|
|
||||||
Protocol protocol;
|
|
||||||
int rolecount;
|
|
||||||
|
|
||||||
protocol = (Protocol) cl->protocol;
|
|
||||||
rolecount = termlistLength (protocol->rolenames);
|
|
||||||
switches.runs = rolecount;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//! Count a false claim
|
//! Count a false claim
|
||||||
/**
|
/**
|
||||||
* Counts global attacks as well as claim instances.
|
* Counts global attacks as well as claim instances.
|
||||||
@ -2326,7 +2216,7 @@ iterate ()
|
|||||||
flag = 1;
|
flag = 1;
|
||||||
if (!prune_theorems (sys))
|
if (!prune_theorems (sys))
|
||||||
{
|
{
|
||||||
if (!prune_claim_specifics ())
|
if (!prune_claim_specifics (sys))
|
||||||
{
|
{
|
||||||
if (!prune_bounds (sys))
|
if (!prune_bounds (sys))
|
||||||
{
|
{
|
||||||
@ -2582,7 +2472,7 @@ arachne ()
|
|||||||
/**
|
/**
|
||||||
* Add specific goal info
|
* Add specific goal info
|
||||||
*/
|
*/
|
||||||
add_claim_specifics (cl,
|
add_claim_specifics (sys, cl,
|
||||||
roledef_shift (sys->runs[run].start,
|
roledef_shift (sys->runs[run].start,
|
||||||
cl->ev));
|
cl->ev));
|
||||||
|
|
||||||
|
97
src/claim.c
97
src/claim.c
@ -1,10 +1,22 @@
|
|||||||
|
/**
|
||||||
|
*
|
||||||
|
*@file claim.c
|
||||||
|
*
|
||||||
|
* Claim handling for the Arachne engine.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
|
||||||
#include "termmap.h"
|
#include "termmap.h"
|
||||||
#include "system.h"
|
#include "system.h"
|
||||||
#include "label.h"
|
#include "label.h"
|
||||||
#include "error.h"
|
#include "error.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "binding.h"
|
#include "binding.h"
|
||||||
|
#include "arachne.h"
|
||||||
|
#include "specialterm.h"
|
||||||
|
#include "switches.h"
|
||||||
|
|
||||||
#define MATCH_NONE 0
|
#define MATCH_NONE 0
|
||||||
#define MATCH_ORDER 1
|
#define MATCH_ORDER 1
|
||||||
@ -675,3 +687,88 @@ arachne_claim_nisynch (const System sys, const int claim_run,
|
|||||||
{
|
{
|
||||||
return arachne_claim_authentications (sys, claim_run, claim_index, 1);
|
return arachne_claim_authentications (sys, claim_run, claim_index, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Prune determination for specific properties
|
||||||
|
/**
|
||||||
|
* Sometimes, a property holds in part of the tree. Thus, we don't need to explore that part further if we want to find an attack.
|
||||||
|
*
|
||||||
|
*@returns true iff this state is invalid for some reason
|
||||||
|
*/
|
||||||
|
int
|
||||||
|
prune_claim_specifics (const System sys)
|
||||||
|
{
|
||||||
|
if (sys->current_claim->type == CLAIM_Niagree)
|
||||||
|
{
|
||||||
|
if (arachne_claim_niagree (sys, 0, sys->current_claim->ev))
|
||||||
|
{
|
||||||
|
sys->current_claim->count =
|
||||||
|
statesIncrease (sys->current_claim->count);
|
||||||
|
if (switches.output == PROOF)
|
||||||
|
{
|
||||||
|
indentPrint ();
|
||||||
|
eprintf
|
||||||
|
("Pruned: niagree holds in this part of the proof tree.\n");
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (sys->current_claim->type == CLAIM_Nisynch)
|
||||||
|
{
|
||||||
|
if (arachne_claim_nisynch (sys, 0, sys->current_claim->ev))
|
||||||
|
{
|
||||||
|
sys->current_claim->count =
|
||||||
|
statesIncrease (sys->current_claim->count);
|
||||||
|
if (switches.output == PROOF)
|
||||||
|
{
|
||||||
|
indentPrint ();
|
||||||
|
eprintf
|
||||||
|
("Pruned: nisynch holds in this part of the proof tree.\n");
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Setup system for specific claim test
|
||||||
|
void
|
||||||
|
add_claim_specifics (const System sys, const Claimlist cl, const Roledef rd)
|
||||||
|
{
|
||||||
|
if (cl->type == CLAIM_Secret)
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Secrecy claim
|
||||||
|
*/
|
||||||
|
if (switches.output == PROOF)
|
||||||
|
{
|
||||||
|
indentPrint ();
|
||||||
|
eprintf ("* To verify the secrecy claim, we add the term ");
|
||||||
|
termPrint (rd->message);
|
||||||
|
eprintf (" as a goal.\n");
|
||||||
|
indentPrint ();
|
||||||
|
eprintf
|
||||||
|
("* If all goals can be bound, this constitutes an attack.\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We say that a state exists for secrecy, but we don't really test wheter the claim can
|
||||||
|
* be reached (without reaching the attack).
|
||||||
|
*/
|
||||||
|
cl->count = statesIncrease (cl->count);
|
||||||
|
goal_add (rd->message, 0, cl->ev, 0); // Assumption that all claims are in run 0
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cl->type == CLAIM_Reachable)
|
||||||
|
{
|
||||||
|
if (switches.check)
|
||||||
|
{
|
||||||
|
// For reachability claims in check mode, we restrict the number of runs to the number of roles of this protocol
|
||||||
|
Protocol protocol;
|
||||||
|
int rolecount;
|
||||||
|
|
||||||
|
protocol = (Protocol) cl->protocol;
|
||||||
|
rolecount = termlistLength (protocol->rolenames);
|
||||||
|
switches.runs = rolecount;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -8,4 +8,8 @@ int arachne_claim_niagree (const System sys, const int claim_run,
|
|||||||
int arachne_claim_nisynch (const System sys, const int claim_run,
|
int arachne_claim_nisynch (const System sys, const int claim_run,
|
||||||
const int claim_index);
|
const int claim_index);
|
||||||
|
|
||||||
|
int prune_claim_specifics (const System sys);
|
||||||
|
void add_claim_specifics (const System sys, const Claimlist cl, const
|
||||||
|
Roledef rd);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -416,4 +416,5 @@ select_goal (const System sys)
|
|||||||
}
|
}
|
||||||
error ("Unknown value (<0) for --goal-select.");
|
error ("Unknown value (<0) for --goal-select.");
|
||||||
}
|
}
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ symbolsInit (void)
|
|||||||
symb_list = NULL;
|
symb_list = NULL;
|
||||||
symb_alloc = NULL;
|
symb_alloc = NULL;
|
||||||
globalError = 0;
|
globalError = 0;
|
||||||
globalStream = stdout;
|
globalStream = (char *) stdout;
|
||||||
}
|
}
|
||||||
|
|
||||||
//! Close symbols code.
|
//! Close symbols code.
|
||||||
|
26
src/term.c
26
src/term.c
@ -1352,3 +1352,29 @@ freshTermPrefix (Term prefixterm)
|
|||||||
freshsymbol = symbolNextFree (prefixsymbol);
|
freshsymbol = symbolNextFree (prefixsymbol);
|
||||||
return makeTermType (GLOBAL, freshsymbol, -1);
|
return makeTermType (GLOBAL, freshsymbol, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//! Determine whether a term is a functor
|
||||||
|
int
|
||||||
|
isTermFunctionName (Term t)
|
||||||
|
{
|
||||||
|
t = deVar (t);
|
||||||
|
if (t != NULL && isTermLeaf (t) && t->stype != NULL
|
||||||
|
&& inTermlist (t->stype, TERM_Function))
|
||||||
|
return 1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
//! Determine whether a term is a function application. Returns the function term.
|
||||||
|
Term
|
||||||
|
getTermFunction (Term t)
|
||||||
|
{
|
||||||
|
t = deVar (t);
|
||||||
|
if (t != NULL)
|
||||||
|
{
|
||||||
|
if (realTermEncrypt (t) && isTermFunctionName (TermKey (t)))
|
||||||
|
{
|
||||||
|
return TermKey (t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
@ -197,5 +197,8 @@ void term_set_keylevels (const Term term);
|
|||||||
void termPrintDiff (Term t1, Term t2);
|
void termPrintDiff (Term t1, Term t2);
|
||||||
int isLeafNameEqual (Term t1, Term t2);
|
int isLeafNameEqual (Term t1, Term t2);
|
||||||
Term freshTermPrefix (Term prefixterm);
|
Term freshTermPrefix (Term prefixterm);
|
||||||
|
int isTermFunctionName (Term t);
|
||||||
|
Term getTermFunction (Term t);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user