- Single claim check branched.
This commit is contained in:
		
							parent
							
								
									ff87bf180f
								
							
						
					
					
						commit
						92a98a85cc
					
				
							
								
								
									
										276
									
								
								src/arachne.c
									
									
									
									
									
								
							
							
						
						
									
										276
									
								
								src/arachne.c
									
									
									
									
									
								
							@ -2231,6 +2231,147 @@ iterate_buffer_attacks (void)
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//! Arachne single claim
 | 
			
		||||
int
 | 
			
		||||
arachneClaim (Claimlist cl)
 | 
			
		||||
{
 | 
			
		||||
  // Skip the dummy claims
 | 
			
		||||
  if (!isTermEqual (cl->type, CLAIM_Empty))
 | 
			
		||||
    {
 | 
			
		||||
      // Any other claims might be filterered
 | 
			
		||||
      if (switches.filterClaim == NULL || switches.filterClaim == cl->type)
 | 
			
		||||
	{
 | 
			
		||||
	  // Some claims are always true!
 | 
			
		||||
	  if (!cl->alwaystrue)
 | 
			
		||||
	    {
 | 
			
		||||
	      // others we simply test...
 | 
			
		||||
	      int run;
 | 
			
		||||
	      int newruns;
 | 
			
		||||
	      Protocol p;
 | 
			
		||||
	      Role r;
 | 
			
		||||
 | 
			
		||||
	      newruns = 0;
 | 
			
		||||
	      sys->current_claim = cl;
 | 
			
		||||
	      attack_length = INT_MAX;
 | 
			
		||||
	      attack_leastcost = INT_MAX;
 | 
			
		||||
	      cl->complete = 1;
 | 
			
		||||
	      p = (Protocol) cl->protocol;
 | 
			
		||||
	      r = (Role) cl->role;
 | 
			
		||||
 | 
			
		||||
	      if (switches.output == PROOF)
 | 
			
		||||
		{
 | 
			
		||||
		  indentPrint ();
 | 
			
		||||
		  eprintf ("Testing Claim ");
 | 
			
		||||
		  termPrint (cl->type);
 | 
			
		||||
		  eprintf (" from ");
 | 
			
		||||
		  termPrint (p->nameterm);
 | 
			
		||||
		  eprintf (", ");
 | 
			
		||||
		  termPrint (r->nameterm);
 | 
			
		||||
		  eprintf (" at index %i.\n", cl->ev);
 | 
			
		||||
		}
 | 
			
		||||
	      indentDepth++;
 | 
			
		||||
 | 
			
		||||
	      run = semiRunCreate (p, r);
 | 
			
		||||
	      newruns++;
 | 
			
		||||
	      {
 | 
			
		||||
		int newgoals;
 | 
			
		||||
 | 
			
		||||
		int realStart (void)
 | 
			
		||||
		{
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
		  if (DEBUGL (5))
 | 
			
		||||
		    {
 | 
			
		||||
		      printSemiState ();
 | 
			
		||||
		    }
 | 
			
		||||
#endif
 | 
			
		||||
		  return iterate_buffer_attacks ();
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		proof_suppose_run (run, 0, cl->ev + 1);
 | 
			
		||||
		newgoals = add_read_goals (run, 0, cl->ev + 1);
 | 
			
		||||
 | 
			
		||||
		    /**
 | 
			
		||||
		     * Add initial knowledge node
 | 
			
		||||
		     */
 | 
			
		||||
		{
 | 
			
		||||
		  Termlist m0tl;
 | 
			
		||||
		  Term m0t;
 | 
			
		||||
		  int m0run;
 | 
			
		||||
 | 
			
		||||
		  m0tl = knowledgeSet (sys->know);
 | 
			
		||||
		  m0t = termlist_to_tuple (m0tl);
 | 
			
		||||
		  // eprintf("Initial intruder knowledge node for ");
 | 
			
		||||
		  // termPrint(m0t);
 | 
			
		||||
		  // eprintf("\n");
 | 
			
		||||
		  I_M->roledef->message = m0t;
 | 
			
		||||
		  m0run = semiRunCreate (INTRUDER, I_M);
 | 
			
		||||
		  newruns++;
 | 
			
		||||
		  proof_suppose_run (m0run, 0, 1);
 | 
			
		||||
		  sys->runs[m0run].height = 1;
 | 
			
		||||
 | 
			
		||||
		  {
 | 
			
		||||
		      /**
 | 
			
		||||
		       * Add specific goal info and iterate algorithm
 | 
			
		||||
		       */
 | 
			
		||||
		    add_claim_specifics (sys, cl,
 | 
			
		||||
					 roledef_shift (sys->runs[run].
 | 
			
		||||
							start, cl->ev),
 | 
			
		||||
					 realStart);
 | 
			
		||||
		  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		  // remove initial knowledge node
 | 
			
		||||
		  termDelete (m0t);
 | 
			
		||||
		  termlistDelete (m0tl);
 | 
			
		||||
		  semiRunDestroy ();
 | 
			
		||||
		  newruns--;
 | 
			
		||||
		}
 | 
			
		||||
		// remove claiming run goals 
 | 
			
		||||
		goal_remove_last (newgoals);
 | 
			
		||||
		semiRunDestroy ();
 | 
			
		||||
		newruns--;
 | 
			
		||||
	      }
 | 
			
		||||
	      //! Destroy
 | 
			
		||||
	      while (sys->maxruns > 0 && newruns > 0)
 | 
			
		||||
		{
 | 
			
		||||
		  semiRunDestroy ();
 | 
			
		||||
		  newruns--;
 | 
			
		||||
		}
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
	      if (sys->bindings != NULL)
 | 
			
		||||
		{
 | 
			
		||||
		  error ("sys->bindings NOT empty after claim test.");
 | 
			
		||||
		}
 | 
			
		||||
	      if (sys->maxruns != 0)
 | 
			
		||||
		{
 | 
			
		||||
		  error ("%i undestroyed runs left after claim test.",
 | 
			
		||||
			 sys->maxruns);
 | 
			
		||||
		}
 | 
			
		||||
	      if (newruns != 0)
 | 
			
		||||
		{
 | 
			
		||||
		  error ("Lost %i runs after claim test.", newruns);
 | 
			
		||||
		}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
	      //! Indent back
 | 
			
		||||
	      indentDepth--;
 | 
			
		||||
 | 
			
		||||
	      if (switches.output == PROOF)
 | 
			
		||||
		{
 | 
			
		||||
		  indentPrint ();
 | 
			
		||||
		  eprintf ("Proof complete for this claim.\n");
 | 
			
		||||
		}
 | 
			
		||||
	    }
 | 
			
		||||
	}
 | 
			
		||||
      return true;
 | 
			
		||||
    }
 | 
			
		||||
  else
 | 
			
		||||
    {
 | 
			
		||||
      return false;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
//! Main code for Arachne
 | 
			
		||||
/**
 | 
			
		||||
 * For this test, we manually set up some stuff.
 | 
			
		||||
@ -2241,6 +2382,7 @@ int
 | 
			
		||||
arachne ()
 | 
			
		||||
{
 | 
			
		||||
  Claimlist cl;
 | 
			
		||||
  int count;
 | 
			
		||||
 | 
			
		||||
  int print_send (Protocol p, Role r, Roledef rd, int index)
 | 
			
		||||
  {
 | 
			
		||||
@ -2304,145 +2446,21 @@ arachne ()
 | 
			
		||||
  indentDepth = 0;
 | 
			
		||||
  proofDepth = 0;
 | 
			
		||||
  cl = sys->claimlist;
 | 
			
		||||
  count = 0;
 | 
			
		||||
  while (cl != NULL)
 | 
			
		||||
    {
 | 
			
		||||
      /**
 | 
			
		||||
       * Check each claim
 | 
			
		||||
       */
 | 
			
		||||
 | 
			
		||||
      // Skip the dummy claims
 | 
			
		||||
      if (!isTermEqual (cl->type, CLAIM_Empty))
 | 
			
		||||
      if (arachneClaim (cl))
 | 
			
		||||
	{
 | 
			
		||||
	  // Any other claims might be filterered
 | 
			
		||||
	  if (switches.filterClaim == NULL
 | 
			
		||||
	      || switches.filterClaim == cl->type)
 | 
			
		||||
	    {
 | 
			
		||||
	      // Some claims are always true!
 | 
			
		||||
	      if (!cl->alwaystrue)
 | 
			
		||||
		{
 | 
			
		||||
		  // others we simply test...
 | 
			
		||||
		  int run;
 | 
			
		||||
		  int newruns;
 | 
			
		||||
		  Protocol p;
 | 
			
		||||
		  Role r;
 | 
			
		||||
 | 
			
		||||
		  newruns = 0;
 | 
			
		||||
		  sys->current_claim = cl;
 | 
			
		||||
		  attack_length = INT_MAX;
 | 
			
		||||
		  attack_leastcost = INT_MAX;
 | 
			
		||||
		  cl->complete = 1;
 | 
			
		||||
		  p = (Protocol) cl->protocol;
 | 
			
		||||
		  r = (Role) cl->role;
 | 
			
		||||
 | 
			
		||||
		  if (switches.output == PROOF)
 | 
			
		||||
		    {
 | 
			
		||||
		      indentPrint ();
 | 
			
		||||
		      eprintf ("Testing Claim ");
 | 
			
		||||
		      termPrint (cl->type);
 | 
			
		||||
		      eprintf (" from ");
 | 
			
		||||
		      termPrint (p->nameterm);
 | 
			
		||||
		      eprintf (", ");
 | 
			
		||||
		      termPrint (r->nameterm);
 | 
			
		||||
		      eprintf (" at index %i.\n", cl->ev);
 | 
			
		||||
		    }
 | 
			
		||||
		  indentDepth++;
 | 
			
		||||
 | 
			
		||||
		  run = semiRunCreate (p, r);
 | 
			
		||||
		  newruns++;
 | 
			
		||||
		  {
 | 
			
		||||
		    int newgoals;
 | 
			
		||||
 | 
			
		||||
		    int realStart (void)
 | 
			
		||||
		    {
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
		      if (DEBUGL (5))
 | 
			
		||||
			{
 | 
			
		||||
			  printSemiState ();
 | 
			
		||||
			}
 | 
			
		||||
#endif
 | 
			
		||||
		      return iterate_buffer_attacks ();
 | 
			
		||||
		    }
 | 
			
		||||
 | 
			
		||||
		    proof_suppose_run (run, 0, cl->ev + 1);
 | 
			
		||||
		    newgoals = add_read_goals (run, 0, cl->ev + 1);
 | 
			
		||||
 | 
			
		||||
		    /**
 | 
			
		||||
		     * Add initial knowledge node
 | 
			
		||||
		     */
 | 
			
		||||
		    {
 | 
			
		||||
		      Termlist m0tl;
 | 
			
		||||
		      Term m0t;
 | 
			
		||||
		      int m0run;
 | 
			
		||||
 | 
			
		||||
		      m0tl = knowledgeSet (sys->know);
 | 
			
		||||
		      m0t = termlist_to_tuple (m0tl);
 | 
			
		||||
		      // eprintf("Initial intruder knowledge node for ");
 | 
			
		||||
		      // termPrint(m0t);
 | 
			
		||||
		      // eprintf("\n");
 | 
			
		||||
		      I_M->roledef->message = m0t;
 | 
			
		||||
		      m0run = semiRunCreate (INTRUDER, I_M);
 | 
			
		||||
		      newruns++;
 | 
			
		||||
		      proof_suppose_run (m0run, 0, 1);
 | 
			
		||||
		      sys->runs[m0run].height = 1;
 | 
			
		||||
 | 
			
		||||
		      {
 | 
			
		||||
		      /**
 | 
			
		||||
		       * Add specific goal info and iterate algorithm
 | 
			
		||||
		       */
 | 
			
		||||
			add_claim_specifics (sys, cl,
 | 
			
		||||
					     roledef_shift (sys->runs[run].
 | 
			
		||||
							    start, cl->ev),
 | 
			
		||||
					     realStart);
 | 
			
		||||
		      }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		      // remove initial knowledge node
 | 
			
		||||
		      termDelete (m0t);
 | 
			
		||||
		      termlistDelete (m0tl);
 | 
			
		||||
		      semiRunDestroy ();
 | 
			
		||||
		      newruns--;
 | 
			
		||||
		    }
 | 
			
		||||
		    // remove claiming run goals 
 | 
			
		||||
		    goal_remove_last (newgoals);
 | 
			
		||||
		    semiRunDestroy ();
 | 
			
		||||
		    newruns--;
 | 
			
		||||
		  }
 | 
			
		||||
		  //! Destroy
 | 
			
		||||
		  while (sys->maxruns > 0 && newruns > 0)
 | 
			
		||||
		    {
 | 
			
		||||
		      semiRunDestroy ();
 | 
			
		||||
		      newruns--;
 | 
			
		||||
		    }
 | 
			
		||||
#ifdef DEBUG
 | 
			
		||||
		  if (sys->bindings != NULL)
 | 
			
		||||
		    {
 | 
			
		||||
		      error ("sys->bindings NOT empty after claim test.");
 | 
			
		||||
		    }
 | 
			
		||||
		  if (sys->maxruns != 0)
 | 
			
		||||
		    {
 | 
			
		||||
		      error ("%i undestroyed runs left after claim test.",
 | 
			
		||||
			     sys->maxruns);
 | 
			
		||||
		    }
 | 
			
		||||
		  if (newruns != 0)
 | 
			
		||||
		    {
 | 
			
		||||
		      error ("Lost %i runs after claim test.", newruns);
 | 
			
		||||
		    }
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
		  //! Indent back
 | 
			
		||||
		  indentDepth--;
 | 
			
		||||
 | 
			
		||||
		  if (switches.output == PROOF)
 | 
			
		||||
		    {
 | 
			
		||||
		      indentPrint ();
 | 
			
		||||
		      eprintf ("Proof complete for this claim.\n");
 | 
			
		||||
		    }
 | 
			
		||||
		}
 | 
			
		||||
	    }
 | 
			
		||||
	  count++;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
      // next
 | 
			
		||||
      cl = cl->next;
 | 
			
		||||
    }
 | 
			
		||||
  return count;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//! Construct knowledge set at some event, based on a semitrace.
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user