From 1bd19b13ab91c8161e7bd068ed84c27abb557c30 Mon Sep 17 00:00:00 2001 From: Letitia Li <leli@enst.fr> Date: Fri, 25 Mar 2016 15:22:23 +0000 Subject: [PATCH] security pattern backtracing --- src/tmltranslator/TMLModeling.java | 84 +++++++++++++++++++++- src/tmltranslator/toavatar/TML2Avatar.java | 19 +++-- src/ui/tmlcompd/TMLCPrimitivePort.java | 48 ++++++++++--- 3 files changed, 129 insertions(+), 22 deletions(-) diff --git a/src/tmltranslator/TMLModeling.java b/src/tmltranslator/TMLModeling.java index 9901579b64..0bc9fc62b4 100755 --- a/src/tmltranslator/TMLModeling.java +++ b/src/tmltranslator/TMLModeling.java @@ -63,8 +63,9 @@ public class TMLModeling { private ArrayList<String[]> pragmas; public ArrayList<String> securityPatterns=new ArrayList<String>(); private TMLElement correspondance[]; - + public ArrayList<SecurityPattern> secPatterns = new ArrayList<SecurityPattern>(); private boolean optimized = false; + public HashMap<String, String> secChannelMap = new HashMap<String, String>(); private String[] ops = {">", "<", "+", "-", "*", "/", "[", "]", "(", ")", ":", "=", "==", ","}; @@ -634,6 +635,19 @@ public class TMLModeling { ev.port2.mappingName=mappingName; } } + String channelName=secChannelMap.get(attr.getName()); + if (channelName!=null){ + System.out.println("CHANNEL FOUND "+channelName); + channel = getChannelByName(channelName); + if (channel!=null){ + for (TMLCPrimitivePort port:channel.ports){ + if (port.checkConf){ + port.checkSecConfStatus = 2; + port.secName= attr.getName(); + } +} + } + } for (TMLTask t:getTasks()){ if (t.getReferenceObject()==null){ continue; @@ -683,6 +697,19 @@ public class TMLModeling { ev.port2.mappingName= mappingName; } } + String channelName=secChannelMap.get(attr.getName()); + System.out.println("CHANNEL FOUND "+channelName); + if (channelName!=null){ + channel = getChannelByName(channelName); + if (channel!=null){ + for (TMLCPrimitivePort port:channel.ports){ + if (port.checkConf){ + port.checkSecConfStatus = 3; + port.secName= attr.getName(); + } + } + } +} for (TMLTask t:getTasks()){ if (t.getReferenceObject() instanceof TMLCPrimitiveComponent){ TMLCPrimitiveComponent comp = (TMLCPrimitiveComponent) t.getReferenceObject(); @@ -703,6 +730,7 @@ public class TMLModeling { } public void backtraceAuthenticity(LinkedList<String> satisfiedAuthenticity, LinkedList<String> satisfiedWeakAuthenticity,LinkedList<String> nonSatisfiedAuthenticity, String mappingName){ for (String s: satisfiedAuthenticity){ + System.out.println("authenticity" +s); String signalName = s.split("__chData")[0]; for (TMLTask t: getTasks()){ if (signalName.contains(t.getName())){ @@ -750,6 +778,25 @@ public class TMLModeling { ev.port2.mappingName= mappingName; } } + + signalName = s.split("__decrypt")[0]; + for (TMLTask t: getTasks()){ + if (signalName.contains(t.getName())){ + signalName = signalName.replace(t.getName()+"__",""); + } + } + System.out.println("auth on "+signalName); + String channelName=secChannelMap.get(signalName); + System.out.println("auth channel "+channelName); + channel = getChannelByName(channelName); + if (channel!=null){ + for (TMLCPrimitivePort port:channel.ports){ + if (port.checkAuth){ + port.checkSecStrongAuthStatus = 2; + port.secName= signalName; + } + } + } } for (String s: satisfiedWeakAuthenticity){ String signalName = s.split("__chData")[0]; @@ -799,6 +846,22 @@ public class TMLModeling { ev.port2.mappingName= mappingName; } } + signalName = s.split("__decrypt")[0]; + for (TMLTask t: getTasks()){ + if (signalName.contains(t.getName())){ + signalName = signalName.replace(t.getName()+"__",""); + } + } + String channelName=secChannelMap.get(signalName); + channel = getChannelByName(channelName); + if (channel!=null){ + for (TMLCPrimitivePort port:channel.ports){ + if (port.checkAuth){ + port.checkSecWeakAuthStatus = 2; + port.secName= signalName; + } + } + } } for (String s: nonSatisfiedAuthenticity){ String signalName = s.split("__chData")[0]; @@ -848,6 +911,24 @@ public class TMLModeling { ev.port2.mappingName= mappingName; } } + signalName = s.split("__decrypt")[0]; + for (TMLTask t: getTasks()){ + if (signalName.contains(t.getName())){ + signalName = signalName.replace(t.getName()+"__",""); + } + } + String channelName=secChannelMap.get(signalName); + if (channelName!=null){ + channel = getChannelByName(channelName); + if (channel!=null){ + for (TMLCPrimitivePort port:channel.ports){ + if (port.checkAuth){ + port.checkSecStrongAuthStatus = 3; + port.secName= signalName; + } + } + } + } } } public void clearBacktracing(){ @@ -856,6 +937,7 @@ public class TMLModeling { if (port.checkConfStatus>1){ port.checkConfStatus=1; port.mappingName="???"; + port.secName=""; } if (port.checkStrongAuthStatus>1 || port.checkWeakAuthStatus>1){ port.checkStrongAuthStatus = 1; diff --git a/src/tmltranslator/toavatar/TML2Avatar.java b/src/tmltranslator/toavatar/TML2Avatar.java index 9efd4ff302..7676b7580a 100644 --- a/src/tmltranslator/toavatar/TML2Avatar.java +++ b/src/tmltranslator/toavatar/TML2Avatar.java @@ -78,10 +78,12 @@ public class TML2Avatar { HashMap<String, AvatarSignal> signalMap = new HashMap<String, AvatarSignal>(); public HashMap<String, Object> stateObjectMap = new HashMap<String, Object>(); + HashMap<String, String> secChannelMap = new HashMap<String, String>(); + HashMap<String, AvatarAttributeState> signalAuthOriginMap = new HashMap<String, AvatarAttributeState>(); HashMap<String, AvatarAttributeState> signalAuthDestMap = new HashMap<String, AvatarAttributeState>(); - ArrayList<SecurityPattern> secPatterns = new ArrayList<SecurityPattern>(); + public ArrayList<SecurityPattern> secPatterns = new ArrayList<SecurityPattern>(); List<AvatarSignal> signals = new ArrayList<AvatarSignal>(); private final static Integer channelPublic = 0; @@ -739,6 +741,7 @@ public class TML2Avatar { AvatarActionOnSignal as = new AvatarActionOnSignal(ae.getName(), sig, ae.getReferenceObject()); if (ae.securityPattern!=null){ + secChannelMap.put(ae.securityPattern.name,ch.getName()); System.out.println(block.getName() + " readchannel has security pattern" + ae.securityPattern.name); as.addValue(ae.securityPattern.name+"_encrypted"); AvatarAttribute data= new AvatarAttribute(ae.securityPattern.name+"_encrypted", AvatarType.INTEGER, block, null); @@ -810,6 +813,7 @@ public class TML2Avatar { as.addValue(ae.securityPattern.name+"_encrypted"); AvatarAttribute data= new AvatarAttribute(ae.securityPattern.name+"_encrypted", AvatarType.INTEGER, block, null); block.addAttribute(data); + secChannelMap.put(ae.securityPattern.name,ch.getName()); } else { as.addValue(ch.getName()+"__chData"); @@ -1045,15 +1049,6 @@ public class TML2Avatar { AvatarBlock block = new AvatarBlock(task.getName(), avspec, task.getReferenceObject()); - - tmlmap.getTMLModeling().securityPatterns.add("enc"); - for (String s:tmlmap.getTMLModeling().securityPatterns){ - System.out.println("Adding attr security pattern " + s); - AvatarAttribute tmp = new AvatarAttribute(s, AvatarType.INTEGER, block, null); - block.addAttribute(tmp); - tmp = new AvatarAttribute(s+"_encrypted", AvatarType.INTEGER, block, null); - block.addAttribute(tmp); - } taskBlockMap.put(task, block); //Add temp variable for unsendable signals AvatarAttribute tmp = new AvatarAttribute("tmp", AvatarType.INTEGER, block, null); @@ -1401,9 +1396,11 @@ public class TML2Avatar { //Check if we matched up all signals //System.out.println(avspec); - + tmlmap.getTMLModeling().secChannelMap = secChannelMap; return avspec; } + + // public void backtracePatterns(List<Stri public void backtraceReachability(List<String> reachableStates, List<String> nonReachableStates){ for (String s: reachableStates){ diff --git a/src/ui/tmlcompd/TMLCPrimitivePort.java b/src/ui/tmlcompd/TMLCPrimitivePort.java index a59b21a479..d360f8e31a 100755 --- a/src/ui/tmlcompd/TMLCPrimitivePort.java +++ b/src/ui/tmlcompd/TMLCPrimitivePort.java @@ -84,6 +84,12 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent //Security Verification public int checkConfStatus; + + public int checkSecConfStatus; + public int checkSecWeakAuthStatus; + public int checkSecStrongAuthStatus; + public String secName=""; + public int checkWeakAuthStatus; public int checkStrongAuthStatus; public boolean checkConf; @@ -304,7 +310,7 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent if (checkConf && isOrigin){ drawConfVerification(g); } - if (checkAuth && !isOrigin){ + if (checkAuth && !isOrigin && !secName.equals("")){ drawAuthVerification(g); } g.setFont(fold); @@ -316,10 +322,11 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent public void drawAuthVerification(Graphics g){ + g.drawString(secName, x-20, y+8); Color c = g.getColor(); Color c1; Color c2; - switch(checkStrongAuthStatus) { + switch(checkSecStrongAuthStatus) { case 2: c1 = Color.green; break; @@ -329,7 +336,7 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent default: c1 = Color.gray; } - switch(checkWeakAuthStatus) { + switch(checkSecWeakAuthStatus) { case 2: c2 = Color.green; break; @@ -340,12 +347,12 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent c2= c1; } - g.drawOval(x-16, y, 10, 15); + g.drawOval(x-18, y+8, 10, 15); g.setColor(c1); - int[] xps = new int[]{x-18, x-18, x-2}; - int[] yps = new int[]{y+6, y+20, y+20}; - int[] xpw = new int[]{x-2, x-2, x-18}; - int[] ypw = new int[]{y+20, y+6, y+6}; + int[] xps = new int[]{x-20, x-20, x-4}; + int[] yps = new int[]{y+14, y+28, y+28}; + int[] xpw = new int[]{x-4, x-4, x-20}; + int[] ypw = new int[]{y+28, y+14, y+14}; g.fillPolygon(xps, yps,3); g.setColor(c2); @@ -353,8 +360,8 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent g.setColor(c); g.drawPolygon(xps, yps,3); g.drawPolygon(xpw, ypw, 3); - g.drawString("S", x-16, y+18); - g.drawString("W", x-9, y+14); + g.drawString("S", x-18, y+26); + g.drawString("W", x-11, y+22); } public void drawConfVerification(Graphics g){ Color c = g.getColor(); @@ -381,6 +388,27 @@ public abstract class TMLCPrimitivePort extends TGCScalableWithInternalComponent + if (!secName.equals("")){ + switch(checkSecConfStatus) { + case 1: + c1 = Color.gray; + break; + case 2: + c1 = Color.green; + break; + case 3: + c1 = Color.red; + break; + default: + return; + } + g.drawString(secName, x-20, y+20); + g.drawOval(x-10, y+22, 6, 9); + g.setColor(c1); + g.fillRect(x-12, y+24, 9, 7); + g.setColor(c); + g.drawRect(x-12, y+24, 9, 7); + } } public void manageMove() { -- GitLab