diff --git a/src/main/java/avatartranslator/AvatarPragmaLatency.java b/src/main/java/avatartranslator/AvatarPragmaLatency.java index 6a23fca0a06af607acb39da8feaf2e4775c83067..19db85bb5ea2a131b2ca659ff004619c837775df 100644 --- a/src/main/java/avatartranslator/AvatarPragmaLatency.java +++ b/src/main/java/avatartranslator/AvatarPragmaLatency.java @@ -57,6 +57,7 @@ public class AvatarPragmaLatency extends AvatarPragma { private int symbolType; public static final int lessThan =1; public static final int greaterThan=2; + public static final int query=3; private int time; private List<String> id1; private List<String> id2; diff --git a/src/main/java/avatartranslator/AvatarSpecification.java b/src/main/java/avatartranslator/AvatarSpecification.java index 0c792f13fe732be166909be5c7d5fe652c982b05..0da19ddeffee3c42a2461c51220262709b84eaa6 100644 --- a/src/main/java/avatartranslator/AvatarSpecification.java +++ b/src/main/java/avatartranslator/AvatarSpecification.java @@ -222,7 +222,6 @@ public class AvatarSpecification extends AvatarElement { } public void addLatencyPragma(AvatarPragmaLatency _pragma) { - System.out.println(_pragma); latency_pragmas.add(_pragma); } diff --git a/src/main/java/avatartranslator/AvatarStateMachine.java b/src/main/java/avatartranslator/AvatarStateMachine.java index ece3482dea29c7f19114bd3b0974a401f211c373..0665d8478ddddafdfc1561fc87305afad1b4045b 100644 --- a/src/main/java/avatartranslator/AvatarStateMachine.java +++ b/src/main/java/avatartranslator/AvatarStateMachine.java @@ -1080,17 +1080,17 @@ public class AvatarStateMachine extends AvatarElement { } - public AvatarActionOnSignal getAOSWithName(String _name){ + public List<AvatarActionOnSignal> getAllAOSWithName(String _name){ + List<AvatarActionOnSignal> list = new ArrayList<AvatarActionOnSignal>(); for(AvatarStateMachineElement element: elements) { if (element instanceof AvatarActionOnSignal) { AvatarActionOnSignal aaos = (AvatarActionOnSignal) element; - System.out.println("element " + aaos.getSignal().getName()); if (aaos.getSignal().getName().compareTo(_name) == 0) { - return aaos; + list.add(aaos); } } } - return null; + return list; } // All transitions reaching a state that has an internal start state diff --git a/src/main/java/tmltranslator/TMLModeling.java b/src/main/java/tmltranslator/TMLModeling.java index 26fb4ed6695db61e5a773452e6225998acd7ba26..94915b9061828ec0231a9d2812f1d5253482f52b 100755 --- a/src/main/java/tmltranslator/TMLModeling.java +++ b/src/main/java/tmltranslator/TMLModeling.java @@ -99,7 +99,7 @@ public class TMLModeling<E> { } } - public void addSec(SecurityPattern sp){ + public void addSecurityPattern(SecurityPattern sp){ if (!secPatterns.contains(sp)){ secPatterns.add(sp); } diff --git a/src/main/java/tmltranslator/toavatar/TML2Avatar.java b/src/main/java/tmltranslator/toavatar/TML2Avatar.java index 18fcac7d0d54856f2c85bba59785bee97d6b4df7..6485bfd7205f8aba47a15d79be2c8f711b16794c 100644 --- a/src/main/java/tmltranslator/toavatar/TML2Avatar.java +++ b/src/main/java/tmltranslator/toavatar/TML2Avatar.java @@ -655,18 +655,18 @@ public class TML2Avatar { as.addNext(tran); elementList.add(as); elementList.add(tran); - if (security || ae.securityPattern==null){ + if (security && ae.securityPattern!=null){ if (ae.securityPattern!=null && ae.getName().contains("encrypt")){ secPatterns.add(ae.securityPattern); - block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null)); - block.addAttribute(new AvatarAttribute(ae.securityPattern.name+"_encrypted", AvatarType.INTEGER, block, null)); if (ae.securityPattern.type.equals("Advanced")){ tran.addAction(ae.securityPattern.formula); } else if (ae.securityPattern.type.equals("Symmetric Encryption")){ + block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block,null)); + block.addAttribute(new AvatarAttribute(ae.securityPattern.name+"_encrypted", AvatarType.INTEGER, block,null)); + block.addAttribute(new AvatarAttribute("key_"+ae.securityPattern.name, AvatarType.INTEGER, block,null)); if (!ae.securityPattern.nonce.isEmpty()){ block.addAttribute(new AvatarAttribute(ae.securityPattern.nonce, AvatarType.INTEGER, block, null)); - block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block,null)); AvatarMethod concat2 = new AvatarMethod("concat2",ae); concat2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name)); concat2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.nonce)); @@ -694,7 +694,9 @@ public class TML2Avatar { AvatarMethod sencrypt = new AvatarMethod("sencrypt", ae); sencrypt.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name)); sencrypt.addParameter(block.getAvatarAttributeWithName("key_"+ae.securityPattern.name)); + sencrypt.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name+"_encrypted")); if (block.getAvatarAttributeWithName(ae.securityPattern.name)!=null && block.getAvatarAttributeWithName("key_"+ae.securityPattern.name)!=null){ + System.out.println("adding method sencrypt"); block.addMethod(sencrypt); } tran.addAction(ae.securityPattern.name+"_encrypted = sencrypt("+ae.securityPattern.name+", key_"+ae.securityPattern.name+")"); @@ -719,6 +721,7 @@ public class TML2Avatar { block.addAttribute(new AvatarAttribute("encryptedKey_"+ae.securityPattern.key, AvatarType.INTEGER, block,null)); aencrypt.addParameter(block.getAvatarAttributeWithName("key_"+ae.securityPattern.key)); aencrypt.addParameter(block.getAvatarAttributeWithName("pubKey_"+ae.securityPattern.name)); + aencrypt.addReturnParameter(block.getAvatarAttributeWithName("encryptedKey_"+ae.securityPattern.key)); if (block.getAvatarAttributeWithName("key_"+ae.securityPattern.key)!=null && block.getAvatarAttributeWithName("pubKey_"+ae.securityPattern.name)!=null){ block.addMethod(aencrypt); } @@ -726,8 +729,12 @@ public class TML2Avatar { } else { AvatarMethod aencrypt = new AvatarMethod("aencrypt", ae); + block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null)); + block.addAttribute(new AvatarAttribute("pubKey_"+ae.securityPattern.name, AvatarType.INTEGER, block, null)); + block.addAttribute(new AvatarAttribute(ae.securityPattern.name+"_encrypted", AvatarType.INTEGER, block, null)); aencrypt.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name)); aencrypt.addParameter(block.getAvatarAttributeWithName("pubKey_"+ae.securityPattern.name)); + aencrypt.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name+"_encrypted")); if (block.getAvatarAttributeWithName("pubKey_"+ae.securityPattern.name)!=null && block.getAvatarAttributeWithName(ae.securityPattern.name)!=null){ block.addMethod(aencrypt); } @@ -756,31 +763,40 @@ public class TML2Avatar { tran.addAction(ae.securityPattern.name+"_encrypted = hash("+ae.securityPattern.name+")"); } else if (ae.securityPattern.type.equals("MAC")){ + + if (!ae.securityPattern.nonce.isEmpty()){ + AvatarMethod concat = new AvatarMethod("concat2", ae); + concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name)); + concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.nonce)); + concat.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name)); + block.addMethod(concat); + tran.addAction(ae.securityPattern.name+"=concat2("+ae.securityPattern.name+","+ae.securityPattern.nonce+")"); + } + AvatarMethod mac = new AvatarMethod("MAC", ae); AvatarAttribute macattr = new AvatarAttribute(ae.securityPattern.name +"_mac", AvatarType.INTEGER, block, null); block.addAttribute(macattr); + + block.addAttribute(new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null)); + block.addAttribute(new AvatarAttribute("key_"+ae.securityPattern.name, AvatarType.INTEGER, block, null)); + block.addAttribute(new AvatarAttribute(ae.securityPattern.name+"_encrypted", AvatarType.INTEGER, block, null)); + mac.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name)); mac.addParameter(block.getAvatarAttributeWithName("key_"+ae.securityPattern.name)); mac.addReturnParameter(macattr); + if (block.getAvatarAttributeWithName(ae.securityPattern.name)!=null && block.getAvatarAttributeWithName("key_"+ae.securityPattern.name)!=null){ block.addMethod(mac); } - if (!ae.securityPattern.nonce.isEmpty()){ - AvatarMethod concat = new AvatarMethod("concat2", ae); - concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name)); - concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.nonce)); - concat.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name)); - block.addMethod(concat); - tran.addAction(ae.securityPattern.name+"=concat2("+ae.securityPattern.name+","+ae.securityPattern.nonce+")"); - } + tran.addAction(ae.securityPattern.name+"_mac = MAC("+ae.securityPattern.name+",key_"+ae.securityPattern.name+")"); AvatarMethod concat = new AvatarMethod("concat2", ae); concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name)); - concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name)); + concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name+"_mac")); concat.addReturnParameter(block.getAvatarAttributeWithName(ae.securityPattern.name+"_encrypted")); //concat.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.)); - if (block.getAvatarAttributeWithName(ae.securityPattern.name)!=null){ + if (block.getAvatarAttributeWithName(ae.securityPattern.name)!=null && block.getAvatarAttributeWithName(ae.securityPattern.name+"_encrypted")!=null){ block.addMethod(concat); } tran.addAction(ae.securityPattern.name+"_encrypted = concat2("+ae.securityPattern.name +","+ae.securityPattern.name+"_mac)"); @@ -983,7 +999,7 @@ public class TML2Avatar { } } else { - // + //Translate state without security } } else if (ae instanceof TMLActivityElementWithIntervalAction){ @@ -1363,8 +1379,12 @@ public class TML2Avatar { //TODO: Make state names readable //TODO: Put back numeric guards //TODO: Calcuate for temp variable - this.avspec = new AvatarSpecification("spec", tmlmap.getTMLModeling().getTGComponent().getTDiagramPanel().tp); - + if (tmlmap.getTMLModeling().getTGComponent()!=null){ + this.avspec = new AvatarSpecification("spec", tmlmap.getTMLModeling().getTGComponent().getTDiagramPanel().tp); + } + else { + this.avspec = new AvatarSpecification("spec", null); + } attrsToCheck.clear(); //tmlmodel.removeForksAndJoins(); //Only set the loop limit if it's a number diff --git a/src/main/java/ui/AvatarDesignPanel.java b/src/main/java/ui/AvatarDesignPanel.java index db4ac08e11083f980d893f530a75269e30931baf..f27b44af6261637c06c8f26caf31251f56186fc9 100644 --- a/src/main/java/ui/AvatarDesignPanel.java +++ b/src/main/java/ui/AvatarDesignPanel.java @@ -408,21 +408,25 @@ public class AvatarDesignPanel extends TURTLEPanel { } if (pragma.getSymbolType() == AvatarPragmaLatency.lessThan){ if (time<refTime){ - bdpragma.verifMap.put(s, AvatarBDSafetyPragma.PROVED_TRUE); + bdpragma.verifMap.put(s, "PROVED_TRUE"); //mark as true } else { - bdpragma.verifMap.put(s, AvatarBDSafetyPragma.PROVED_FALSE); + bdpragma.verifMap.put(s, "PROVED_FALSE"); } } - else { + else if (pragma.getSymbolType() == AvatarPragmaLatency.greaterThan) { if (time>refTime){ - bdpragma.verifMap.put(s, AvatarBDSafetyPragma.PROVED_TRUE); + bdpragma.verifMap.put(s, "PROVED_TRUE"); //mark as true } else { - bdpragma.verifMap.put(s, AvatarBDSafetyPragma.PROVED_FALSE); + bdpragma.verifMap.put(s, "PROVED_FALSE"); } + } + else if (pragma.getSymbolType() == AvatarPragmaLatency.query) { + //Draw average time on verif map + bdpragma.verifMap.put(s,Float.toString(time)); } } } diff --git a/src/main/java/ui/AvatarDesignPanelTranslator.java b/src/main/java/ui/AvatarDesignPanelTranslator.java index 43ce5a755a83667967714a178bceb269d4f7c3a6..9429b4f29e4989870b1888407d48ef9193c89ae0 100644 --- a/src/main/java/ui/AvatarDesignPanelTranslator.java +++ b/src/main/java/ui/AvatarDesignPanelTranslator.java @@ -220,7 +220,7 @@ public class AvatarDesignPanelTranslator { tgpp = (AvatarBDPerformancePragma)tgc; values = tgpp.getValues(); for (String s: values){ - AvatarPragmaLatency pragma = checkLatencyPragma(s, _blocks, _as, tgc); + AvatarPragmaLatency pragma = checkPerformancePragma(s, _blocks, _as, tgc); if (pragma!=null){ _as.addLatencyPragma(pragma); } @@ -229,8 +229,8 @@ public class AvatarDesignPanelTranslator { } } - public AvatarPragmaLatency checkLatencyPragma(String _pragma, List<AvatarBDBlock> _blocks, AvatarSpecification as, TGComponent tgc){ - if (_pragma.contains("=") || (!_pragma.contains(">") && !_pragma.contains("<")) || !_pragma.contains("Latency")){ + public AvatarPragmaLatency checkPerformancePragma(String _pragma, List<AvatarBDBlock> _blocks, AvatarSpecification as, TGComponent tgc){ + if (_pragma.contains("=") || (!_pragma.contains(">") && !_pragma.contains("<") && !_pragma.contains("?")) || !_pragma.contains("Latency")){ TraceManager.addDev("No latency expression found"); return null; } @@ -251,7 +251,7 @@ public class AvatarDesignPanelTranslator { String block1 = p1.split("\\.")[0]; String state1 = p1.split("\\.")[1]; AvatarBlock bl1; - AvatarActionOnSignal st1; + AvatarActionOnSignal st1=null; List<String> id1= new ArrayList<String>(); bl1 = as.getBlockWithName(block1); if (bl1==null){ @@ -259,16 +259,17 @@ public class AvatarDesignPanelTranslator { return null; } AvatarStateMachine asm = bl1.getStateMachine(); - st1 = asm.getAOSWithName(state1); - if (bl1 ==null || st1 ==null){ - TraceManager.addDev("State " + block1+ "." + state1 + " in pragma does not exist"); - return null; + for (AvatarActionOnSignal aaos: asm.getAllAOSWithName(state1)){ + if (aaos.getCheckLatency()){ + id1.add((aaos.getSignal().isIn() ? "Receive signal" : "Send signal") +"-"+ aaos.getSignal().getName()+":"+aaos.getID()); + st1= aaos; + } } - if (!st1.getCheckLatency()){ - TraceManager.addDev("State " + block1+ "." + state1 + " is not checkable"); + if (id1.size()==0){ + TraceManager.addDev("Cannot find checkable state " + block1+ "." + state1 + " in pragma"); return null; } - id1.add((st1.getSignal().isIn() ? "Receive signal" : "Send signal") +"-"+ st1.getSignal().getName()+":"+st1.getID()); + @@ -289,7 +290,7 @@ public class AvatarDesignPanelTranslator { AvatarBlock bl2; - AvatarActionOnSignal st2; + AvatarActionOnSignal st2=null; bl2 = as.getBlockWithName(block2); if (bl2==null){ @@ -297,19 +298,24 @@ public class AvatarDesignPanelTranslator { return null; } asm = bl2.getStateMachine(); - st2 = asm.getAOSWithName(state2); + List<String> id2= new ArrayList<String>(); - if (bl2 ==null || st2 ==null){ - TraceManager.addDev("State " + block2+ "." + state2 + " in pragma does not exist"); - return null; + for (AvatarActionOnSignal aaos: asm.getAllAOSWithName(state2)){ + + if (aaos.getCheckLatency()){ + id2.add((aaos.getSignal().isIn() ? "Receive signal" : "Send signal")+"-"+ aaos.getSignal().getName()+":"+aaos.getID()); + st2=aaos; + } } - if (!st2.getCheckLatency()){ - TraceManager.addDev("State " + block2+ "." + state2 + " is not checkable"); + + if (id2.size()==0){ + TraceManager.addDev("Cannot find checkable state " + block2+ "." + state2 + " in pragma"); return null; } + + + - id2.add((st2.getSignal().isIn() ? "Receive signal" : "Send signal")+"-"+ st2.getSignal().getName()+":"+st2.getID()); - String equation = pragma.split("\\)")[1]; equation = equation.replaceAll(" ",""); @@ -335,6 +341,9 @@ public class AvatarDesignPanelTranslator { return null; } } + else if (equation.substring(0,1).equals("?")){ + symbolType=AvatarPragmaLatency.query; + } else { TraceManager.addDev("No latency expression found"); diff --git a/src/main/java/ui/GTMLModeling.java b/src/main/java/ui/GTMLModeling.java index 6ff86a083c4da06b8d59b702c2fce2d2b99d092b..496165968e1c725c81229696bade2750823cfc73 100755 --- a/src/main/java/ui/GTMLModeling.java +++ b/src/main/java/ui/GTMLModeling.java @@ -1598,7 +1598,7 @@ public class GTMLModeling { if (!((TMLADEncrypt)tgc).securityContext.isEmpty()){ SecurityPattern securityPattern = new SecurityPattern(((TMLADEncrypt)tgc).securityContext, ((TMLADEncrypt)tgc).type, ((TMLADEncrypt)tgc).message_overhead, ((TMLADEncrypt)tgc).size, ((TMLADEncrypt)tgc).encTime, ((TMLADEncrypt)tgc).decTime, ((TMLADEncrypt)tgc).nonce, ((TMLADEncrypt)tgc).formula, ((TMLADEncrypt)tgc).key); securityPatterns.put(securityPattern.name, securityPattern); - tmlm.addSec(securityPattern); + tmlm.addSecurityPattern(securityPattern); ArrayList<TMLTask> l = new ArrayList<TMLTask>(); tmlm.securityTaskMap.put(securityPattern, l); TraceManager.addDev("Adding Security Pattern " + securityPattern.name); diff --git a/src/main/java/ui/MainGUI.java b/src/main/java/ui/MainGUI.java index d5d6218b602f1cbc20b0f2fb97db5eb67c9fbe1d..def6a1c7e7a76a0b5488444331f1defb23c57bcc 100644 --- a/src/main/java/ui/MainGUI.java +++ b/src/main/java/ui/MainGUI.java @@ -519,7 +519,7 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Pe } - private void initActions() { + public void initActions() { actions = new TGUIAction[TGUIAction.NB_ACTION]; for(int i=0; i<TGUIAction.NB_ACTION; i++) { actions[i] = new TGUIAction(i); @@ -6832,6 +6832,9 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Pe public void setPanelMode() { int index; TURTLEPanel tp = getCurrentTURTLEPanel(); + if (tp==null){ + return; + } index = tp.tabbedPane.getSelectedIndex(); if (index < tp.panels.size() -1) { diff --git a/src/main/java/ui/avatarbd/AvatarBDPerformancePragma.java b/src/main/java/ui/avatarbd/AvatarBDPerformancePragma.java index c72fefa4265945307b741c06ee2113ef6dd6030f..09a95a53bef5975c3ac694cb930bb76595cf8e9b 100644 --- a/src/main/java/ui/avatarbd/AvatarBDPerformancePragma.java +++ b/src/main/java/ui/avatarbd/AvatarBDPerformancePragma.java @@ -68,7 +68,7 @@ public class AvatarBDPerformancePragma extends TGCScalableWithoutInternalCompone protected String[] values; protected LinkedList<String> properties; - protected int textX = 25; + protected int textX = 40; protected int textY = 5; protected int marginY = 20; protected int marginX = 20; @@ -82,12 +82,9 @@ public class AvatarBDPerformancePragma extends TGCScalableWithoutInternalCompone private Font myFont;//, myFontB; // private int maxFontSize = 30; // private int minFontSize = 4; - public final static int PROVED_TRUE = 1; - public final static int PROVED_FALSE = 0; - public final static int PROVED_ERROR=2; private int currentFontSize = -1; private final String[] pPragma = {"A[]", "A<>", "E[]", "E<>"}; - public Map<String, Integer> verifMap = new HashMap<String, Integer>(); + public Map<String, String> verifMap = new HashMap<String, String>(); protected Graphics graphics; public AvatarBDPerformancePragma(int _x, int _y, int _minX, int _maxX, int _minY, int _maxY, boolean _pos, TGComponent _father, TDiagramPanel _tdp) { @@ -223,7 +220,7 @@ public class AvatarBDPerformancePragma extends TGCScalableWithoutInternalCompone if (s.isEmpty() || !s.contains("Latency") ){ //Ignore } - else if (s.contains("Latency") && (s.contains("<") || s.contains(">")) ) { + else if (s.contains("Latency") && (s.contains("<") || s.contains(">") || s.contains("?")) ) { properties.add(s); } else { @@ -310,36 +307,41 @@ public class AvatarBDPerformancePragma extends TGCScalableWithoutInternalCompone private void drawVerification(String s, Graphics g, int _x, int _y){ Color c = g.getColor(); // Color c1; - int status; - if (verifMap.containsKey(s)){ - status = verifMap.get(s); - if (status== PROVED_TRUE){ - g.setColor(Color.green); - int[] xp1 = new int[]{_x-20, _x-18, _x-12, _x-14}; - int[] yp1 = new int[]{_y-3, _y-5, _y-1, _y+1}; - int[] xp2 = new int[]{_x-14, _x-12, _x-3, _x-5}; - int[] yp2 = new int[]{_y-1, _y+1, _y-8, _y-10}; - g.fillPolygon(xp1, yp1, 4); - g.fillPolygon(xp2, yp2, 4); - } - - else if (status==PROVED_ERROR){ - Font f= g.getFont(); - g.setFont(new Font("TimesRoman", Font.BOLD, 14)); - g.drawString("?",_x-15,_y); - g.setFont(f); + String status; + if (verifMap.containsKey(s)){ + status = verifMap.get(s); + if (status.equals("PROVED_TRUE")){ + g.setColor(Color.green); + int[] xp1 = new int[]{_x-35, _x-33, _x-27, _x-29}; + int[] yp1 = new int[]{_y-3, _y-5, _y-1, _y+1}; + int[] xp2 = new int[]{_x-29, _x-27, _x-18, _x-20}; + int[] yp2 = new int[]{_y-1, _y+1, _y-8, _y-10}; + g.fillPolygon(xp1, yp1, 4); + g.fillPolygon(xp2, yp2, 4); + } + else if (status.equals("PROVED_ERROR")){ + Font f= g.getFont(); + g.setFont(new Font("TimesRoman", Font.BOLD, 14)); + g.drawString("?",_x-30,_y); + g.setFont(f); + } + else if (status.equals("PROVED_FALSE")){ + g.setColor(Color.red); + int[] xp1 = new int[]{_x-32, _x-30, _x-21, _x-23}; + int[] yp1 = new int[]{_y-12, _y-10, _y-2, _y}; + int[] xp2 = new int[]{_x-30, _x-32, _x-23, _x-21}; + int[] yp2 = new int[]{_y, _y-2, _y-12, _y-10}; + g.fillPolygon(xp1, yp1, 4); + g.fillPolygon(xp2, yp2, 4); + } + else { + Font f= g.getFont(); + g.setFont(new Font("TimesRoman", Font.BOLD, 10)); + g.drawString(status,_x-35,_y); + g.setFont(f); + } } - else { - g.setColor(Color.red); - int[] xp1 = new int[]{_x-17, _x-15, _x-6, _x-8}; - int[] yp1 = new int[]{_y-12, _y-10, _y-2, _y}; - int[] xp2 = new int[]{_x-15, _x-17, _x-8, _x-6}; - int[] yp2 = new int[]{_y, _y-2, _y-12, _y-10}; - g.fillPolygon(xp1, yp1, 4); - g.fillPolygon(xp2, yp2, 4); - } - } - g.setColor(c); + g.setColor(c); } @Override diff --git a/src/main/java/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java b/src/main/java/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java index d3e30c9f3a21e94c6d33355a6aab4978e3f57947..0a7b75d49f1a0917ad807de570576ae703d88635 100755 --- a/src/main/java/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java +++ b/src/main/java/ui/avatarinteractivesimulation/JFrameAvatarInteractiveSimulation.java @@ -267,18 +267,22 @@ public class JFrameAvatarInteractiveSimulation extends JFrame implements Avatar transTimes.put(id, new ArrayList<String>()); } for (AvatarPragmaLatency latencyPragma: _avspec.getLatencyPragmas()){ - if (!nameLatencyMap.containsKey(latencyPragma.getId1().get(0) + "--"+latencyPragma.getId2().get(0))){ - SimulationLatency sl = new SimulationLatency(); - sl.setTransaction1(latencyPragma.getId1().get(0)); - sl.setTransaction2(latencyPragma.getId2().get(0)); - sl.addPragma(latencyPragma); - nameLatencyMap.put(latencyPragma.getId1().get(0) + "--"+latencyPragma.getId2().get(0), sl); - latencies.add(sl); - //toCheck.add(latencyPragma.getId1().get(0) + "--"+latencyPragma.getId2().get(0)); - updateTransactionsTable(); - } - else { - nameLatencyMap.get(latencyPragma.getId1().get(0) + "--"+latencyPragma.getId2().get(0)).addPragma(latencyPragma); + for (String id1: latencyPragma.getId1()){ + for (String id2: latencyPragma.getId2()){ + if (!nameLatencyMap.containsKey(id1 + "--"+id2)){ + SimulationLatency sl = new SimulationLatency(); + sl.setTransaction1(id1); + sl.setTransaction2(id2); + sl.addPragma(latencyPragma); + nameLatencyMap.put(id1 + "--"+id2, sl); + latencies.add(sl); + //toCheck.add(latencyPragma.getId1().get(0) + "--"+latencyPragma.getId2().get(0)); + updateTransactionsTable(); + } + else { + nameLatencyMap.get(id1 + "--"+id2).addPragma(latencyPragma); + } + } } } makeComponents(); diff --git a/src/main/java/ui/tmldd/TMLArchiArtifact.java b/src/main/java/ui/tmldd/TMLArchiArtifact.java index cf78c0574d2b76547fa89cc18077a2c721885ece..510f153f27360a9df43c71ef069cb0a4a7ebfff4 100755 --- a/src/main/java/ui/tmldd/TMLArchiArtifact.java +++ b/src/main/java/ui/tmldd/TMLArchiArtifact.java @@ -130,7 +130,6 @@ public class TMLArchiArtifact extends TGCWithoutInternalComponent implements Swa if (oldValue.compareTo(value) != 0) { setValue(value, g); } - g.drawString(value, x + textX , y + textY); g.drawRect(x, y, width, height); Color c = g.getColor(); diff --git a/src/main/java/ui/window/JDialogPerformancePragma.java b/src/main/java/ui/window/JDialogPerformancePragma.java index 214e81780c166f6cb27043d8edb59d920e71c13f..fa053e982d46a1b76b1122c32a8e4d55bc642a30 100644 --- a/src/main/java/ui/window/JDialogPerformancePragma.java +++ b/src/main/java/ui/window/JDialogPerformancePragma.java @@ -80,9 +80,8 @@ public class JDialogPerformancePragma extends JDialogBase implements ActionListe //Suggestion Panel code from: http://stackoverflow.com/questions/10873748/how-to-show-autocomplete-as-i-type-in-jtextarea public class SuggestionPanel { - private final String[] pragma = {"A[]", "E<>", "A<>", "E[]", "min(", "max("}; //Form list of all blocks - //For each block, create a list of all attribute strings and states + //For each block, create a list of all states and signals private JList list; private JPopupMenu popupMenu; @@ -113,15 +112,11 @@ public class JDialogPerformancePragma extends JDialogBase implements ActionListe private JList createSuggestionList(int linePosition, final int position, final String subWord) { ArrayList<String> matches = new ArrayList<String>(); - if (linePosition<3){ - for (String p: pragma) { - if (p.startsWith(subWord)){ - matches.add(p); - } - } + if (linePosition<6){ + matches.add("Latency("); } - if (!subWord.contains(".")){ + else if (!subWord.contains(".")){ for (String block: blockAttributeMap.keySet()){ if (block.startsWith(subWord)){ matches.add(block); @@ -220,7 +215,7 @@ public class JDialogPerformancePragma extends JDialogBase implements ActionListe String text = textarea.getText(); int start = Math.max(0, position - 1); while (start > 0) { - if (!Character.isWhitespace(text.charAt(start)) && !text.substring(start,start+1).equals("(") && !text.substring(start,start+1).equals(")") && !text.substring(start,start+1).equals(",") ) { + if (!text.substring(start,start+1).equals("(") && !text.substring(start,start+1).equals(")") && !text.substring(start,start+1).equals(",") ) { start--; } else { start++; diff --git a/ttool/src/test/java/avatartranslator/AvatarSafetyTests.java b/ttool/src/test/java/avatartranslator/AvatarSafetyTests.java index 8e0c0d695c0ec627f99d2a50759ee2b0758851d5..5d674a8d6149fc27dd44414905f4ce2416964902 100644 --- a/ttool/src/test/java/avatartranslator/AvatarSafetyTests.java +++ b/ttool/src/test/java/avatartranslator/AvatarSafetyTests.java @@ -68,6 +68,10 @@ public class AvatarSafetyTests { AvatarDesignPanelTranslator adpt; AvatarPragmaLatency pragma; + avatartranslator.AvatarSignal sig2; + avatartranslator.AvatarSignal sig; + + public AvatarSafetyTests () { // super ("AvatarSafety", true); } @@ -79,7 +83,8 @@ public class AvatarSafetyTests { blocks = new ArrayList<AvatarBDBlock>(); as = new AvatarSpecification("avspec",null); AvatarBlock A = new AvatarBlock("A", null, null); - avatartranslator.AvatarSignal sig = new avatartranslator.AvatarSignal("sig", 0, null); + + sig = new avatartranslator.AvatarSignal("sig", 0, null); A.addSignal(sig); AvatarStateMachine Aasm = A.getStateMachine(); AvatarActionOnSignal aaos = new AvatarActionOnSignal("action_on_signal", sig, null); @@ -92,7 +97,7 @@ public class AvatarSafetyTests { AvatarBlock B = new AvatarBlock("B", null, null); AvatarStateMachine Basm = B.getStateMachine(); - avatartranslator.AvatarSignal sig2 = new avatartranslator.AvatarSignal("sig2", 0, null); + sig2 = new avatartranslator.AvatarSignal("sig2", 0, null); AvatarActionOnSignal aaos2= new AvatarActionOnSignal("action_on_signal", sig2, null); aaos2.setCheckLatency(true); Basm.addElement(aaos2); @@ -117,24 +122,24 @@ public class AvatarSafetyTests { @Test public void testFailIfLatencyPragmaEmpty(){ - pragma = adpt.checkLatencyPragma("", blocks, as, null); + pragma = adpt.checkPerformancePragma("", blocks, as, null); assertNull(pragma); } @Test public void testFailIfBadFormat(){ //Fail if does not contain 'Latency()' - pragma = adpt.checkLatencyPragma("Lat(b,s)<1", blocks, as, null); + pragma = adpt.checkPerformancePragma("Lat(b,s)<1", blocks, as, null); assertNull(pragma); //Fail if unmatched ')' - pragma = adpt.checkLatencyPragma("Latency(b,s<1", blocks, as, null); + pragma = adpt.checkPerformancePragma("Latency(b,s<1", blocks, as, null); assertNull(pragma); } @Test public void testFormLessThanPragma(){ //Test : Form pragma with less than expression - pragma = adpt.checkLatencyPragma("Latency(A.sig,B.sig2)<1", blocks, as, null); + pragma = adpt.checkPerformancePragma("Latency(A.sig,B.sig2)<1", blocks, as, null); assertTrue(pragma !=null); //Check Block names assertEquals(pragma.getBlock1().getName(),"A"); @@ -155,7 +160,7 @@ public class AvatarSafetyTests { @Test public void testFormGreaterThanPragma(){ //Test : Form pragma with greater than expression - pragma = adpt.checkLatencyPragma("Latency(B.sig2,A.sig)>231", blocks, as, null); + pragma = adpt.checkPerformancePragma("Latency(B.sig2,A.sig)>231", blocks, as, null); assertTrue(pragma !=null); //Check symbol assertEquals(pragma.getSymbolType(),AvatarPragmaLatency.greaterThan); @@ -165,28 +170,49 @@ public class AvatarSafetyTests { @Test public void testFailWrongNumberFormat(){ - pragma = adpt.checkLatencyPragma("Latency(B.sig2,A.sig)>a231", blocks, as, null); + pragma = adpt.checkPerformancePragma("Latency(B.sig2,A.sig)>a231", blocks, as, null); assertNull(pragma); } @Test public void testFailMissingBlock(){ - pragma = adpt.checkLatencyPragma("Latency(Bob.sig2,A.sig)>231", blocks, as, null); + pragma = adpt.checkPerformancePragma("Latency(Bob.sig2,A.sig)>231", blocks, as, null); assertNull(pragma); - pragma = adpt.checkLatencyPragma("Latency(B.sig2,Alice.sig)>231", blocks, as, null); + pragma = adpt.checkPerformancePragma("Latency(B.sig2,Alice.sig)>231", blocks, as, null); assertNull(pragma); } @Test public void testFailMissingState(){ - pragma = adpt.checkLatencyPragma("Latency(B.state,A.sig)>231", blocks, as, null); + pragma = adpt.checkPerformancePragma("Latency(B.state,A.sig)>231", blocks, as, null); assertNull(pragma); - pragma = adpt.checkLatencyPragma("Latency(B.sig2,A.sig2)>231", blocks, as, null); + pragma = adpt.checkPerformancePragma("Latency(B.sig2,A.sig2)>231", blocks, as, null); assertNull(pragma); } + @Test + public void testFormQueryPragma(){ + pragma = adpt.checkPerformancePragma("Latency(B.sig2,A.sig)?", blocks, as, null); + assertTrue(pragma!=null); + } + @Test + public void testMultipleIdsPerSignal(){ + AvatarBlock A = as.getBlockWithName("A"); + AvatarStateMachine Aasm = A.getStateMachine(); + AvatarActionOnSignal aaos = new AvatarActionOnSignal("action_on_signal", sig, null); + aaos.setCheckLatency(true); + Aasm.addElement(aaos); + Aasm.getListOfElements().get(0).addNext(aaos); + + //Form pragma + pragma = adpt.checkPerformancePragma("Latency(B.sig2,A.sig)>231", blocks, as, null); + + assertEquals(pragma.getId1().size(),1); + assertEquals(pragma.getId2().size(),2); + + } public static void main(String[] args){ AvatarSafetyTests ast = new AvatarSafetyTests (); diff --git a/ttool/src/test/java/avatartranslator/AvatarSecurityTranslationTests.java b/ttool/src/test/java/avatartranslator/AvatarSecurityTranslationTests.java new file mode 100644 index 0000000000000000000000000000000000000000..473f9f163e0e45b87b42c2a524ab82ef8689b3a7 --- /dev/null +++ b/ttool/src/test/java/avatartranslator/AvatarSecurityTranslationTests.java @@ -0,0 +1,243 @@ +/**Copyright or (C) or Copr. GET / ENST, Telecom-Paris, Ludovic Apvrille + * + * ludovic.apvrille AT enst.fr + * + * This software is a computer program whose purpose is to allow the + * edition of TURTLE analysis, design and deployment diagrams, to + * allow the generation of RT-LOTOS or Java code from this diagram, + * and at last to allow the analysis of formal validation traces + * obtained from external tools, e.g. RTL from LAAS-CNRS and CADP + * from INRIA Rhone-Alpes. + * + * This software is governed by the CeCILL license under French law and + * abiding by the rules of distribution of free software. You can use, + * modify and/ or redistribute the software under the terms of the CeCILL + * license as circulated by CEA, CNRS and INRIA at the following URL + * "http://www.cecill.info". + * + * As a counterpart to the access to the source code and rights to copy, + * modify and redistribute granted by the license, users are provided only + * with a limited warranty and the software's author, the holder of the + * economic rights, and the successive licensors have only limited + * liability. + * + * In this respect, the user's attention is drawn to the risks associated + * with loading, using, modifying and/or developing or reproducing the + * software by the user in light of its specific status of free software, + * that may mean that it is complicated to manipulate, and that also + * therefore means that it is reserved for developers and experienced + * professionals having in-depth computer knowledge. Users are therefore + * encouraged to load and test the software's suitability as regards their + * requirements in conditions enabling the security of their systems and/or + * data to be ensured and, more generally, to use and operate it in the + * same conditions as regards security. + * + * The fact that you are presently reading this means that you have had + * knowledge of the CeCILL license and that you accept its terms. + * + * /** + * Class AvatarSecurityTranslationTests + * Creation: 1/10/2017 + * @version 1.1 01/10/2017 + * @author Letitia LI + * @see + */ + +package avatartranslator; + +import org.junit.Test; +import org.junit.*; + +import static org.junit.Assert.*; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import ui.*; +import ui.tmlcompd.*; + +import java.util.LinkedList; +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Vector; + +import ui.tree.*; + +import javax.swing.*; + +import tmltranslator.*; +import tmltranslator.toavatar.TML2Avatar; + +public class AvatarSecurityTranslationTests { + TMLMapping<TGComponent> map; + TMLTask task1; + TMLStartState start; + TMLModeling<TGComponent> tmlm; + public AvatarSecurityTranslationTests () { + // + } + + @Before + public void setupDiploMapping (){ + MainGUI mgui = new MainGUI(false, false, false, false, false, false, false, false, false, true, false, false); + mgui.initActions(); + mgui.panelForTab = new JPanel(); + mgui.frame = new JFrame(); + mgui.dtree = new JDiagramTree(mgui); + mgui.dtree.setCellRenderer(new DiagramTreeRenderer()); + ToolTipManager.sharedInstance().registerComponent(mgui.dtree); + JScrollPane scrollPane = new JScrollPane(mgui.dtree); + mgui.newTurtleModeling(); +// mgui.tabs = new Vector<TURTLEPanel>(); + TMLComponentDesignPanel tmlcdp = new TMLComponentDesignPanel(mgui); + tmlcdp.tmlctdp = new TMLComponentTaskDiagramPanel(mgui, null); + tmlcdp.tmlctdp.tp = tmlcdp; + + tmlm = new TMLModeling<TGComponent>(); + + task1= new TMLTask("DESIGN__task1", null, new TMLCPrimitiveComponent(0, 0, 0, 0, 0, 0, false, null, tmlcdp.tmlctdp)); + + + start = new TMLStartState("start",null); + task1.getActivityDiagram().addElement(start); + + tmlm.addTask(task1); + TMLArchitecture arch = new TMLArchitecture(); + map = new TMLMapping<TGComponent>(tmlm, arch, false); + + } + //protected void test () { + + @Test + public void testBlockTranslation(){ + TML2Avatar tml2avatar = new TML2Avatar(map,false,true); + + AvatarSpecification avspec =tml2avatar.generateAvatarSpec("1"); + assertTrue(avspec!=null); + assertEquals(avspec.getListOfBlocks().size(),1); + + } + + @Test + public void testTranslateStatesSymmetricEncryption(){ + //setup security pattern + SecurityPattern sec = new SecurityPattern("sym", "Symmetric Encryption", "100", "100", "100", "100", "", "", ""); + tmlm.addSecurityPattern(sec); + + //Setup states + TMLExecC tmlexecc = new TMLExecC("encrypt_sym", null); + tmlexecc.securityPattern = sec; + start.addNext(tmlexecc); + task1.getActivityDiagram().addElement(tmlexecc); + + + TML2Avatar tml2avatar = new TML2Avatar(map,false,true); + AvatarSpecification avspec =tml2avatar.generateAvatarSpec("1"); + assertTrue(avspec!=null); + AvatarBlock block1 = avspec.getBlockWithName("task1"); + AvatarStateMachine sm = block1.getStateMachine(); + LinkedList<AvatarStateMachineElement> elems= sm.getListOfElements(); + //First state is start state + assertTrue(elems.get(0) instanceof AvatarStartState); + //state is avatartransition + assertTrue(elems.get(1) instanceof AvatarTransition); + //state is avatarstate + assertTrue(elems.get(2) instanceof AvatarState); + assertEquals(elems.get(2).getName(),"_encrypt_sym"); + //Next state is avatartransition + assertTrue(elems.get(3) instanceof AvatarTransition); + assertEquals(elems.get(3).getName(),"__after_encrypt_sym"); + AvatarTransition at = (AvatarTransition) elems.get(3); + //Check that action is encryption + assertEquals(at.getActions().get(0).getName().replaceAll(" ",""),"sym_encrypted=sencrypt(sym,key_sym)"); + } + + + @Test + public void testTranslateStatesAsymmetricEncryption(){ + //setup security pattern + SecurityPattern sec = new SecurityPattern("asym", "Asymmetric Encryption", "100", "100", "100", "100", "", "", ""); + tmlm.addSecurityPattern(sec); + + //Setup states + TMLExecC tmlexecc = new TMLExecC("encrypt_asym", null); + tmlexecc.securityPattern = sec; + start.addNext(tmlexecc); + task1.getActivityDiagram().addElement(tmlexecc); + + + TML2Avatar tml2avatar = new TML2Avatar(map,false,true); + AvatarSpecification avspec =tml2avatar.generateAvatarSpec("1"); + assertTrue(avspec!=null); + AvatarBlock block1 = avspec.getBlockWithName("task1"); + AvatarStateMachine sm = block1.getStateMachine(); + LinkedList<AvatarStateMachineElement> elems= sm.getListOfElements(); + + AvatarTransition at = (AvatarTransition) elems.get(3); + //Check that action is encryption + assertEquals(at.getActions().get(0).getName().replaceAll(" ",""),"asym_encrypted=aencrypt(asym,pubKey_asym)"); + } + + + @Test + public void testTranslateNonce(){ + //setup security pattern + SecurityPattern sec = new SecurityPattern("asym", "Nonce", "100", "100", "100", "100", "", "", ""); + tmlm.addSecurityPattern(sec); + + //Setup states + TMLExecC tmlexecc = new TMLExecC("encrypt_asym", null); + tmlexecc.securityPattern = sec; + start.addNext(tmlexecc); + task1.getActivityDiagram().addElement(tmlexecc); + + + TML2Avatar tml2avatar = new TML2Avatar(map,false,true); + AvatarSpecification avspec =tml2avatar.generateAvatarSpec("1"); + assertTrue(avspec!=null); + AvatarBlock block1 = avspec.getBlockWithName("task1"); + AvatarStateMachine sm = block1.getStateMachine(); + LinkedList<AvatarStateMachineElement> elems= sm.getListOfElements(); + + AvatarTransition at = (AvatarTransition) elems.get(3); + //Check that action is empty + assertEquals(at.getActions().size(),0); + //Check that next state is random + assertTrue(elems.get(4) instanceof AvatarRandom); + + } + + + + @Test + public void testTranslateMAC(){ + //setup security pattern + SecurityPattern sec = new SecurityPattern("mac", "MAC", "100", "100", "100", "100", "", "", ""); + tmlm.addSecurityPattern(sec); + + //Setup states + TMLExecC tmlexecc = new TMLExecC("encrypt_mac", null); + tmlexecc.securityPattern = sec; + start.addNext(tmlexecc); + task1.getActivityDiagram().addElement(tmlexecc); + + + TML2Avatar tml2avatar = new TML2Avatar(map,false,true); + AvatarSpecification avspec =tml2avatar.generateAvatarSpec("1"); + assertTrue(avspec!=null); + AvatarBlock block1 = avspec.getBlockWithName("task1"); + AvatarStateMachine sm = block1.getStateMachine(); + LinkedList<AvatarStateMachineElement> elems= sm.getListOfElements(); + + AvatarTransition at = (AvatarTransition) elems.get(3); + //Check that action is encryption + assertEquals(at.getActions().get(0).getName().replaceAll(" ",""),"mac_mac=MAC(mac,key_mac)"); + } + + + + public static void main(String[] args){ + AvatarSecurityTranslationTests apt = new AvatarSecurityTranslationTests (); + //apt.runTest (); + } +}