- Started to work on a caching mechanism.
This commit is contained in:
parent
351d619324
commit
9533f6f548
@ -30,7 +30,7 @@ import copy
|
|||||||
# ***********************
|
# ***********************
|
||||||
|
|
||||||
# Tuple width (number of concurrent protocols)
|
# Tuple width (number of concurrent protocols)
|
||||||
TupleWidth = "3"
|
TupleWidth = "2"
|
||||||
|
|
||||||
# Temporary files
|
# Temporary files
|
||||||
TempFileList = "scyther-blap.tmp"
|
TempFileList = "scyther-blap.tmp"
|
||||||
@ -42,8 +42,8 @@ ScytherProgram = "../src/scyther"
|
|||||||
|
|
||||||
# Scyther parameters
|
# Scyther parameters
|
||||||
ScytherDefaults = "--summary"
|
ScytherDefaults = "--summary"
|
||||||
ScytherMethods = "--match=0 --arachne"
|
ScytherMethods = "--match=1 --arachne"
|
||||||
ScytherBounds = "--timer=10 --max-runs=5 --max-length=20"
|
ScytherBounds = "--timer=5 --max-runs=5 --max-length=20"
|
||||||
|
|
||||||
# Build a large part of the command line (for Scyther) already
|
# Build a large part of the command line (for Scyther) already
|
||||||
ScytherArgs = ScytherDefaults + " " + ScytherMethods + " " + ScytherBounds
|
ScytherArgs = ScytherDefaults + " " + ScytherMethods + " " + ScytherBounds
|
||||||
@ -227,6 +227,30 @@ def ClearProgress (n,txt):
|
|||||||
sys.stderr.flush()
|
sys.stderr.flush()
|
||||||
|
|
||||||
|
|
||||||
|
def DescribeContextBrief (filep, protocols, claim, prefix):
|
||||||
|
|
||||||
|
filep.write (prefix)
|
||||||
|
|
||||||
|
prlist = []
|
||||||
|
for prfile in protocols:
|
||||||
|
prnames = GetKeys (ProtocolToFileMap, prfile)
|
||||||
|
prlist = prlist + prnames
|
||||||
|
newprname = claim.split()[0]
|
||||||
|
filep.write ("\t" + newprname)
|
||||||
|
|
||||||
|
filep.write ("\t" + claim)
|
||||||
|
|
||||||
|
prlistclean = []
|
||||||
|
prliststr = ""
|
||||||
|
for pn in prlist:
|
||||||
|
if pn not in prlistclean:
|
||||||
|
if pn != newprname:
|
||||||
|
prlistclean.append(pn)
|
||||||
|
prliststr = prliststr + "\t" + pn
|
||||||
|
filep.write (prliststr)
|
||||||
|
|
||||||
|
filep.write ("\n")
|
||||||
|
|
||||||
def DescribeContext (filep, protocols, claim):
|
def DescribeContext (filep, protocols, claim):
|
||||||
def DC_Claim(cl,v):
|
def DC_Claim(cl,v):
|
||||||
if v == 0:
|
if v == 0:
|
||||||
@ -345,15 +369,14 @@ def SignalAttack (protocols, claim):
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
ClearProgress (TupleCount, safetxt)
|
ClearProgress (TupleCount, safetxt)
|
||||||
print "-" * 40
|
outs = "***\t" + str(newattacks)
|
||||||
print "New attack [[", newattacks, "]] at", processed, "/", TupleCount, ":", claim, " using",CommandLine( protocols)
|
outs = outs + "\t" + str(processed) + "/" + str(TupleCount)
|
||||||
for helper in GetListKeys (ProtocolToFileMap, protocols):
|
for helper in GetListKeys (ProtocolToFileMap, protocols):
|
||||||
clprname = claim.split()[0]
|
clprname = claim.split()[0]
|
||||||
if helper <> clprname:
|
if helper <> clprname:
|
||||||
if helper not in ProtocolToEffectsMap.keys():
|
if helper not in ProtocolToEffectsMap.keys():
|
||||||
# new
|
# new
|
||||||
ProtocolToEffectsMap[helper] = [clprname]
|
ProtocolToEffectsMap[helper] = [clprname]
|
||||||
print "% Detected a new flaw helper:", helper
|
|
||||||
else:
|
else:
|
||||||
# already noted as helper, add destruction now
|
# already noted as helper, add destruction now
|
||||||
if clprname not in ProtocolToEffectsMap[helper]:
|
if clprname not in ProtocolToEffectsMap[helper]:
|
||||||
@ -366,7 +389,7 @@ def SignalAttack (protocols, claim):
|
|||||||
# error log thingy. Furthermore,
|
# error log thingy. Furthermore,
|
||||||
# explicitly recreate the commandline
|
# explicitly recreate the commandline
|
||||||
# and the claim that is newly violated
|
# and the claim that is newly violated
|
||||||
DescribeContext (sys.stdout, protocols, claim)
|
DescribeContextBrief (sys.stdout, protocols, claim, outs)
|
||||||
|
|
||||||
return 1
|
return 1
|
||||||
|
|
||||||
|
82
test/scythercache.py
Normal file
82
test/scythercache.py
Normal file
@ -0,0 +1,82 @@
|
|||||||
|
#
|
||||||
|
# Scyther caching mechanism
|
||||||
|
#
|
||||||
|
# Uses md5 hashes to store previously calculated results.
|
||||||
|
#
|
||||||
|
# (c)2005 Cas Cremers
|
||||||
|
#
|
||||||
|
#
|
||||||
|
import md5
|
||||||
|
import commands
|
||||||
|
import os
|
||||||
|
|
||||||
|
# scyther should reside in $PATH
|
||||||
|
def scythercall (argumentstring, inputfile):
|
||||||
|
clstring = "scyther " + argumentstring + " " + inputfile
|
||||||
|
(status,scout) = commands.getstatusoutput(clstring)
|
||||||
|
return (status,scout)
|
||||||
|
|
||||||
|
# cached results
|
||||||
|
# input: a large string (consisting of read input files)
|
||||||
|
# argstring: a smaller string
|
||||||
|
def scythercache (argumentstring, inputstring):
|
||||||
|
|
||||||
|
def cacheid():
|
||||||
|
m = md5.new()
|
||||||
|
|
||||||
|
# # Determine scyther version
|
||||||
|
# (status, scout) = scythercall ("--version", "")
|
||||||
|
# if status == 1 or status < 0:
|
||||||
|
# # some problem
|
||||||
|
# print "Problem with determining scyther version!"
|
||||||
|
# os.exit()
|
||||||
|
# # Add version to hash
|
||||||
|
# m.update (scout)
|
||||||
|
|
||||||
|
# Add inputfile to hash
|
||||||
|
m.update (inputstring)
|
||||||
|
|
||||||
|
# Add arguments to hash
|
||||||
|
m.update (argumentstring)
|
||||||
|
|
||||||
|
# Return a readable ID (good for a filename)
|
||||||
|
return m.hexdigest()
|
||||||
|
|
||||||
|
# Ensure directories for a file
|
||||||
|
def ensureDirectories (filename):
|
||||||
|
|
||||||
|
def ensureDir (plist):
|
||||||
|
if len(plist) > 1:
|
||||||
|
ensureDir (plist[:-1])
|
||||||
|
path = plist.join("/")
|
||||||
|
if not os.path.exists(path):
|
||||||
|
os.mkdir(path)
|
||||||
|
|
||||||
|
dir = os.path.dirname(filename)
|
||||||
|
ensuredir (dir.split("/"))
|
||||||
|
|
||||||
|
# Determine the unique filename for this test
|
||||||
|
id = cacheid()
|
||||||
|
filename = "scythercache/" + id[:2] + "/res-" + id[2:] + ".txt"
|
||||||
|
cachefile = gettempdir() + "/" + filename
|
||||||
|
ensureDirectories(cachefile)
|
||||||
|
|
||||||
|
# Does it already exist?
|
||||||
|
if os.path.exists(cachefile):
|
||||||
|
# Great: return the cached results
|
||||||
|
f = open(cachefile,"r")
|
||||||
|
res = f.read()
|
||||||
|
f.close()
|
||||||
|
return (0,res)
|
||||||
|
else:
|
||||||
|
# Hmm, we need to compute this result
|
||||||
|
h = NamedTemporaryFile()
|
||||||
|
h.write(inputstring)
|
||||||
|
(status, scout) = scythercall (argumentstring, h.name)
|
||||||
|
h.close()
|
||||||
|
f = open(cachefile,"w")
|
||||||
|
f.write(scout)
|
||||||
|
f.close()
|
||||||
|
return (status,scout)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user