390 lines
7.9 KiB
Python
390 lines
7.9 KiB
Python
#!/usr/bin/python
|
|
#
|
|
# If.py
|
|
#
|
|
# Objects and stuff for the intermediate format
|
|
#
|
|
import copy # To copy objects
|
|
import os # For path functions
|
|
|
|
|
|
class Message(object):
|
|
def __cmp__(self,other):
|
|
return cmp(str(self),str(other))
|
|
|
|
def inTerms(self):
|
|
return [self]
|
|
|
|
def isVariable(self):
|
|
return False
|
|
|
|
def substitute(self, msgfrom, msgto):
|
|
if self == msgfrom:
|
|
return msgto
|
|
else:
|
|
return self
|
|
|
|
def aKeys(self):
|
|
return []
|
|
|
|
class Constant(Message):
|
|
def __init__ (self,type,s,optprime=""):
|
|
self.type = type
|
|
self.prime = optprime
|
|
self.str = s
|
|
|
|
def __str__(self):
|
|
return self.str + self.prime
|
|
|
|
def spdl(self,braces=True):
|
|
return self.str + self.prime
|
|
|
|
def __repr__(self):
|
|
return str(self)
|
|
|
|
class Variable(Constant):
|
|
def isVariable(self):
|
|
return True
|
|
|
|
class PublicKey(Constant):
|
|
pass
|
|
|
|
class Composed(Message):
|
|
def __init__ (self,m1,m2):
|
|
self.left = m1
|
|
self.right = m2
|
|
|
|
def __str__(self):
|
|
return "(" + str(self.left) + "," + str(self.right) + ")"
|
|
|
|
def spdl(self,braces=True):
|
|
res = ""
|
|
if braces:
|
|
res += "("
|
|
res += self.left.spdl(False) + "," + self.right.spdl(False)
|
|
if braces:
|
|
res += ")"
|
|
return res
|
|
|
|
def inTerms(self):
|
|
return self.left.inTerms() + self.right.inTerms()
|
|
|
|
def substitute(self, msgfrom, msgto):
|
|
if self == msgfrom:
|
|
return msgto
|
|
else:
|
|
new = copy.copy(self)
|
|
new.left = self.left.substitute(msgfrom, msgto)
|
|
new.right = self.right.substitute(msgfrom, msgto)
|
|
return new
|
|
|
|
def aKeys(self):
|
|
return self.left.aKeys() + self.right.aKeys()
|
|
|
|
class SPCrypt(Message):
|
|
def __init__ (self,key,message):
|
|
self.key = key
|
|
self.message = message
|
|
|
|
def __str__(self):
|
|
return "{" + str(self.message) + "}" + str(self.key) + " "
|
|
|
|
def spdl(self,braces=True):
|
|
return "{" + self.message.spdl(False) + "}" + self.key.spdl() + " "
|
|
|
|
def inTerms(self):
|
|
return self.key.inTerms() + self.message.inTerms()
|
|
|
|
def substitute(self, msgfrom, msgto):
|
|
if self == msgfrom:
|
|
return msgto
|
|
else:
|
|
new = copy.copy(self)
|
|
new.key = self.key.substitute(msgfrom, msgto)
|
|
new.message = self.message.substitute(msgfrom, msgto)
|
|
return new
|
|
|
|
def aKeys(self):
|
|
return self.message.aKeys() + self.key.aKeys()
|
|
|
|
class PublicCrypt(SPCrypt):
|
|
def aKeys(self):
|
|
return self.message.aKeys() + [self.key]
|
|
|
|
class SymmetricCrypt(SPCrypt):
|
|
pass
|
|
|
|
class XOR(Composed):
|
|
def __str__(self):
|
|
return str(self.left) + " xor " + str(self.right)
|
|
|
|
def spdl(self,braces=True):
|
|
# This is not possible yet!
|
|
raise Error
|
|
|
|
|
|
class MsgList(list):
|
|
def inTerms(self):
|
|
l = []
|
|
for m in self:
|
|
l = l + m.inTerms()
|
|
return l
|
|
|
|
def __str__(self):
|
|
return "[ " + ", ".join(map(str,self)) + " ]"
|
|
|
|
def spdl(self):
|
|
first = True
|
|
res = ""
|
|
for m in self:
|
|
if not first:
|
|
res += ", "
|
|
else:
|
|
first = False
|
|
res += m.spdl()
|
|
return res
|
|
|
|
def getList(self):
|
|
l = []
|
|
for e in self:
|
|
l.append(e)
|
|
return l
|
|
|
|
def substitute(self, msgfrom, msgto):
|
|
newl = []
|
|
for m in self:
|
|
newl.append(m.substitute(msgfrom, msgto))
|
|
return MsgList(newl)
|
|
|
|
class Fact(list):
|
|
def __repr__(self):
|
|
return "Fact<" + list.__repr__(self) + ">"
|
|
|
|
def getActor(self):
|
|
return None
|
|
|
|
class GoalFact(Fact):
|
|
def __repr__(self):
|
|
return "Goal " + Fact.__repr__(self)
|
|
|
|
class PrincipalFact(Fact):
|
|
def __init__(self,t):
|
|
self.step = t[0]
|
|
self.readnextfrom = t[1]
|
|
self.actor = t[2]
|
|
self.runknowledge = t[3]
|
|
self.knowledge = t[4]
|
|
self.bool = t[5]
|
|
self.session = t[6]
|
|
|
|
def __str__(self):
|
|
res = "Principal Fact:"
|
|
res += "\nStep " + str(self.step)
|
|
res += "\nReadNextFrom " + str(self.readnextfrom)
|
|
res += "\nActor " + str(self.actor)
|
|
res += "\nRunKnowledge " + str(self.runknowledge)
|
|
res += "\nKnowledge " + str(self.knowledge)
|
|
#res += "\nBool " + str(self.bool)
|
|
res += "\nSession " + str(self.session)
|
|
return res + "\n"
|
|
|
|
def __repr__(self):
|
|
return str(self)
|
|
|
|
def getActor(self):
|
|
return self.actor
|
|
|
|
class TimeFact(Fact):
|
|
def __repr__(self):
|
|
return "Time " + Fact.__repr__(self)
|
|
|
|
class MessageFact(Fact):
|
|
def __init__(self,t):
|
|
self.step = t[0]
|
|
self.realsender = t[1]
|
|
self.claimsender = t[2]
|
|
self.recipient = t[3]
|
|
self.message = t[4]
|
|
self.session = t[5]
|
|
|
|
def __str__(self):
|
|
res = "Message Fact:"
|
|
res += "\nStep " + str(self.step)
|
|
res += "\nRealSender " + str(self.realsender)
|
|
res += "\nClaimSender " + str(self.claimsender)
|
|
res += "\nRecipient " + str(self.recipient)
|
|
res += "\nMessage " + str(self.message)
|
|
res += "\nSession " + str(self.session)
|
|
return res + "\n"
|
|
|
|
def __repr__(self):
|
|
return str(self)
|
|
|
|
def spdl(self):
|
|
res = ""
|
|
res += "(" + str(self.claimsender)
|
|
res += "," + str(self.recipient)
|
|
res += ", " + str(self.message)
|
|
res += " )"
|
|
return res
|
|
|
|
class State(list):
|
|
def __repr__(self):
|
|
return "State<" + list.__repr__(self) + ">"
|
|
|
|
class Label(object):
|
|
def __init__(self, name, category):
|
|
self.name = name
|
|
self.category = category
|
|
|
|
def __str__(self):
|
|
return "lb=" + self.name + ",type=" + self.category
|
|
|
|
def __repr__(self):
|
|
return str(self)
|
|
|
|
class Rule(object):
|
|
def __init__(self,left=[],right=[]):
|
|
def sanitize(x):
|
|
if x == None:
|
|
return []
|
|
elif type(x) != list:
|
|
return [x]
|
|
else:
|
|
return x
|
|
|
|
self.left = sanitize(left)
|
|
self.right = sanitize(right)
|
|
self.label = None
|
|
self.actors = []
|
|
|
|
def setLabel(self,label):
|
|
self.label = label
|
|
|
|
def __str__(self):
|
|
res = "Rule:"
|
|
if self.label != None:
|
|
res += " (" + str(self.label) +")"
|
|
res += "\n"
|
|
if len(self.left) > 0:
|
|
res += str(self.left) + "\n"
|
|
if len(self.right) > 0:
|
|
if len(self.left) > 0:
|
|
res += "=>\n"
|
|
res += str(self.right) + "\n"
|
|
res += ".\n"
|
|
return res
|
|
|
|
def __repr__(self):
|
|
return str(self)
|
|
|
|
def getActors(self):
|
|
return self.actors
|
|
|
|
def getFacts(self):
|
|
return self.left + self.right
|
|
|
|
|
|
class InitialRule(Rule):
|
|
|
|
def __str__(self):
|
|
return "Initial " + Rule.__str__(self)
|
|
|
|
|
|
class MessageRule(Rule):
|
|
|
|
def __init__(self,left=[],right=[]):
|
|
Rule.__init__(self,left,right)
|
|
self.actors = []
|
|
# Add actors
|
|
for fact in self.getFacts():
|
|
actor = fact.getActor()
|
|
if actor != None and actor not in self.actors:
|
|
self.actors.append(actor)
|
|
# Read/Send, before/after
|
|
self.readFact = None
|
|
self.before = None
|
|
for fact in self.left:
|
|
if type(fact) == MessageFact:
|
|
self.readFact = fact
|
|
elif type(fact) == PrincipalFact:
|
|
self.before = fact
|
|
self.sendFact = None
|
|
self.after = None
|
|
for fact in self.right:
|
|
if type(fact) == MessageFact:
|
|
self.sendFact = fact
|
|
elif type(fact) == PrincipalFact:
|
|
self.after = fact
|
|
|
|
if self.before == None or self.after == None:
|
|
print "Warning: rule does not have both principal facts."
|
|
print self
|
|
|
|
def __str__(self):
|
|
return "Message " + Rule.__str__(self)
|
|
|
|
def getStepFrom(self):
|
|
if self.before != None:
|
|
return self.before.step
|
|
else:
|
|
return -1
|
|
|
|
def getStepTo(self):
|
|
if self.after != None:
|
|
return self.after.step
|
|
else:
|
|
return -1
|
|
|
|
|
|
class GoalRule(Rule):
|
|
def __str__(self):
|
|
return "Goal " + Rule.__str__(self)
|
|
|
|
class CorrespondenceRule(GoalRule):
|
|
def __init__(self, l):
|
|
GoalRule.__init__(self,l,None)
|
|
|
|
def __str__(self):
|
|
return "Correspondence " + GoalRule.__str__(self)
|
|
|
|
class SecrecyRule(GoalRule):
|
|
def __init__(self, l):
|
|
GoalRule.__init__(self,l,None)
|
|
|
|
def __str__(self):
|
|
return "Secrecy " + GoalRule.__str__(self)
|
|
|
|
class STSecrecyRule(GoalRule):
|
|
def __init__(self, l):
|
|
GoalRule.__init__(self,l,None)
|
|
|
|
def __str__(self):
|
|
return "Short-term Secrecy " + GoalRule.__str__(self)
|
|
|
|
class AuthenticateRule(GoalRule):
|
|
def __init__(self, l):
|
|
GoalRule.__init__(self,l,None)
|
|
|
|
def __str__(self):
|
|
return "Authenticate " + GoalRule.__str__(self)
|
|
|
|
class Protocol(list):
|
|
def setFilename(self, filename):
|
|
self.path = os.path.dirname(filename)
|
|
self.filename = os.path.basename(filename)
|
|
|
|
# Get head of filename (until first dot)
|
|
def getBaseName(self):
|
|
parts = self.filename.split(".")
|
|
if parts[0] == "":
|
|
return "None"
|
|
else:
|
|
return parts[0]
|
|
|
|
# Construct protocol name from filename
|
|
def getName(self):
|
|
return self.getBaseName()
|
|
|
|
|