- Rewrote quite some code, better basic Message handling.
This commit is contained in:
		
							parent
							
								
									4a638edb72
								
							
						
					
					
						commit
						cb62517cd9
					
				| @ -6,49 +6,56 @@ | |||||||
| # | # | ||||||
| firstone = True | firstone = True | ||||||
| 
 | 
 | ||||||
| class Atomic(object): | class Message(object): | ||||||
|  | 	pass | ||||||
|  | 
 | ||||||
|  | class Constant(Message): | ||||||
| 	def __init__ (self,type,s,optprime=""): | 	def __init__ (self,type,s,optprime=""): | ||||||
| 		self.type = type | 		self.type = type | ||||||
| 		self.str = s + optprime | 		self.prime = optprime | ||||||
|  | 		self.str = s | ||||||
| 	 | 	 | ||||||
| 	def __str__(self): | 	def __str__(self): | ||||||
| 		return self.str | 		return self.str + self.prime | ||||||
| 
 | 
 | ||||||
| 	def __repr__(self): | 	def __repr__(self): | ||||||
| 		return str(self) | 		return str(self) | ||||||
| 
 | 
 | ||||||
| class Variable(Atomic): | class Variable(Constant): | ||||||
| 	pass | 	pass | ||||||
| 
 | 
 | ||||||
| class TypedConstant(Atomic): | class PublicKey(Constant): | ||||||
| 	pass | 	pass | ||||||
| 
 | 
 | ||||||
| class Special(Atomic): | class Composed(Message): | ||||||
| 	def __init__ (self,x): | 	def __init__ (self,m1,m2): | ||||||
| 		Atomic.__init__(self, "special", x) | 		self.left = m1 | ||||||
|  | 		self.right = m2 | ||||||
|  | 	 | ||||||
|  | 	def __str__(self): | ||||||
|  | 		return str(self.left) + str(self.right) | ||||||
| 
 | 
 | ||||||
| class Message(list): | class PublicCrypt(Message): | ||||||
| 	def subType(self): | 	def __init__ (self,key,message): | ||||||
| 		return "(generic)" | 		self.key = key | ||||||
|  | 		self.message = message | ||||||
| 
 | 
 | ||||||
| 	def __str__(self): | 	def __str__(self): | ||||||
| 		if self[0] == "crypt": | 		return "{" + str(self.message) + "}" + str(self.key) + " " | ||||||
| 			return "{" + str(self[2]) + "}" + str(self[1]) + " " |  | ||||||
| 		else: |  | ||||||
| 			res = "" |  | ||||||
| 			for s in self: |  | ||||||
| 				if res != "": |  | ||||||
| 					res += "," |  | ||||||
| 				res += str(s) |  | ||||||
| 			return res |  | ||||||
| 
 | 
 | ||||||
| 	def __repr__(self): | class SymmetricCrypt(PublicCrypt): | ||||||
| 		return "Message" + self.subType() + "<" + str(self) + ">" | 	pass | ||||||
| 
 | 
 | ||||||
|  | class XOR(Message): | ||||||
|  | 	def __init__ (self, m1,m2): | ||||||
|  | 		self.left = m1 | ||||||
|  | 		self.right = m2 | ||||||
|  | 	 | ||||||
|  | 	def __str__(self): | ||||||
|  | 		return str(self.left) + " xor " + str(self.right) | ||||||
| 
 | 
 | ||||||
| class MsgList(list): | class MsgList(list): | ||||||
| 	def __repr__(self): | 	pass | ||||||
| 		return "Msglist<" + list.__repr__(self) + ">" |  | ||||||
| 
 | 
 | ||||||
| class Fact(list): | class Fact(list): | ||||||
| 	def __repr__(self): | 	def __repr__(self): | ||||||
|  | |||||||
| @ -28,6 +28,9 @@ def ruleParser (): | |||||||
| 	# ------------------------------------------------------ | 	# ------------------------------------------------------ | ||||||
| 
 | 
 | ||||||
| 	# Tokens | 	# Tokens | ||||||
|  | 	lbrX = Literal("(") | ||||||
|  | 	rbrX = Literal(")") | ||||||
|  | 	commaX = Literal(",") | ||||||
| 	lbr = Literal("(").suppress() | 	lbr = Literal("(").suppress() | ||||||
| 	rbr = Literal(")").suppress() | 	rbr = Literal(")").suppress() | ||||||
| 	comma = Literal(",").suppress() | 	comma = Literal(",").suppress() | ||||||
| @ -48,15 +51,20 @@ def ruleParser (): | |||||||
| 	# Time | 	# Time | ||||||
| 	nTime = Number | 	nTime = Number | ||||||
| 	xTime = Literal("xTime") | 	xTime = Literal("xTime") | ||||||
| 	sTime = Literal("s") + lbr + Group(Number) + rbr | 	sTime = Literal("s") + lbrX + Number + rbrX | ||||||
| 	Time = Or([nTime,xTime,sTime]) | 	Time = Or([nTime,xTime,sTime]) | ||||||
| 
 | 
 | ||||||
| 	# Const | 	# Const | ||||||
| 	Const = Forward() | 	Const = Forward() | ||||||
| 	ConstC = Literal("c") + lbr + Constant + comma + Time + rbr | 	ConstC = Literal("c") + lbrX + Constant + commaX + Time + rbrX | ||||||
| 	ConstF = Literal("c(ni,ni)") | 	ConstF = Literal("c(ni,ni)") | ||||||
| 	Const << Or ([ Constant, ConstC, ConstF ]) | 	Const << Or ([ Constant, ConstC, ConstF ]) | ||||||
| 
 | 
 | ||||||
|  | 	def stringize(s,l,t): | ||||||
|  | 		return [ "".join(t) ] | ||||||
|  | 
 | ||||||
|  | 	Const.setParseAction(stringize) | ||||||
|  | 
 | ||||||
| 	# Optional prime | 	# Optional prime | ||||||
| 	def optprimeaction(s,l,t): | 	def optprimeaction(s,l,t): | ||||||
| 		if len(t) == 0: | 		if len(t) == 0: | ||||||
| @ -82,7 +90,7 @@ def ruleParser (): | |||||||
| 	## is not in the BNF. | 	## is not in the BNF. | ||||||
| 	TypedConstant = TypeInfo + lbr + Const + rbr + optprime | 	TypedConstant = TypeInfo + lbr + Const + rbr + optprime | ||||||
| 	TypedConstant.setParseAction(lambda s,l,t: [ | 	TypedConstant.setParseAction(lambda s,l,t: [ | ||||||
| 				If.TypedConstant(t[0],t[1],t[2]) ]) | 				If.Constant(t[0],t[1],t[2]) ]) | ||||||
| 	Atomic = Or(TypedConstant, Variable) | 	Atomic = Or(TypedConstant, Variable) | ||||||
| 
 | 
 | ||||||
| 	### TEST | 	### TEST | ||||||
| @ -99,27 +107,38 @@ def ruleParser (): | |||||||
| 
 | 
 | ||||||
| 	# Agents etc | 	# Agents etc | ||||||
| 	AgentMr = Literal("mr") + lbr + Const + rbr | 	AgentMr = Literal("mr") + lbr + Const + rbr | ||||||
| 	AgentMr.setParseAction(lambda s,l,t: [ If.TypedConstant("mr",t[1]) ]) | 	AgentMr.setParseAction(lambda s,l,t: [ If.Constant(t[0],t[1]) ]) | ||||||
| 	Agent = Or ([AgentMr, Variable]) | 	Agent = Or ([AgentMr, Variable]) | ||||||
|  | 
 | ||||||
|  | 	# TODO Not implemented yet | ||||||
| 	KeyTable = Or ([Literal("table") + lbr + Const + rbr, Variable]) | 	KeyTable = Or ([Literal("table") + lbr + Const + rbr, Variable]) | ||||||
| 	KeyTableApp = Literal("tb") + lbr + KeyTable + comma + Agent + rbr + optprime | 	KeyTableApp = Literal("tb") + lbr + KeyTable + comma + Agent + rbr + optprime | ||||||
| 
 | 
 | ||||||
| 	# Crypto | 	# Crypto | ||||||
| 	pkterm = Literal("pk") + lbr + Const + rbr + optprime | 	pkterm = Literal("pk") + lbr + Const + rbr + optprime | ||||||
| 	varterm = Variable + optprime | 	pkterm.setParseAction(lambda s,l,t: [ If.PublicKey(t[0],t[1],t[2]) ]) | ||||||
|  | 	##varterm = Variable + optprime		### Variable already has an optprime | ||||||
|  | 	varterm = Variable		 | ||||||
|  | 
 | ||||||
| 	Invertible = Or( [pkterm, KeyTableApp, varterm]) | 	Invertible = Or( [pkterm, KeyTableApp, varterm]) | ||||||
| 	PublicCypher = Literal("crypt") + lbr + Invertible + comma + Message + rbr | 	PublicCypher = Literal("crypt") + lbr + Invertible + comma + Message + rbr | ||||||
|  | 	PublicCypher.setParseAction(lambda s,l,t: [ If.PublicCrypt(t[1],t[2]) ]) | ||||||
| 	XOR = Literal("rcrypt") + lbr + Message + comma + Message + rbr | 	XOR = Literal("rcrypt") + lbr + Message + comma + Message + rbr | ||||||
|  | 	XOR.setParseAction(lambda s,l,t: [ If.XOR(t[1],t[2]) ]) | ||||||
| 	SymmetricCypher = Literal("scrypt") + lbr + Message + comma + Message + rbr | 	SymmetricCypher = Literal("scrypt") + lbr + Message + comma + Message + rbr | ||||||
|  | 	SymmetricCypher.setParseAction(lambda s,l,t: [ If.SymmetricCrypt(t[1],t[2]) ]) | ||||||
|  | 
 | ||||||
|  | 	# TODO Not implemented yet | ||||||
| 	futerm = Or([ Literal("fu") + lbr + Const + rbr, Variable ]) | 	futerm = Or([ Literal("fu") + lbr + Const + rbr, Variable ]) | ||||||
| 	Function = Literal("funct") + lbr + futerm + comma + Message + rbr | 	Function = Literal("funct") + lbr + futerm + comma + Message + rbr | ||||||
| 	 | 	 | ||||||
| 	# Message composition |  | ||||||
| 	Concatenation = Literal("c").suppress() + lbr + Message + comma + Message + rbr | 	Concatenation = Literal("c").suppress() + lbr + Message + comma + Message + rbr | ||||||
|  | 	Concatenation.setParseAction(lambda s,l,t: [ If.Composed(t[0],t[1]) ]) | ||||||
|  | 
 | ||||||
|  | 	# Message composition | ||||||
| 	Composed = Or([ Concatenation, SymmetricCypher, XOR, | 	Composed = Or([ Concatenation, SymmetricCypher, XOR, | ||||||
| 			PublicCypher, Function, KeyTable, KeyTableApp ]) | 			PublicCypher, Function, KeyTable, KeyTableApp ]) | ||||||
| 	Message << Or ([Composed, Atomic]) | 	Message << Or ([Composed, Atomic]) | ||||||
| 	Message.setParseAction(lambda s,l,t: [ If.Message(t) ]) |  | ||||||
| 
 | 
 | ||||||
| 	### TEST | 	### TEST | ||||||
| 	#print Message.parseString("nonce(c(Na,xTime))") | 	#print Message.parseString("nonce(c(Na,xTime))") | ||||||
| @ -132,15 +151,14 @@ def ruleParser (): | |||||||
| 	Session = Forward() | 	Session = Forward() | ||||||
| 	Session << Or ([ Literal("s") + lbr + Session + rbr, Number, Variable ]) | 	Session << Or ([ Literal("s") + lbr + Session + rbr, Number, Variable ]) | ||||||
| 	MsgEtc = Literal("etc") | 	MsgEtc = Literal("etc") | ||||||
| 	MsgEtc.setParseAction(lambda s,l,t: [ If.Message([ If.Special("etc") ]) ]) | 	MsgEtc.setParseAction(lambda s,l,t: [ If.MsgList([If.Constant("special","etc") ]) ]) | ||||||
| 	MsgVariable = Group(Variable) | 	MsgVar = Group(Variable) | ||||||
| 	MsgVariable.setParseAction(lambda s,l,t: [ If.Message(t[0]) ]) | 	MsgVar.setParseAction(lambda s,l,t: [ If.MsgList(t) ]) | ||||||
| 
 | 
 | ||||||
| 	MsgList = Forward() | 	MsgList = Forward() | ||||||
| 	MsgComp = Literal("c") + lbr + Message + comma + MsgList + rbr | 	MsgComp = Literal("c") + lbr + Message + comma + MsgList + rbr | ||||||
| 	MsgComp.setParseAction(lambda s,l,t: [t[1]] + t[2]) | 	MsgComp.setParseAction(lambda s,l,t: [ If.MsgList([ t[1] ]) + t[2] ]) | ||||||
| 	MsgList << Or ([ MsgEtc, MsgVariable, MsgComp ]) | 	MsgList << Or ([ MsgEtc, Variable, MsgComp ]) | ||||||
| 	MsgList.setParseAction(lambda s,l,t: [ If.MsgList(t) ]) |  | ||||||
| 
 | 
 | ||||||
| 	Step = Or ([ Number, Variable ]) | 	Step = Or ([ Number, Variable ]) | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user