Improving some scripts; exploit cache better.
This commit is contained in:
		
							parent
							
								
									c2662abaef
								
							
						
					
					
						commit
						bc667f3f32
					
				| @ -105,8 +105,7 @@ def safeCommandOutput(cmd): | ||||
|     Meant for short outputs, as output is stored in memory and | ||||
|     not written to a file. | ||||
|     """ | ||||
| 
 | ||||
|     p = Popen(cmd, shell=True, stdout=PIPE, stderr=PIPE) | ||||
|     p = Popen(cmd, shell=getShell(), stdout=PIPE, stderr=PIPE) | ||||
|     (sout,serr) = p.communicate() | ||||
| 
 | ||||
|     return (p.returncode,sout,serr) | ||||
| @ -115,7 +114,7 @@ def safeCommand(cmd): | ||||
|     """ Execute a command with some arguments. Safe cross-platform | ||||
|     version, I hope. """ | ||||
| 
 | ||||
|     p = Popen(cmd, shell=True) | ||||
|     p = Popen(cmd, shell=getShell()) | ||||
|     sts = p.wait() | ||||
| 
 | ||||
|     return sts | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| #!/usr/bin/python | ||||
| """ | ||||
| 	Scyther : An automatic verifier for security protocols. | ||||
| 	Copyright (C) 2007 Cas Cremers | ||||
| 	Copyright (C) 2007-2009 Cas Cremers | ||||
| 
 | ||||
| 	This program is free software; you can redistribute it and/or | ||||
| 	modify it under the terms of the GNU General Public License | ||||
| @ -241,14 +241,19 @@ class Scyther(object): | ||||
|         for arg in arglist: | ||||
|             self.options += " %s" % (arg) | ||||
| 
 | ||||
|     def doScytherCommand(self, spdl, args): | ||||
|     def doScytherCommand(self, spdl, args, checkKnown=False): | ||||
|         """ | ||||
|         Cached version of the 'real' below | ||||
|         """ | ||||
|         global HASHLIB | ||||
| 
 | ||||
|         if not HASHLIB: | ||||
|             return self.doScytherCommandReal(spdl,args) | ||||
|             if checkKnown == True: | ||||
|                 # No hashlib, so we don't have it already | ||||
|                 return False | ||||
|             else: | ||||
|                 # Need to compute | ||||
|                 return self.doScytherCommandReal(spdl,args) | ||||
| 
 | ||||
|         # So we have the hashing libs | ||||
|         m = hashlib.sha256() | ||||
| @ -288,11 +293,20 @@ class Scyther(object): | ||||
|             fh2 = open(fname2,"r") | ||||
|             err = fh2.read() | ||||
|             fh2.close() | ||||
|             return (out,err) | ||||
|             if checkKnown == True: | ||||
|                 # We got to here, so we have it | ||||
|                 return True | ||||
|             else: | ||||
|                 # Not checking cache, we need the result | ||||
|                 return (out,err) | ||||
|         except: | ||||
|             """ | ||||
|             Something went wrong, do the real thing and cache afterwards | ||||
|             """ | ||||
|             if checkKnown == True: | ||||
|                 # We were only checking, abort | ||||
|                 return False | ||||
| 
 | ||||
|             (out,err) = self.doScytherCommandReal(spdl,args) | ||||
| 
 | ||||
|             # Store result in cache | ||||
| @ -380,8 +394,9 @@ class Scyther(object): | ||||
|         """ Sanitize some of the input """ | ||||
|         self.options = EnsureString(self.options) | ||||
| 
 | ||||
|     def verify(self,extraoptions=None): | ||||
|     def verify(self,extraoptions=None,checkKnown=False): | ||||
|         """ Should return a list of results """ | ||||
|         """ If checkKnown == True, we do not call Scyther, but just check the cache, and return True iff the result is in the cache """ | ||||
| 
 | ||||
|         # Cleanup first | ||||
|         self.sanitize() | ||||
| @ -395,6 +410,10 @@ class Scyther(object): | ||||
|             # extraoptions might need sanitizing | ||||
|             args += " %s" % EnsureString(extraoptions) | ||||
| 
 | ||||
|         # Are we only checking the cache? | ||||
|         if checkKnown == True: | ||||
|             return self.doScytherCommand(self.spdl, args, checkKnown=checkKnown) | ||||
| 
 | ||||
|         # execute | ||||
|         (output,errors) = self.doScytherCommand(self.spdl, args) | ||||
|         self.run = True | ||||
| @ -442,19 +461,21 @@ class Scyther(object): | ||||
|         else: | ||||
|             return self.output | ||||
| 
 | ||||
|     def verifyOne(self,cl=None): | ||||
|     def verifyOne(self,cl=None,checkKnown=False): | ||||
|         """ | ||||
|         Verify just a single claim with an ID retrieved from the | ||||
|         procedure below, 'scanClaims', or a full claim object | ||||
| 
 | ||||
|         If checkKnown is True, return if the result is already known (but never recompute). | ||||
|         """ | ||||
|         if cl: | ||||
|             # We accept either a claim or a claim id | ||||
|             if isinstance(cl,Claim.Claim): | ||||
|                 cl = cl.id | ||||
|             return self.verify("--filter=%s" % cl) | ||||
|             return self.verify("--filter=%s" % cl, checkKnown=checkKnown) | ||||
|         else: | ||||
|             # If no claim, then its just normal verification | ||||
|             return self.verify() | ||||
|             return self.verify(checkKnown=checkKnown) | ||||
| 
 | ||||
|     def scanClaims(self): | ||||
|         """ | ||||
| @ -493,6 +514,58 @@ class Scyther(object): | ||||
| 
 | ||||
| #--------------------------------------------------------------------------- | ||||
| 
 | ||||
| def GetClaims(filelist, filterlist=None): | ||||
|     """ | ||||
|     Given a list of file names in filelist, | ||||
|     returns a dictionary of filenames to lists claim names. | ||||
|     Filenames which yielded no claims are filtered out. | ||||
|      | ||||
|     Filterlist may be None or a list of claim names (Secret, SKR, Niagree etc). | ||||
|     """ | ||||
| 
 | ||||
|     dict = {} | ||||
|     for fname in filelist: | ||||
|         try: | ||||
|             sc = Scyther() | ||||
|             sc.setFile(fname) | ||||
|             l = sc.scanClaims() | ||||
|             if l != None: | ||||
|                 cl = [] | ||||
|                 for claim in l: | ||||
|                     if filterlist == None: | ||||
|                         cl.append(claim.id) | ||||
|                     else: | ||||
|                         if claim.claimtype in filterlist: | ||||
|                             cl.append(claim.id) | ||||
|                 dict[fname] = cl | ||||
|         except: | ||||
|             pass | ||||
|     return dict | ||||
| 
 | ||||
| #--------------------------------------------------------------------------- | ||||
| 
 | ||||
| def FindProtocols(path="",filterProtocol=None): | ||||
|     """ | ||||
|     Find a list of protocol names | ||||
| 
 | ||||
|     Note: Unix only! Will not work under windows. | ||||
|     """ | ||||
| 
 | ||||
|     import commands | ||||
| 
 | ||||
|     cmd = "find %s -iname '*.spdl'" % (path) | ||||
|     plist = commands.getoutput(cmd).splitlines() | ||||
|     nlist = [] | ||||
|     for prot in plist: | ||||
|         if filterProtocol != None: | ||||
|             if filterProtocol(prot): | ||||
|                 nlist.append(prot) | ||||
|         else: | ||||
|             nlist.append(prot) | ||||
|     return nlist | ||||
| 
 | ||||
| #--------------------------------------------------------------------------- | ||||
| 
 | ||||
| def GetInfo(html=False): | ||||
|     """ | ||||
|     Retrieve a tuple (location,string) with information about the tool, | ||||
|  | ||||
| @ -176,3 +176,6 @@ Mon Jan 24 14:55:23 CET 2011 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| Sat Jan 29 13:35:22 CET 2011 | ||||
| 
 | ||||
| ./batcher.sh -m 2 -A --self-communication Protocols/MultiProtocolAttacks/*.spdl | ||||
|  | ||||
| @ -232,8 +232,9 @@ def MyScyther(protocollist,filt=None,options=[],checkpickle=True): | ||||
|     for protocol in sorted(protocollist): | ||||
|         s.addFile(protocol) | ||||
|     if checkpickle and OPTS.pickle: | ||||
|         # Do not really verify! Just dump request | ||||
|         PICKLEDATA.add((tuple(sorted(protocollist)),s.options,filt)) | ||||
|         # Do not really verify! Just dump request if not already known | ||||
|         if s.verifyOne(filt, checkKnown=True) == False: | ||||
|             PICKLEDATA.add((tuple(sorted(protocollist)),s.options,filt)) | ||||
|     else: | ||||
|         # Verify results | ||||
|         s.verifyOne(filt) | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user