From 4ba9d501275836745b5f97f32786e8b9f0fb19e9 Mon Sep 17 00:00:00 2001 From: Ludovic Apvrille <ludovic.apvrille@telecom-paris.fr> Date: Wed, 22 Feb 2023 18:03:35 +0100 Subject: [PATCH] Adding draw avatar model from proverif window --- .../avatartranslator/AvatarSpecification.java | 4 +- .../proverifspec/ProVerifOutputAnalyzer.java | 9 +- src/main/java/tmltranslator/TMLChannel.java | 9 + src/main/java/tmltranslator/TMLModeling.java | 23 +- .../tmltranslator/toavatarsec/TML2Avatar.java | 1232 ++++++++--------- src/main/java/ui/GTURTLEModeling.java | 71 +- src/main/java/ui/MainGUI.java | 20 +- .../java/ui/tmlcompd/TMLCPrimitivePort.java | 6 + .../window/JDialogProverifVerification.java | 33 +- 9 files changed, 732 insertions(+), 675 deletions(-) diff --git a/src/main/java/avatartranslator/AvatarSpecification.java b/src/main/java/avatartranslator/AvatarSpecification.java index b8e02fab88..a88de7ec0c 100644 --- a/src/main/java/avatartranslator/AvatarSpecification.java +++ b/src/main/java/avatartranslator/AvatarSpecification.java @@ -67,14 +67,14 @@ public class AvatarSpecification extends AvatarElement { //private AvatarBroadcast broadcast; private String applicationCode; - private final List<AvatarPragma> pragmas; + private final List<AvatarPragma> pragmas; // Security pragmas private final List<String> safetyPragmas; private final HashMap<String, String> safetyPragmasRefs; private final List<AvatarPragmaLatency> latencyPragmas; private final List<AvatarConstant> constants; private final boolean robustnessMade = false; - private Object informationSource; // element from which the spec has been built + private Object informationSource; // Element from which the spec has been built public AvatarSpecification(String _name, Object _referenceObject) { diff --git a/src/main/java/proverifspec/ProVerifOutputAnalyzer.java b/src/main/java/proverifspec/ProVerifOutputAnalyzer.java index 8417823e68..e1df8cd88e 100644 --- a/src/main/java/proverifspec/ProVerifOutputAnalyzer.java +++ b/src/main/java/proverifspec/ProVerifOutputAnalyzer.java @@ -257,8 +257,7 @@ public class ProVerifOutputAnalyzer { } // This concerns a strong authenticity check - else if (str.contains(isTyped ? typedStrongAuth : untypedStrongAuth)) - { + else if (str.contains(isTyped ? typedStrongAuth : untypedStrongAuth)) { str = str.substring((isTyped ? typedStrongAuth : untypedStrongAuth).length()); String attributeStateName1 = null; @@ -267,8 +266,7 @@ public class ProVerifOutputAnalyzer { previousAuthPragma = new ProVerifQueryAuthResult(true, true); result = previousAuthPragma; - if (isTyped) - { + if (isTyped) { attributeStateName1 = str.split("\\(")[0]; attributeStateName2 = str.split(Pattern.quote(typedAuthSplit))[1].split("\\(")[0]; if (str.contains(typedFalse)) @@ -282,8 +280,7 @@ public class ProVerifOutputAnalyzer { result.setProved(false); } } - else - { + else { attributeStateName1 = str.split("\\(")[0]; attributeStateName2 = str.split(untypedAuthSplit)[1].split("\\(")[0]; if (str.contains(untypedFalse)) diff --git a/src/main/java/tmltranslator/TMLChannel.java b/src/main/java/tmltranslator/TMLChannel.java index 9ba0eef1fc..66e91a6fbf 100755 --- a/src/main/java/tmltranslator/TMLChannel.java +++ b/src/main/java/tmltranslator/TMLChannel.java @@ -657,4 +657,13 @@ public class TMLChannel extends TMLCommunicationElement { comp.isPortListEquals(destinationPorts, channel.getDestinationPorts()); } + + public String getSecurityPorts() { + String ret = ""; + for(TMLPortWithSecurityInformation port : ports) { + ret += port.toString() + " "; + } + return ret; + } + } diff --git a/src/main/java/tmltranslator/TMLModeling.java b/src/main/java/tmltranslator/TMLModeling.java index 981394732f..5c26650f9d 100755 --- a/src/main/java/tmltranslator/TMLModeling.java +++ b/src/main/java/tmltranslator/TMLModeling.java @@ -885,7 +885,7 @@ public class TMLModeling<E> { public void backtraceAuthenticity(ProVerifOutputAnalyzer pvoa, String mappingName) { - // TraceManager.addDev("Backtracing Authenticity"); + //TraceManager.addDev("\n** Backtracing Authenticity ** "); Map<AvatarPragmaAuthenticity, ProVerifQueryAuthResult> authenticityResults = pvoa.getAuthenticityResults(); for (AvatarPragmaAuthenticity pragma : authenticityResults.keySet()) { ProVerifQueryAuthResult result = authenticityResults.get(pragma); @@ -898,7 +898,9 @@ public class TMLModeling<E> { + "__" + pragma.getAttrA().getAttribute().getName() + "__" + pragma.getAttrA().getState().getName(); + TraceManager.addDev("\n\n **Backtracing Authenticity s=" + s + " **"); if (result.isProved() && !result.isSatisfied()) { + TraceManager.addDev("Backtracing Authenticity proved but not satisfied"); String signalName = s.toString().split("_chData")[0]; signalName = signalName.split("__")[signalName.split("__").length - 1]; @@ -910,6 +912,7 @@ public class TMLModeling<E> { if (channel != null) { for (TMLPortWithSecurityInformation port : channel.ports) { if (port.getCheckAuth()) { + TraceManager.addDev("Backtracing Authenticity proved but not satisfied / Found port with checkAuth"); port.setStrongAuthStatus(3); port.setMappingName(mappingName); ProVerifResultTrace trace = pvoa.getResults().get(pragma).getTrace(); @@ -919,6 +922,8 @@ public class TMLModeling<E> { } } } + } else { + TraceManager.addDev("Backtracing Authenticity proved but not satisfied / NULL channel"); } signalName = s.toString().split("_reqData")[0]; for (TMLTask t : getTasks()) { @@ -959,10 +964,11 @@ public class TMLModeling<E> { for (String channelName : channels) { channel = getChannelByShortName(channelName); if (channel != null) { + TraceManager.addDev("Security ports: " + channel.getSecurityPorts()); for (TMLPortWithSecurityInformation port : channel.ports) { if (port.getCheckAuth() && port.getCheckStrongAuthStatus() == 1) { port.setStrongAuthStatus(3); - TraceManager.addDev("not verified " + signalName); + TraceManager.addDev("Backtracing Authenticity not verified " + signalName); port.setSecName(signalName); ProVerifResultTrace trace = pvoa.getResults().get(pragma).getTrace(); if (trace != null && !port.isOrigin()) { @@ -1009,10 +1015,13 @@ public class TMLModeling<E> { } if (result.isWeakProved() && result.isWeakSatisfied()) { + TraceManager.addDev("Backtracing Authenticity weak proved and weak satisfied"); String signalName = s.split("_chData")[0]; signalName = signalName.split("__")[1]; TMLChannel channel = getChannelByShortName(signalName); + if (channel != null) { + TraceManager.addDev("Security ports (1): " + channel.getSecurityPorts()); for (TMLPortWithSecurityInformation port : channel.ports) { if (port.getCheckAuth()) { port.setWeakAuthStatus(2); @@ -1024,7 +1033,10 @@ public class TMLModeling<E> { } } } + } else { + TraceManager.addDev("Backtracing Authenticity weak proved and weak satisfied: NULL Channel"); } + signalName = s.split("_reqData")[0]; for (TMLTask t : getTasks()) { if (signalName.contains(t.getName())) { @@ -1064,12 +1076,16 @@ public class TMLModeling<E> { signalName = signalName.replace(t.getName()+"__",""); } }*/ + signalName = signalName.split("__")[1]; + TraceManager.addDev("Signal name (2): " + signalName); List<String> channels = secChannelMap.get(signalName); if (channels != null) { for (String channelName : channels) { channel = getChannelByShortName(channelName); + if (channel != null) { + TraceManager.addDev("Security ports (2): " + channel.getSecurityPorts()); for (TMLPortWithSecurityInformation port : channel.ports) { if (port.getCheckAuth()) { port.setWeakAuthStatus(2); @@ -1081,6 +1097,8 @@ public class TMLModeling<E> { } } } + } else { + TraceManager.addDev("Backtracing Authenticity weak proved and weak satisfied: NULL Channel"); } } } @@ -1119,6 +1137,7 @@ public class TMLModeling<E> { } if (result.isProved() && result.isSatisfied()) { + TraceManager.addDev("Backtracing Authenticity proved and satisfied" ); String signalName = s.split("_chData")[0]; for (TMLTask t : getTasks()) { if (signalName.contains(t.getName())) { diff --git a/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java b/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java index 86dc677a98..e2ac734d28 100644 --- a/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java +++ b/src/main/java/tmltranslator/toavatarsec/TML2Avatar.java @@ -1,38 +1,38 @@ /* 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. -*/ + * + * 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. + */ package tmltranslator.toavatarsec; @@ -43,7 +43,6 @@ import proverifspec.ProVerifQueryResult; import tmltranslator.*; import ui.TGComponent; import ui.tmlad.*; -import ui.tmlcompd.TMLCPrimitivePort; import java.util.*; import java.util.regex.Matcher; @@ -57,38 +56,33 @@ import java.util.regex.Pattern; * @version 1.1 29/02/2016 */ public class TML2Avatar { - private TMLMapping<?> tmlmap; - private TMLModeling<?> tmlmodel; - - private Map<SecurityPattern, List<AvatarAttribute>> symKeys = new HashMap<SecurityPattern, List<AvatarAttribute>>(); - private Map<SecurityPattern, List<AvatarAttribute>> pubKeys = new HashMap<SecurityPattern, List<AvatarAttribute>>(); - private Map<String, String> nameMap = new HashMap<String, String>(); + private final static Integer channelPublic = 0; + private final static Integer channelPrivate = 1; + private final static Integer channelUnreachable = 2; //private AvatarAttribute pKey; public Map<TMLChannel, Integer> channelMap = new HashMap<TMLChannel, Integer>(); public Map<TMLTask, AvatarBlock> taskBlockMap = new HashMap<TMLTask, AvatarBlock>(); public Map<String, Integer> originDestMap = new HashMap<String, Integer>(); - private Map<String, AvatarSignal> signalInMap = new HashMap<String, AvatarSignal>(); - private Map<String, AvatarSignal> signalOutMap = new HashMap<String, AvatarSignal>(); public Map<String, Object> stateObjectMap = new HashMap<String, Object>(); public Map<TMLTask, List<SecurityPattern>> accessKeys = new HashMap<TMLTask, List<SecurityPattern>>(); - + public ArrayList<SecurityPattern> secPatterns = new ArrayList<SecurityPattern>(); + public int loopLimit = 1; HashMap<String, List<String>> secChannelMap = new HashMap<String, List<String>>(); - HashMap<String, AvatarAttributeState> signalAuthOriginMap = new HashMap<String, AvatarAttributeState>(); HashMap<String, AvatarAttributeState> signalAuthDestMap = new HashMap<String, AvatarAttributeState>(); - - public ArrayList<SecurityPattern> secPatterns = new ArrayList<SecurityPattern>(); - List<AvatarSignal> signals = new ArrayList<AvatarSignal>(); - private final static Integer channelPublic = 0; - private final static Integer channelPrivate = 1; - private final static Integer channelUnreachable = 2; - public int loopLimit = 1; AvatarSpecification avspec; ArrayList<String> attrsToCheck; List<String> allStates; boolean mc = false; boolean security = false; + private TMLMapping<?> tmlmap; + private TMLModeling<?> tmlmodel; + private Map<SecurityPattern, List<AvatarAttribute>> symKeys = new HashMap<SecurityPattern, List<AvatarAttribute>>(); + private Map<SecurityPattern, List<AvatarAttribute>> pubKeys = new HashMap<SecurityPattern, List<AvatarAttribute>>(); + private Map<String, String> nameMap = new HashMap<String, String>(); + private Map<String, AvatarSignal> signalInMap = new HashMap<String, AvatarSignal>(); + private Map<String, AvatarSignal> signalOutMap = new HashMap<String, AvatarSignal>(); public TML2Avatar(TMLMapping<?> tmlmap, boolean modelcheck, boolean sec) { this.tmlmap = tmlmap; @@ -146,7 +140,7 @@ public class TML2Avatar { // Find path to secure memory from destination node for (TMLTask t2 : tmlmodel.getTasks()) { - HwExecutionNode node2 = tmlmap.getHwNodeOf(t2); + HwExecutionNode node2 = tmlmap.getHwNodeOf(t2); if (!memory) { // There is no path to a private memory originDestMap.put(t1.getName() + "__" + t2.getName(), channelPublic); @@ -673,7 +667,7 @@ public class TML2Avatar { } else if (ae instanceof TMLActivityElementWithAction) { //Might be encrypt or decrypt - AvatarState as = new AvatarState(ae.getValue().replaceAll(" ", "").replaceAll("\\*","").replaceAll("\\+","").replaceAll("\\-","") + "_" + ae.getName().replaceAll(" ", "").replaceAll("\\*","").replaceAll("\\+","").replaceAll("\\-",""), ae.getReferenceObject()); + AvatarState as = new AvatarState(ae.getValue().replaceAll(" ", "").replaceAll("\\*", "").replaceAll("\\+", "").replaceAll("\\-", "") + "_" + ae.getName().replaceAll(" ", "").replaceAll("\\*", "").replaceAll("\\+", "").replaceAll("\\-", ""), ae.getReferenceObject()); tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject()); as.addNext(tran); elementList.add(as); @@ -858,9 +852,11 @@ public class TML2Avatar { ae.securityPattern.originTask = block.getName(); ae.securityPattern.state1 = as; } - //Set attributestate for authenticity + + // Set attribute state for authenticity if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) { - AvatarAttributeState authOrigin = new AvatarAttributeState(block.getName() + "." + as.getName() + "." + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), as); + AvatarAttributeState authOrigin = new AvatarAttributeState(block.getName() + "." + as.getName() + "." + + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), as); signalAuthOriginMap.put(ae.securityPattern.name, authOrigin); } @@ -907,7 +903,8 @@ public class TML2Avatar { get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name)); get2.addParameter(block.getAvatarAttributeWithName(ae.securityPattern.name)); get2.addParameter(block.getAvatarAttributeWithName("testnonce_" + ae.securityPattern.nonce)); - if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && block.getAvatarAttributeWithName("testnonce_" + ae.securityPattern.nonce) != null) { + if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null && + block.getAvatarAttributeWithName("testnonce_" + ae.securityPattern.nonce) != null) { block.addMethod(get2); tran.addAction("get2(" + ae.securityPattern.name + "," + ae.securityPattern.name + ",testnonce_" + ae.securityPattern.nonce + ")"); } @@ -923,7 +920,8 @@ public class TML2Avatar { //Guard transition to determine if nonce matches tran.setGuard("testnonce_" + ae.securityPattern.nonce + "==" + ae.securityPattern.nonce); } - //Add a dummy state afterwards for authenticity after decrypting the data + + // Add a dummy state afterwards for authenticity after decrypting the data AvatarState dummy = new AvatarState(ae.getName().replaceAll(" ", "") + "_dummy", ae.getReferenceObject()); ae.securityPattern.state2 = dummy; tran.addNext(dummy); @@ -932,7 +930,8 @@ public class TML2Avatar { elementList.add(dummy); elementList.add(tran); if (block.getAvatarAttributeWithName(ae.securityPattern.name) != null) { - AvatarAttributeState authDest = new AvatarAttributeState(block.getName() + "." + dummy.getName() + "." + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), dummy); + AvatarAttributeState authDest = new AvatarAttributeState(block.getName() + "." + dummy.getName() + "." + + ae.securityPattern.name, ae.getReferenceObject(), block.getAvatarAttributeWithName(ae.securityPattern.name), dummy); signalAuthDestMap.put(ae.securityPattern.name, authDest); } } else if (ae.securityPattern.type.equals("Asymmetric Encryption")) { @@ -940,8 +939,6 @@ public class TML2Avatar { if (!ae.securityPattern.key.isEmpty()) { //Decrypting key - - //Add adecrypt method block.addAttribute(new AvatarAttribute("encryptedKey_" + ae.securityPattern.key, AvatarType.INTEGER, block, null)); block.addAttribute(new AvatarAttribute("privKey_" + ae.securityPattern.name, AvatarType.INTEGER, block, null)); @@ -951,7 +948,9 @@ public class TML2Avatar { adecrypt.addParameter(block.getAvatarAttributeWithName("privKey_" + ae.securityPattern.name)); adecrypt.addReturnParameter(block.getAvatarAttributeWithName("key_" + ae.securityPattern.key)); - if (block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key) != null && block.getAvatarAttributeWithName("privKey_" + ae.securityPattern.name) != null && block.getAvatarAttributeWithName("key_" + ae.securityPattern.key) != null) { + if (block.getAvatarAttributeWithName("encryptedKey_" + ae.securityPattern.key) != null && + block.getAvatarAttributeWithName("privKey_" + ae.securityPattern.name) != null && + block.getAvatarAttributeWithName("key_" + ae.securityPattern.key) != null) { block.addMethod(adecrypt); tran.addAction("key_" + ae.securityPattern.key + " = adecrypt(encryptedKey_" + ae.securityPattern.key + ", privKey_" + ae.securityPattern.name + ")"); } @@ -1136,20 +1135,19 @@ public class TML2Avatar { List<String> tmp = new ArrayList<String>(); secChannelMap.put(ae.securityPattern.name, tmp); } - + secChannelMap.get(ae.securityPattern.name).add(ch.getName()); - if (aec.getEncForm()){ - as.addValue(ae.securityPattern.name + "_encrypted"); - AvatarAttribute data = new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null); - block.addAttribute(data); - } - else { - if (block.getAvatarAttributeWithName(ae.securityPattern.name) == null){ - AvatarAttribute data = new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null); - block.addAttribute(data); - } - as.addValue(ae.securityPattern.name); - + if (aec.getEncForm()) { + as.addValue(ae.securityPattern.name + "_encrypted"); + AvatarAttribute data = new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null); + block.addAttribute(data); + } else { + if (block.getAvatarAttributeWithName(ae.securityPattern.name) == null) { + AvatarAttribute data = new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null); + block.addAttribute(data); + } + as.addValue(ae.securityPattern.name); + } } } else { @@ -1199,38 +1197,41 @@ public class TML2Avatar { } //Add the confidentiality pragma for this channel data if (ch.checkConf) { - if (ch.originalOriginTasks.size()!=0 && ch.getOriginPort().getName().contains("PORTORIGIN")){ - // System.out.println("Channel " + ch.getOriginPort().getName() + " block " + block.getName()); - if (!attrsToCheck.contains(ch.getOriginPort().getName() + "_chData") ) { - for (TMLTask origTask: ch.originalOriginTasks){ - AvatarBlock bl = avspec.getBlockWithName(origTask.getName().split("__")[origTask.getName().split("__").length - 1]); - if (bl!=null){ - AvatarAttribute attr = bl.getAvatarAttributeWithName(block.getName() + "_chData"); - if (attr != null) { - attrsToCheck.add(ch.getOriginPort().getName() + "_chData"); - avspec.addPragma(new AvatarPragmaSecret("#Confidentiality " + bl.getName() + "." + block.getName() + "_chData", ch.getReferenceObject(), attr)); - } - } - } - } - } - else { - if (!attrsToCheck.contains(ch.getOriginPort().getName() + "_chData") ) { - AvatarAttribute attr = block.getAvatarAttributeWithName(ch.getOriginPort().getName() + "_chData"); - if (attr != null) { - attrsToCheck.add(ch.getOriginPort().getName() + "_chData"); - avspec.addPragma(new AvatarPragmaSecret("#Confidentiality " + block.getName() + "." + ch.getName() + "_chData", ch.getReferenceObject(), attr)); - } + if (ch.originalOriginTasks.size() != 0 && ch.getOriginPort().getName().contains("PORTORIGIN")) { + // System.out.println("Channel " + ch.getOriginPort().getName() + " block " + block.getName()); + if (!attrsToCheck.contains(ch.getOriginPort().getName() + "_chData")) { + for (TMLTask origTask : ch.originalOriginTasks) { + AvatarBlock bl = avspec.getBlockWithName(origTask.getName().split("__")[origTask.getName().split("__").length - 1]); + if (bl != null) { + AvatarAttribute attr = bl.getAvatarAttributeWithName(block.getName() + "_chData"); + if (attr != null) { + attrsToCheck.add(ch.getOriginPort().getName() + "_chData"); + avspec.addPragma(new AvatarPragmaSecret("#Confidentiality " + bl.getName() + "." + block.getName() + + "_chData", ch.getReferenceObject(), attr)); + } + } + } + } + } else { + if (!attrsToCheck.contains(ch.getOriginPort().getName() + "_chData")) { + AvatarAttribute attr = block.getAvatarAttributeWithName(ch.getOriginPort().getName() + "_chData"); + if (attr != null) { + attrsToCheck.add(ch.getOriginPort().getName() + "_chData"); + avspec.addPragma(new AvatarPragmaSecret("#Confidentiality " + block.getName() + "." + ch.getName() + + "_chData", ch.getReferenceObject(), attr)); + } } } } - //Add the authenticity pragma for this channel data + + // Add the authenticity pragma for this channel data if (ch.checkAuth) { if (block.getAvatarAttributeWithName(getName(ch.getName()) + "_chData") == null) { AvatarAttribute channelData = new AvatarAttribute(getName(ch.getName()) + "_chData", AvatarType.INTEGER, block, null); block.addAttribute(channelData); } - AvatarAttributeState authOrigin = new AvatarAttributeState(block.getName() + "." + signalState.getName() + "." + getName(ch.getName()) + "_chData", ae.getReferenceObject(), block.getAvatarAttributeWithName(getName(ch.getName()) + "_chData"), signalState); + AvatarAttributeState authOrigin = new AvatarAttributeState(block.getName() + "." + signalState.getName() + "." + + getName(ch.getName()) + "_chData", ae.getReferenceObject(), block.getAvatarAttributeWithName(getName(ch.getName()) + "_chData"), signalState); signalAuthOriginMap.put(ch.getName(), authOrigin); } AvatarActionOnSignal as = new AvatarActionOnSignal(ae.getName(), sig, ae.getReferenceObject()); @@ -1249,20 +1250,19 @@ public class TML2Avatar { } else { //send encrypted data // - if (aec.getEncForm()){ - as.addValue(ae.securityPattern.name + "_encrypted"); - AvatarAttribute data = new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null); - block.addAttribute(data); - } - else { - //Send unecrypted form - if (block.getAvatarAttributeWithName(ae.securityPattern.name) == null){ - AvatarAttribute data = new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null); - block.addAttribute(data); - } - as.addValue(ae.securityPattern.name); + if (aec.getEncForm()) { + as.addValue(ae.securityPattern.name + "_encrypted"); + AvatarAttribute data = new AvatarAttribute(ae.securityPattern.name + "_encrypted", AvatarType.INTEGER, block, null); + block.addAttribute(data); + } else { + //Send unecrypted form + if (block.getAvatarAttributeWithName(ae.securityPattern.name) == null) { + AvatarAttribute data = new AvatarAttribute(ae.securityPattern.name, AvatarType.INTEGER, block, null); + block.addAttribute(data); + } + as.addValue(ae.securityPattern.name); } - + if (!secChannelMap.containsKey(ae.securityPattern.name)) { List<String> tmp = new ArrayList<String>(); secChannelMap.put(ae.securityPattern.name, tmp); @@ -1272,7 +1272,7 @@ public class TML2Avatar { } else { //No security pattern // TraceManager.addDev("no security pattern for " + ch.getName()); - as.addValue(ch.getOriginPort().getName()+ "_chData"); + as.addValue(ch.getOriginPort().getName() + "_chData"); } tran = new AvatarTransition(block, "__after_" + ae.getName(), ae.getReferenceObject()); @@ -1289,7 +1289,7 @@ public class TML2Avatar { if (loop.isInfinite()) { //Make initializaton, then choice state with transitions List<AvatarStateMachineElement> elements = translateState(ae.getNextElement(0), block); - /*List<AvatarStateMachineElement> afterloop =*/ + /*List<AvatarStateMachineElement> afterloop =*/ translateState(ae.getNextElement(1), block); AvatarState initState = new AvatarState(ae.getName().replaceAll(" ", "") + "__init", ae.getReferenceObject()); elementList.add(initState); @@ -1357,7 +1357,7 @@ public class TML2Avatar { tran = new AvatarTransition(block, "loop_increment__" + ae.getName(), ae.getReferenceObject()); //Set default loop limit guard tran.setGuard(AvatarGuard.createFromString(block, "loop_index != " + loopLimit)); - /*AvatarGuard guard = */ + /*AvatarGuard guard = */ AvatarGuard.createFromString(block, loop.getCondition().replaceAll("<", "!=")); int error = AvatarSyntaxChecker.isAValidGuard(avspec, block, loop.getCondition().replaceAll("<", "!=")); if (error != 0) { @@ -1458,14 +1458,14 @@ public class TML2Avatar { }*/ public String getName(String s) { - // System.out.println("String " + s); + // System.out.println("String " + s); if (nameMap.containsKey(s)) { return nameMap.get(s); } else { if (!s.contains("__")) { nameMap.put(s, s); return s; - } else if (s.split("__").length == 1 ) { + } else if (s.split("__").length == 1) { nameMap.put(s, s.split("__")[s.split("__").length - 1]); return s.split("__")[s.split("__").length - 1]; } else if (s.contains("JOIN") || s.contains("FORK")) { @@ -1483,8 +1483,8 @@ public class TML2Avatar { }*/ nameMap.put(s, s); return s; - // nameMap.put(s, s.split("__")[s.split("__").length - 1]); - // return s.split("__")[s.split("__").length - 1]; + // nameMap.put(s, s.split("__")[s.split("__").length - 1]); + // return s.split("__")[s.split("__").length - 1]; } } } @@ -1505,30 +1505,30 @@ public class TML2Avatar { } attrsToCheck.clear(); tmlmodel.removeForksAndJoins(); - + // System.out.println("MODIFIED model " + tmlmodel); - - for (TMLChannel chan: tmlmodel.getChannels()){ - //System.out.println("chan " + chan); - TMLTask task = chan.getOriginTask(); - - TMLTask task2 = chan.getDestinationTask(); - HwExecutionNode node = tmlmap.getHwNodeOf(task); - HwExecutionNode node2 = tmlmap.getHwNodeOf(task2); - if (node==null){ - tmlmap.addTaskToHwExecutionNode(task, node2); - } - - if (node2==null){ - tmlmap.addTaskToHwExecutionNode(task2, node); - } - - if (chan.getName().contains("fork__") || chan.getName().contains("FORKCHANNEL")){ - chan.setName(chan.getName().replaceAll("__","")); - } - + + for (TMLChannel chan : tmlmodel.getChannels()) { + //System.out.println("chan " + chan); + TMLTask task = chan.getOriginTask(); + + TMLTask task2 = chan.getDestinationTask(); + HwExecutionNode node = tmlmap.getHwNodeOf(task); + HwExecutionNode node2 = tmlmap.getHwNodeOf(task2); + if (node == null) { + tmlmap.addTaskToHwExecutionNode(task, node2); + } + + if (node2 == null) { + tmlmap.addTaskToHwExecutionNode(task2, node); + } + + if (chan.getName().contains("fork__") || chan.getName().contains("FORKCHANNEL")) { + chan.setName(chan.getName().replaceAll("__", "")); + } + } - + //Only set the loop limit if it's a number String pattern = "^[0-9]{1,2}$"; Pattern r = Pattern.compile(pattern); @@ -1679,9 +1679,9 @@ public class TML2Avatar { } //Create exit after # of loop iterations is maxed out - /*AvatarStopState stop =*/ - new AvatarStopState("stop", task.getActivityDiagram().get(0).getReferenceObject()); - /*AvatarTransition exitTran = */ + /*AvatarStopState stop =*/ + new AvatarStopState("stop", task.getActivityDiagram().get(0).getReferenceObject()); + /*AvatarTransition exitTran = */ new AvatarTransition(block, "to_stop", task.getActivityDiagram().get(0).getReferenceObject()); @@ -1736,65 +1736,64 @@ public class TML2Avatar { tran.addNext(newStart); }*/ - } + } - asm.setStartState(ss); + asm.setStartState(ss); - } - else { - //Not requested - List<AvatarStateMachineElement> elementList= translateState(task.getActivityDiagram().get(0), block); - for (AvatarStateMachineElement e: elementList){ - e.setName(processName(e.getName(), e.getID())); - asm.addElement(e); - stateObjectMap.put(task.getName().split("__")[1]+"__"+e.getName(), e.getReferenceObject()); - } - asm.setStartState((AvatarStartState) elementList.get(0)); - } - for (SecurityPattern secPattern: secPatterns){ - AvatarAttribute sec = block.getAvatarAttributeWithName(secPattern.name); - if (sec!=null){ - //sec = new AvatarAttribute(secPattern.name, AvatarType.INTEGER, block, null); - //AvatarAttribute enc = new AvatarAttribute(secPattern.name+"_encrypted", AvatarType.INTEGER, block, null); - // block.addAttribute(sec); - // block.addAttribute(enc); - //} - avspec.addPragma(new AvatarPragmaSecret("#Confidentiality "+block.getName() + "."+ secPattern.name, null, sec)); - } - } + } else { + //Not requested + List<AvatarStateMachineElement> elementList = translateState(task.getActivityDiagram().get(0), block); + for (AvatarStateMachineElement e : elementList) { + e.setName(processName(e.getName(), e.getID())); + asm.addElement(e); + stateObjectMap.put(task.getName().split("__")[1] + "__" + e.getName(), e.getReferenceObject()); + } + asm.setStartState((AvatarStartState) elementList.get(0)); + } + for (SecurityPattern secPattern : secPatterns) { + AvatarAttribute sec = block.getAvatarAttributeWithName(secPattern.name); + if (sec != null) { + //sec = new AvatarAttribute(secPattern.name, AvatarType.INTEGER, block, null); + //AvatarAttribute enc = new AvatarAttribute(secPattern.name+"_encrypted", AvatarType.INTEGER, block, null); + // block.addAttribute(sec); + // block.addAttribute(enc); + //} + avspec.addPragma(new AvatarPragmaSecret("#Confidentiality " + block.getName() + "." + secPattern.name, null, sec)); + } + } - } + } - //Add authenticity pragmas - for (String s: signalAuthOriginMap.keySet()){ - if (signalAuthDestMap.containsKey(s)){ - AvatarPragmaAuthenticity pragma = new AvatarPragmaAuthenticity("#Authenticity " + signalAuthOriginMap.get(s).getName() + " " + signalAuthDestMap.get(s).getName(), signalAuthOriginMap.get(s).getReferenceObject(), signalAuthOriginMap.get(s), signalAuthDestMap.get(s)); - if (secChannelMap.containsKey(s)){ - for (String channel: secChannelMap.get(s)){ - TMLChannel ch = tmlmodel.getChannelByShortName(channel); - if (ch!=null){ - if (ch.checkAuth){ - avspec.addPragma(pragma); - break; - } - } - } - - } - else { - avspec.addPragma(pragma); - } - } - } - - //Create relations - //Channels are ?? to ?? - //Requests are n to 1 - //Events are ?? to ?? - AvatarBlock fifo = new AvatarBlock("FIFO", avspec,null); - for (TMLChannel channel:tmlmodel.getChannels()){ + // Add authenticity pragmas + for (String s : signalAuthOriginMap.keySet()) { + if (signalAuthDestMap.containsKey(s)) { + AvatarPragmaAuthenticity pragma = new AvatarPragmaAuthenticity("#Authenticity " + signalAuthOriginMap.get(s).getName() + " " + + signalAuthDestMap.get(s).getName(), signalAuthOriginMap.get(s).getReferenceObject(), signalAuthOriginMap.get(s), signalAuthDestMap.get(s)); + if (secChannelMap.containsKey(s)) { + for (String channel : secChannelMap.get(s)) { + TMLChannel ch = tmlmodel.getChannelByShortName(channel); + if (ch != null) { + if (ch.checkAuth) { + avspec.addPragma(pragma); + break; + } + } + } + + } else { + avspec.addPragma(pragma); + } + } + } + + //Create relations + //Channels are ?? to ?? + //Requests are n to 1 + //Events are ?? to ?? + AvatarBlock fifo = new AvatarBlock("FIFO", avspec, null); + for (TMLChannel channel : tmlmodel.getChannels()) { /*if (channel.getName().contains("JOINCHANNEL")){ //System.out.println("JOINCHANNEL"); AvatarRelation ar= new AvatarRelation(channel.getName(), taskBlockMap.get(channel.getOriginTask()), taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject()); @@ -1911,446 +1910,433 @@ public class TML2Avatar { avspec.addRelation(ar); }*/ - if (channel.isBasicChannel()){ - //TraceManager.addDev("CHAN checking basic channel " + channel.getName()); - AvatarRelation ar = new AvatarRelation(channel.getName(), taskBlockMap.get(channel.getOriginTask()), - taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject()); - LinkedList<HwCommunicationNode> path = tmlmap.findNodesForElement(channel); - //TraceManager.addDev("CHAN checking basic channel " + channel.getName() + " path size: " + path.size()); - if (path.size() !=0 ){ - ar.setPrivate(true); - for (HwCommunicationNode node: path){ - //TraceManager.addDev("CHAN\t Element of path: " + node.getName()); - if (node instanceof HwBus){ - if ( node.privacy == HwCommunicationNode.BUS_PUBLIC){ - ar.setPrivate(false); - //TraceManager.addDev("CHAN\t Set as public: " + channel.getName() + "because of " + node.getName()); + if (channel.isBasicChannel()) { + //TraceManager.addDev("CHAN checking basic channel " + channel.getName()); + AvatarRelation ar = new AvatarRelation(channel.getName(), taskBlockMap.get(channel.getOriginTask()), + taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject()); + LinkedList<HwCommunicationNode> path = tmlmap.findNodesForElement(channel); + //TraceManager.addDev("CHAN checking basic channel " + channel.getName() + " path size: " + path.size()); + if (path.size() != 0) { + ar.setPrivate(true); + for (HwCommunicationNode node : path) { + //TraceManager.addDev("CHAN\t Element of path: " + node.getName()); + if (node instanceof HwBus) { + if (node.privacy == HwCommunicationNode.BUS_PUBLIC) { + ar.setPrivate(false); + //TraceManager.addDev("CHAN\t Set as public: " + channel.getName() + "because of " + node.getName()); + break; + } + } + } + } else { + if (channel.originalOriginTasks.size() == 0) { + ar.setPrivate(originDestMap.get(channel.getOriginTask().getName() + "__" + channel.getDestinationTask().getName()) == 1); + } else { + //System.out.println("complex channel " + channel.getName()); + //Find privacy of original tasks + boolean priv = true; + for (TMLTask task1 : channel.originalOriginTasks) { + for (TMLTask task2 : channel.originalDestinationTasks) { + if (originDestMap.get(task1.getName() + "__" + task2.getName()) != 1) { + priv = false; break; - } - } - } - } - else { - if (channel.originalOriginTasks.size()==0){ - ar.setPrivate(originDestMap.get(channel.getOriginTask().getName()+"__"+channel.getDestinationTask().getName())==1); - } - else { - //System.out.println("complex channel " + channel.getName()); - //Find privacy of original tasks - boolean priv = true; - for (TMLTask task1: channel.originalOriginTasks){ - for (TMLTask task2: channel.originalDestinationTasks){ - if (originDestMap.get(task1.getName()+"__"+task2.getName())!=1){ - priv=false; - break; - } - - } - - } - ar.setPrivate(priv); - } - } - if (channel.getType()==TMLChannel.BRBW){ - ar.setAsynchronous(true); - ar.setSizeOfFIFO(channel.getSize()); - ar.setBlocking(true); - } - else if (channel.getType()==TMLChannel.BRNBW){ - ar.setAsynchronous(true); - ar.setSizeOfFIFO(channel.getSize()); - ar.setBlocking(false); - } - else { - //Create new block, hope for best - if (mc){ - fifo = createFifo(channel.getName()); - ar.setAsynchronous(false); - } - } - //Find in signal - - List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>(); - //Sig1 contains IN Signals, Sig2 contains OUT signals - sig1.add(signalInMap.get(channel.getName())); - List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>(); - sig2.add(signalOutMap.get(channel.getName())); - for (AvatarSignal sig: signals){ - if (sig.getInOut()==AvatarSignal.IN){ - String name = sig.getName(); - if (name.equals(getName(channel.getName()))){ - // sig1.add(sig); - } - } - } - //Find out signal - for (AvatarSignal sig: signals){ - if (sig.getInOut()==AvatarSignal.OUT){ - String name = sig.getName(); - if (name.equals(channel.getOriginPort().getName())){ - // sig2.add(sig); - } - } - } - //System.out.println("size " + sig1.size() + " " + sig2.size()); - if (sig1.size()==0){ - sig1.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.IN, null)); - } - if (sig2.size()==0){ - sig2.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.OUT, null)); - } - if (sig1.size()==1 && sig2.size()==1){ - if (channel.getType()==TMLChannel.NBRNBW && mc){ - AvatarSignal read = fifo.getSignalByName("readSignal"); + } - ar.block2= fifo; - //Set IN signal with read - ar.addSignals(sig1.get(0), read); - AvatarRelation ar2= new AvatarRelation(channel.getName()+"2", fifo, taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject()); - AvatarSignal write = fifo.getSignalByName("writeSignal"); - //set OUT signal with write - ar2.addSignals(write, sig2.get(0)); - // System.out.println("Set " + sig2.get(0) + " and write"); - ar2.setAsynchronous(false); - avspec.addRelation(ar2); - } - else { - ar.addSignals(sig2.get(0), sig1.get(0)); - } - } - else { - //Create relation if it does not exist - if (top.getSignalByName(getName(channel.getName())+"in")==null){ - AvatarRelation relation= new AvatarRelation(channel.getName(), top, top, channel.getReferenceObject()); - AvatarSignal s1 = new AvatarSignal(getName(channel.getName())+"in", AvatarSignal.IN, null); - AvatarSignal s2 = new AvatarSignal(getName(channel.getName())+"out", AvatarSignal.OUT, null); - top.addSignal(s1); - top.addSignal(s2); - relation.addSignals(s2,s1); - avspec.addRelation(relation); - // System.out.println("Failure to match signals for TMLChannel "+ channel.getName()); - } - } - avspec.addRelation(ar); - } - else { - //System.out.println("WTF Found non-basic channel"); - //If not a basic channel, create a relation between TOP block and itself - AvatarRelation relation= new AvatarRelation(channel.getName(), top, top, channel.getReferenceObject()); - AvatarSignal s1 = new AvatarSignal(getName(channel.getName())+"in", AvatarSignal.IN, null); - AvatarSignal s2 = new AvatarSignal(getName(channel.getName())+"out", AvatarSignal.OUT, null); - top.addSignal(s1); - top.addSignal(s2); - relation.addSignals(s2,s1); - avspec.addRelation(relation); - for (TMLTask t1: channel.getOriginTasks()){ - for (TMLTask t2: channel.getDestinationTasks()){ - AvatarRelation ar= new AvatarRelation(channel.getName(), taskBlockMap.get(t1), taskBlockMap.get(t2), channel.getReferenceObject()); - ar.setPrivate(originDestMap.get(t1.getName()+"__"+t2.getName())==1); - //Find in signal - List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>(); - List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>(); - for (AvatarSignal sig: signals){ - if (sig.getInOut()==AvatarSignal.IN){ - String name = sig.getName(); - if (name.equals(getName(channel.getName()))){ - sig1.add(sig); - } - } - } - //Find out signal - for (AvatarSignal sig: signals){ - if (sig.getInOut()==AvatarSignal.OUT){ - String name = sig.getName(); - if (name.equals(getName(channel.getName()))){ - sig2.add(sig); - } - } - } - if (sig1.size()==0){ - sig1.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.IN, null)); - } - if (sig2.size()==0){ - sig2.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.OUT, null)); - } - if (sig1.size()==1 && sig2.size()==1){ - ar.addSignals(sig2.get(0), sig1.get(0)); - } - else { - System.out.println("Failure to match signals for TMLChannel "+ channel.getName() + " between " + t1.getName() + " and "+ t2.getName()); - } - avspec.addRelation(ar); - } - } - } - } - for (TMLRequest request: tmlmodel.getRequests()){ - for (TMLTask t1: request.getOriginTasks()){ - AvatarRelation ar = new AvatarRelation(request.getName(), taskBlockMap.get(t1), taskBlockMap.get(request.getDestinationTask()), request.getReferenceObject()); - ar.setPrivate(originDestMap.get(t1.getName()+"__"+request.getDestinationTask().getName())==1); - List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>(); - List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>(); - for (AvatarSignal sig: signals){ - if (sig.getInOut()==AvatarSignal.IN){ - String name = sig.getName(); + } - if (name.equals(getName(request.getName()))){ - sig1.add(sig); - } - } - } - //Find out signal - for (AvatarSignal sig: signals){ - if (sig.getInOut()==AvatarSignal.OUT){ - String name = sig.getName(); + } + ar.setPrivate(priv); + } + } + if (channel.getType() == TMLChannel.BRBW) { + ar.setAsynchronous(true); + ar.setSizeOfFIFO(channel.getSize()); + ar.setBlocking(true); + } else if (channel.getType() == TMLChannel.BRNBW) { + ar.setAsynchronous(true); + ar.setSizeOfFIFO(channel.getSize()); + ar.setBlocking(false); + } else { + //Create new block, hope for best + if (mc) { + fifo = createFifo(channel.getName()); + ar.setAsynchronous(false); + } + } + //Find in signal + + List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>(); + //Sig1 contains IN Signals, Sig2 contains OUT signals + sig1.add(signalInMap.get(channel.getName())); + List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>(); + sig2.add(signalOutMap.get(channel.getName())); + for (AvatarSignal sig : signals) { + if (sig.getInOut() == AvatarSignal.IN) { + String name = sig.getName(); + if (name.equals(getName(channel.getName()))) { + // sig1.add(sig); + } + } + } + //Find out signal + for (AvatarSignal sig : signals) { + if (sig.getInOut() == AvatarSignal.OUT) { + String name = sig.getName(); + if (name.equals(channel.getOriginPort().getName())) { + // sig2.add(sig); + } + } + } + //System.out.println("size " + sig1.size() + " " + sig2.size()); + if (sig1.size() == 0) { + sig1.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.IN, null)); + } + if (sig2.size() == 0) { + sig2.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.OUT, null)); + } + if (sig1.size() == 1 && sig2.size() == 1) { + if (channel.getType() == TMLChannel.NBRNBW && mc) { + AvatarSignal read = fifo.getSignalByName("readSignal"); + + ar.block2 = fifo; + //Set IN signal with read + ar.addSignals(sig1.get(0), read); + AvatarRelation ar2 = new AvatarRelation(channel.getName() + "2", fifo, taskBlockMap.get(channel.getDestinationTask()), channel.getReferenceObject()); + AvatarSignal write = fifo.getSignalByName("writeSignal"); + //set OUT signal with write + ar2.addSignals(write, sig2.get(0)); + // System.out.println("Set " + sig2.get(0) + " and write"); + ar2.setAsynchronous(false); + avspec.addRelation(ar2); + } else { + ar.addSignals(sig2.get(0), sig1.get(0)); + } + } else { + //Create relation if it does not exist + if (top.getSignalByName(getName(channel.getName()) + "in") == null) { + AvatarRelation relation = new AvatarRelation(channel.getName(), top, top, channel.getReferenceObject()); + AvatarSignal s1 = new AvatarSignal(getName(channel.getName()) + "in", AvatarSignal.IN, null); + AvatarSignal s2 = new AvatarSignal(getName(channel.getName()) + "out", AvatarSignal.OUT, null); + top.addSignal(s1); + top.addSignal(s2); + relation.addSignals(s2, s1); + avspec.addRelation(relation); + // System.out.println("Failure to match signals for TMLChannel "+ channel.getName()); + } + } + avspec.addRelation(ar); + } else { + //System.out.println("WTF Found non-basic channel"); + //If not a basic channel, create a relation between TOP block and itself + AvatarRelation relation = new AvatarRelation(channel.getName(), top, top, channel.getReferenceObject()); + AvatarSignal s1 = new AvatarSignal(getName(channel.getName()) + "in", AvatarSignal.IN, null); + AvatarSignal s2 = new AvatarSignal(getName(channel.getName()) + "out", AvatarSignal.OUT, null); + top.addSignal(s1); + top.addSignal(s2); + relation.addSignals(s2, s1); + avspec.addRelation(relation); + for (TMLTask t1 : channel.getOriginTasks()) { + for (TMLTask t2 : channel.getDestinationTasks()) { + AvatarRelation ar = new AvatarRelation(channel.getName(), taskBlockMap.get(t1), taskBlockMap.get(t2), channel.getReferenceObject()); + ar.setPrivate(originDestMap.get(t1.getName() + "__" + t2.getName()) == 1); + //Find in signal + List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>(); + List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>(); + for (AvatarSignal sig : signals) { + if (sig.getInOut() == AvatarSignal.IN) { + String name = sig.getName(); + if (name.equals(getName(channel.getName()))) { + sig1.add(sig); + } + } + } + //Find out signal + for (AvatarSignal sig : signals) { + if (sig.getInOut() == AvatarSignal.OUT) { + String name = sig.getName(); + if (name.equals(getName(channel.getName()))) { + sig2.add(sig); + } + } + } + if (sig1.size() == 0) { + sig1.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.IN, null)); + } + if (sig2.size() == 0) { + sig2.add(new AvatarSignal(getName(channel.getName()), AvatarSignal.OUT, null)); + } + if (sig1.size() == 1 && sig2.size() == 1) { + ar.addSignals(sig2.get(0), sig1.get(0)); + } else { + System.out.println("Failure to match signals for TMLChannel " + channel.getName() + " between " + t1.getName() + " and " + t2.getName()); + } + avspec.addRelation(ar); + } + } + } + } + for (TMLRequest request : tmlmodel.getRequests()) { + for (TMLTask t1 : request.getOriginTasks()) { + AvatarRelation ar = new AvatarRelation(request.getName(), taskBlockMap.get(t1), taskBlockMap.get(request.getDestinationTask()), request.getReferenceObject()); + ar.setPrivate(originDestMap.get(t1.getName() + "__" + request.getDestinationTask().getName()) == 1); + List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>(); + List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>(); + for (AvatarSignal sig : signals) { + if (sig.getInOut() == AvatarSignal.IN) { + String name = sig.getName(); + + if (name.equals(getName(request.getName()))) { + sig1.add(sig); + } + } + } + //Find out signal + for (AvatarSignal sig : signals) { + if (sig.getInOut() == AvatarSignal.OUT) { + String name = sig.getName(); - if (name.equals(getName(request.getName()))){ - sig2.add(sig); - } - } - } - if (sig1.size()==0){ - sig1.add(new AvatarSignal(getName(request.getName()), AvatarSignal.IN, null)); - } - if (sig2.size()==0){ - sig2.add(new AvatarSignal(getName(request.getName()), AvatarSignal.OUT, null)); - } - if (sig1.size()==1 && sig2.size()==1){ - ar.addSignals(sig2.get(0), sig1.get(0)); - } - else { - //Throw error - System.out.println("Could not match for " + request.getName()); - } + if (name.equals(getName(request.getName()))) { + sig2.add(sig); + } + } + } + if (sig1.size() == 0) { + sig1.add(new AvatarSignal(getName(request.getName()), AvatarSignal.IN, null)); + } + if (sig2.size() == 0) { + sig2.add(new AvatarSignal(getName(request.getName()), AvatarSignal.OUT, null)); + } + if (sig1.size() == 1 && sig2.size() == 1) { + ar.addSignals(sig2.get(0), sig1.get(0)); + } else { + //Throw error + System.out.println("Could not match for " + request.getName()); + } - ar.setAsynchronous(false); - avspec.addRelation(ar); - } - } - for (TMLEvent event: tmlmodel.getEvents()){ - - AvatarRelation ar = new AvatarRelation(event.getName(), taskBlockMap.get(event.getOriginTask()), taskBlockMap.get(event.getDestinationTask()), event.getReferenceObject()); - ar.setPrivate(originDestMap.get(event.getOriginTask().getName()+"__"+event.getDestinationTask().getName())==1); - List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>(); - List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>(); - for (AvatarSignal sig: signals){ - if (sig.getInOut()==AvatarSignal.IN){ - String name = sig.getName(); - if (name.equals(getName(event.getName()))){ - sig1.add(sig); - } - } - } - //Find out signal - for (AvatarSignal sig: signals){ - if (sig.getInOut()==AvatarSignal.OUT){ - String name = sig.getName(); - if (name.equals(getName(event.getName()))){ - sig2.add(sig); - } - } - } - if (sig1.size()==0){ - sig1.add(new AvatarSignal(getName(event.getName()), AvatarSignal.IN, null)); - } - if (sig2.size()==0){ - sig2.add(new AvatarSignal(getName(event.getName()), AvatarSignal.OUT, null)); - } - if (sig1.size()==1 && sig2.size()==1){ - ar.addSignals(sig2.get(0), sig1.get(0)); - } - else { - //Throw error - System.out.println("Could not match for " + event.getName()); - } - if (event.isBlocking()){ - ar.setAsynchronous(true); - ar.setBlocking(true); - ar.setSizeOfFIFO(event.getMaxSize()); - } - else { - ar.setAsynchronous(true); - ar.setBlocking(false); - ar.setSizeOfFIFO(event.getMaxSize()); + ar.setAsynchronous(false); + avspec.addRelation(ar); + } + } + for (TMLEvent event : tmlmodel.getEvents()) { + + AvatarRelation ar = new AvatarRelation(event.getName(), taskBlockMap.get(event.getOriginTask()), taskBlockMap.get(event.getDestinationTask()), event.getReferenceObject()); + ar.setPrivate(originDestMap.get(event.getOriginTask().getName() + "__" + event.getDestinationTask().getName()) == 1); + List<AvatarSignal> sig1 = new ArrayList<AvatarSignal>(); + List<AvatarSignal> sig2 = new ArrayList<AvatarSignal>(); + for (AvatarSignal sig : signals) { + if (sig.getInOut() == AvatarSignal.IN) { + String name = sig.getName(); + if (name.equals(getName(event.getName()))) { + sig1.add(sig); + } + } + } + //Find out signal + for (AvatarSignal sig : signals) { + if (sig.getInOut() == AvatarSignal.OUT) { + String name = sig.getName(); + if (name.equals(getName(event.getName()))) { + sig2.add(sig); + } + } + } + if (sig1.size() == 0) { + sig1.add(new AvatarSignal(getName(event.getName()), AvatarSignal.IN, null)); + } + if (sig2.size() == 0) { + sig2.add(new AvatarSignal(getName(event.getName()), AvatarSignal.OUT, null)); + } + if (sig1.size() == 1 && sig2.size() == 1) { + ar.addSignals(sig2.get(0), sig1.get(0)); + } else { + //Throw error + System.out.println("Could not match for " + event.getName()); + } + if (event.isBlocking()) { + ar.setAsynchronous(true); + ar.setBlocking(true); + ar.setSizeOfFIFO(event.getMaxSize()); + } else { + ar.setAsynchronous(true); + ar.setBlocking(false); + ar.setSizeOfFIFO(event.getMaxSize()); + + } + avspec.addRelation(ar); + } + + // System.out.println("Avatar relations " + avspec.getRelations()); + + for (AvatarSignal sig : signals) { + // System.out.println("signal " + sig.getName()); + //check that all signals are put in relations + AvatarRelation ar = avspec.getAvatarRelationWithSignal(sig); + if (ar == null) { + System.out.println("missing relation for " + sig.getName()); + } + } + //Check if we matched up all signals + for (SecurityPattern sp : symKeys.keySet()) { + if (symKeys.get(sp).size() > 1) { + String keys = ""; + for (AvatarAttribute key : symKeys.get(sp)) { + keys = keys + " " + key.getBlock().getName() + "." + key.getName(); + } + avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge " + keys, null, symKeys.get(sp), true)); + } + } + for (SecurityPattern sp : pubKeys.keySet()) { + if (pubKeys.get(sp).size() != 0) { + String keys = ""; + List<String> pubKeyNames = new ArrayList<String>(); + for (AvatarAttribute key : pubKeys.get(sp)) { + if (!pubKeyNames.contains(key.getBlock().getName() + "." + key.getName())) { + keys = keys + " " + key.getBlock().getName() + "." + key.getName(); + pubKeyNames.add(key.getBlock().getName() + "." + key.getName()); + } + } + // avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge "+keys, null, pubKeys.get(sp),true)); + //System.out.println("pragma " + keys); + } + } + + tmlmap.getTMLModeling().secChannelMap = secChannelMap; - } - avspec.addRelation(ar); - } - - // System.out.println("Avatar relations " + avspec.getRelations()); - - for (AvatarSignal sig: signals){ - // System.out.println("signal " + sig.getName()); - //check that all signals are put in relations - AvatarRelation ar = avspec.getAvatarRelationWithSignal(sig); - if (ar==null){ - System.out.println("missing relation for " + sig.getName()); - } - } - //Check if we matched up all signals - for (SecurityPattern sp:symKeys.keySet()){ - if (symKeys.get(sp).size()>1){ - String keys = ""; - for (AvatarAttribute key: symKeys.get(sp)){ - keys= keys+" "+key.getBlock().getName() + "."+key.getName(); - } - avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge "+ keys, null, symKeys.get(sp), true)); - } - } - for (SecurityPattern sp:pubKeys.keySet()){ - if (pubKeys.get(sp).size()!=0){ - String keys = ""; - List<String> pubKeyNames = new ArrayList<String>(); - for (AvatarAttribute key: pubKeys.get(sp)){ - if (!pubKeyNames.contains(key.getBlock().getName()+"."+key.getName())){ - keys= keys+" "+key.getBlock().getName() + "."+key.getName(); - pubKeyNames.add(key.getBlock().getName()+"."+key.getName()); - } - } - // avspec.addPragma(new AvatarPragmaInitialKnowledge("#InitialSessionKnowledge "+keys, null, pubKeys.get(sp),true)); - //System.out.println("pragma " + keys); - } - } - - tmlmap.getTMLModeling().secChannelMap = secChannelMap; - // System.out.println("avatar spec\n" +avspec); - return avspec; - } + return avspec; + } - public void backtraceReachability( Map<AvatarPragmaReachability, ProVerifQueryResult> reachabilityResults) { - for (AvatarPragmaReachability pragma: reachabilityResults.keySet()) - { - ProVerifQueryResult result = reachabilityResults.get(pragma); - if (!result.isProved()) - continue; + public void backtraceReachability(Map<AvatarPragmaReachability, ProVerifQueryResult> reachabilityResults) { + for (AvatarPragmaReachability pragma : reachabilityResults.keySet()) { + ProVerifQueryResult result = reachabilityResults.get(pragma); + if (!result.isProved()) + continue; - int r = result.isSatisfied() ? 1 : 2; + int r = result.isSatisfied() ? 1 : 2; - String s = pragma.getBlock().getName() + "__" + pragma.getState().getName(); + String s = pragma.getBlock().getName() + "__" + pragma.getState().getName(); - if (stateObjectMap.containsKey(s)) { - Object obj = stateObjectMap.get(s); - if (obj instanceof TMLADWriteChannel){ - TMLADWriteChannel wc =(TMLADWriteChannel) obj; - wc.reachabilityInformation=r; - } - if (obj instanceof TMLADReadChannel){ - TMLADReadChannel wc =(TMLADReadChannel) obj; - wc.reachabilityInformation=r; - } + if (stateObjectMap.containsKey(s)) { + Object obj = stateObjectMap.get(s); + if (obj instanceof TMLADWriteChannel) { + TMLADWriteChannel wc = (TMLADWriteChannel) obj; + wc.reachabilityInformation = r; + } + if (obj instanceof TMLADReadChannel) { + TMLADReadChannel wc = (TMLADReadChannel) obj; + wc.reachabilityInformation = r; + } - if (obj instanceof TMLADSendEvent){ - TMLADSendEvent wc =(TMLADSendEvent) obj; - wc.reachabilityInformation=r; - } + if (obj instanceof TMLADSendEvent) { + TMLADSendEvent wc = (TMLADSendEvent) obj; + wc.reachabilityInformation = r; + } + + if (obj instanceof TMLADSendRequest) { + TMLADSendRequest wc = (TMLADSendRequest) obj; + wc.reachabilityInformation = r; + } + if (obj instanceof TMLADWaitEvent) { + TMLADWaitEvent wc = (TMLADWaitEvent) obj; + wc.reachabilityInformation = r; + } + } + } + } + + public void distributeKeys() { + List<TMLTask> tasks = tmlmap.getTMLModeling().getTasks(); + for (TMLTask t : accessKeys.keySet()) { + AvatarBlock b = taskBlockMap.get(t); + for (SecurityPattern sp : accessKeys.get(t)) { + if (sp.type.equals("Symmetric Encryption") || sp.type.equals("MAC")) { + AvatarAttribute key = new AvatarAttribute("key_" + sp.name, AvatarType.INTEGER, b, null); + if (symKeys.containsKey(sp)) { + symKeys.get(sp).add(key); + } else { + LinkedList<AvatarAttribute> tmp = new LinkedList<AvatarAttribute>(); + tmp.add(key); + symKeys.put(sp, tmp); + } + b.addAttribute(key); + } else if (sp.type.equals("Asymmetric Encryption")) { + AvatarAttribute pubkey = new AvatarAttribute("pubKey_" + sp.name, AvatarType.INTEGER, b, null); + b.addAttribute(pubkey); + + AvatarAttribute privkey = new AvatarAttribute("privKey_" + sp.name, AvatarType.INTEGER, b, null); + b.addAttribute(privkey); + avspec.addPragma(new AvatarPragmaPrivatePublicKey("#PrivatePublicKeys " + b.getName() + " " + privkey.getName() + " " + + pubkey.getName(), null, privkey, pubkey)); + if (pubKeys.containsKey(sp)) { + pubKeys.get(sp).add(pubkey); + } else { + LinkedList<AvatarAttribute> tmp = new LinkedList<AvatarAttribute>(); + tmp.add(pubkey); + pubKeys.put(sp, tmp); + } + //Distribute public key everywhere + for (TMLTask task2 : tasks) { + AvatarBlock b2 = taskBlockMap.get(task2); + pubkey = new AvatarAttribute("pubKey_" + sp.name, AvatarType.INTEGER, b2, null); + b2.addAttribute(pubkey); + if (pubKeys.containsKey(sp)) { + pubKeys.get(sp).add(pubkey); + } + } + } + } + } + + } + + public AvatarBlock createFifo(String name) { + AvatarBlock fifo = new AvatarBlock("FIFO__FIFO" + name, avspec, null); + AvatarState root = new AvatarState("root", null, false, false); + AvatarSignal read = new AvatarSignal("readSignal", AvatarSignal.IN, null); + AvatarAttribute data = new AvatarAttribute("data", AvatarType.INTEGER, fifo, null); + fifo.addAttribute(data); + read.addParameter(data); + AvatarSignal write = new AvatarSignal("writeSignal", AvatarSignal.OUT, null); + write.addParameter(data); + AvatarStartState start = new AvatarStartState("start", null); + AvatarTransition afterStart = new AvatarTransition(fifo, "afterStart", null); + fifo.addSignal(read); + fifo.addSignal(write); + AvatarTransition toRead = new AvatarTransition(fifo, "toReadSignal", null); + AvatarTransition toWrite = new AvatarTransition(fifo, "toWriteSignal", null); + AvatarTransition afterRead = new AvatarTransition(fifo, "afterReadSignal", null); + AvatarTransition afterWrite = new AvatarTransition(fifo, "afterWriteSignal", null); + AvatarActionOnSignal readAction = new AvatarActionOnSignal("read", read, null); + AvatarActionOnSignal writeAction = new AvatarActionOnSignal("write", write, null); + + AvatarStateMachine asm = fifo.getStateMachine(); + asm.addElement(start); + asm.setStartState(start); + asm.addElement(afterStart); + asm.addElement(root); + asm.addElement(toRead); + asm.addElement(toWrite); + asm.addElement(afterRead); + asm.addElement(afterWrite); + asm.addElement(readAction); + asm.addElement(writeAction); + + start.addNext(afterStart); + afterStart.addNext(root); + root.addNext(toRead); + root.addNext(toWrite); + toRead.addNext(readAction); + toWrite.addNext(writeAction); + readAction.addNext(afterRead); + writeAction.addNext(afterWrite); + afterRead.addNext(root); + afterWrite.addNext(root); + + avspec.addBlock(fifo); + return fifo; + } - if (obj instanceof TMLADSendRequest){ - TMLADSendRequest wc =(TMLADSendRequest) obj; - wc.reachabilityInformation=r; - } - if (obj instanceof TMLADWaitEvent){ - TMLADWaitEvent wc =(TMLADWaitEvent) obj; - wc.reachabilityInformation=r; - } - } - } - } - public void distributeKeys(){ - List<TMLTask> tasks = tmlmap.getTMLModeling().getTasks(); - for (TMLTask t:accessKeys.keySet()){ - AvatarBlock b = taskBlockMap.get(t); - for (SecurityPattern sp: accessKeys.get(t)){ - if (sp.type.equals("Symmetric Encryption") || sp.type.equals("MAC")){ - AvatarAttribute key = new AvatarAttribute("key_"+sp.name, AvatarType.INTEGER, b, null); - if (symKeys.containsKey(sp)){ - symKeys.get(sp).add(key); - } - else { - LinkedList<AvatarAttribute> tmp = new LinkedList<AvatarAttribute>(); - tmp.add(key); - symKeys.put(sp, tmp); - } - b.addAttribute(key); - } - else if (sp.type.equals("Asymmetric Encryption")){ - AvatarAttribute pubkey = new AvatarAttribute("pubKey_"+sp.name, AvatarType.INTEGER, b, null); - b.addAttribute(pubkey); - - AvatarAttribute privkey = new AvatarAttribute("privKey_"+sp.name, AvatarType.INTEGER, b, null); - b.addAttribute(privkey); - avspec.addPragma(new AvatarPragmaPrivatePublicKey("#PrivatePublicKeys " + b.getName() + " " + privkey.getName() + " " + pubkey.getName(), null, privkey, pubkey)); - if (pubKeys.containsKey(sp)){ - pubKeys.get(sp).add(pubkey); - } - else { - LinkedList<AvatarAttribute> tmp = new LinkedList<AvatarAttribute>(); - tmp.add(pubkey); - pubKeys.put(sp, tmp); - } - //Distribute public key everywhere - for (TMLTask task2 : tasks){ - AvatarBlock b2 = taskBlockMap.get(task2); - pubkey = new AvatarAttribute("pubKey_"+sp.name, AvatarType.INTEGER, b2, null); - b2.addAttribute(pubkey); - if (pubKeys.containsKey(sp)){ - pubKeys.get(sp).add(pubkey); - } - } - } - } - } - - } - public AvatarBlock createFifo(String name){ - AvatarBlock fifo = new AvatarBlock("FIFO__FIFO"+name, avspec, null); - AvatarState root = new AvatarState("root",null, false, false); - AvatarSignal read = new AvatarSignal("readSignal", AvatarSignal.IN, null); - AvatarAttribute data = new AvatarAttribute("data", AvatarType.INTEGER, fifo, null); - fifo.addAttribute(data); - read.addParameter(data); - AvatarSignal write = new AvatarSignal("writeSignal", AvatarSignal.OUT, null); - write.addParameter(data); - AvatarStartState start = new AvatarStartState("start", null); - AvatarTransition afterStart = new AvatarTransition(fifo, "afterStart", null); - fifo.addSignal(read); - fifo.addSignal(write); - AvatarTransition toRead = new AvatarTransition(fifo, "toReadSignal", null); - AvatarTransition toWrite = new AvatarTransition(fifo, "toWriteSignal", null); - AvatarTransition afterRead = new AvatarTransition(fifo, "afterReadSignal", null); - AvatarTransition afterWrite = new AvatarTransition(fifo, "afterWriteSignal", null); - AvatarActionOnSignal readAction= new AvatarActionOnSignal("read", read, null); - AvatarActionOnSignal writeAction= new AvatarActionOnSignal("write", write, null); - - AvatarStateMachine asm = fifo.getStateMachine(); - asm.addElement(start); - asm.setStartState(start); - asm.addElement(afterStart); - asm.addElement(root); - asm.addElement(toRead); - asm.addElement(toWrite); - asm.addElement(afterRead); - asm.addElement(afterWrite); - asm.addElement(readAction); - asm.addElement(writeAction); - - start.addNext(afterStart); - afterStart.addNext(root); - root.addNext(toRead); - root.addNext(toWrite); - toRead.addNext(readAction); - toWrite.addNext(writeAction); - readAction.addNext(afterRead); - writeAction.addNext(afterWrite); - afterRead.addNext(root); - afterWrite.addNext(root); - - avspec.addBlock(fifo); - return fifo; - } - - public AvatarSpecification convertToSecurityType(AvatarSpecification spec) { return spec; } diff --git a/src/main/java/ui/GTURTLEModeling.java b/src/main/java/ui/GTURTLEModeling.java index a2ac47c1bd..c7b20fc9af 100644 --- a/src/main/java/ui/GTURTLEModeling.java +++ b/src/main/java/ui/GTURTLEModeling.java @@ -9172,7 +9172,8 @@ public class GTURTLEModeling { if (blockLevelMap.get(ab) == level) { if (level == 0) { TraceManager.addDev("New block at level 0"); - AvatarBDBlock bl = new AvatarBDBlock(xpos, ypos, abd.getMinX(), abd.getMaxX(), abd.getMinY(), abd.getMaxY(), false, null, abd); + AvatarBDBlock bl = new AvatarBDBlock(xpos, ypos, abd.getMinX(), abd.getMaxX(), abd.getMinY(), abd.getMaxY(), false, + null, abd); if ((ab.getReferenceObject() != null) && (ab.getReferenceObject() instanceof CDElement)) { CDElement cd = (CDElement) ab.getReferenceObject(); bl.setUserResize(cd.getX(), cd.getY(), cd.getWidth(), cd.getHeight()); @@ -9189,7 +9190,8 @@ public class GTURTLEModeling { xpos += 100 * blockSizeMap.get(ab) + 200; } else { TraceManager.addDev("New block at level " + level); - AvatarBDBlock father = blockMap.get(ab.getFather().getName().split("__")[ab.getFather().getName().split("__").length - 1]); + AvatarBDBlock father = + blockMap.get(ab.getFather().getName().split("__")[ab.getFather().getName().split("__").length - 1]); TraceManager.addDev("Father name: " + father.getBlockName()); if (father == null) { // @@ -9289,43 +9291,50 @@ public class GTURTLEModeling { //Add Pragmas - /*AvatarBDPragma pragma = new AvatarBDPragma(xpos, ypos, xpos, xpos * 2, ypos, ypos * 2, false, null, abd); - // String[] arr = new String[avspec.getPragmas().size()]; - String s = ""; - // int i=0; - for ( - AvatarPragma p : avspec.getPragmas()) { - // arr[i] = p.getName(); - String t = ""; - String[] split = p.getName().split(" "); - if (p.getName().contains("#Confidentiality")) { - for (String str : split) { - if (str.contains(".")) { - String tmp = str.split("\\.")[0]; - String tmp2 = str.split("\\.")[1]; - t = t.concat(tmp.split("__")[tmp.split("__").length - 1] + "." + tmp2.split("__")[tmp2.split("__").length - 1] + " "); - } else { - t = t.concat(str + " "); + + if (avspec.getPragmas().size() > 0) { + AvatarBDPragma pragma = new AvatarBDPragma(xpos, ypos, xpos, xpos * 2, ypos, ypos * 2, false, null, abd); + // String[] arr = new String[avspec.getPragmas().size()]; + String s = ""; + // int i=0; + for (AvatarPragma p : avspec.getPragmas()) { + + // arr[i] = p.getName(); + String t = ""; + String[] split = p.getName().split(" "); + if (p.getName().contains("#Confidentiality")) { + for (String str : split) { + if (str.contains(".")) { + String tmp = str.split("\\.")[0]; + String tmp2 = str.split("\\.")[1]; + t = t.concat(tmp.split("__")[tmp.split("__").length - 1] + + "." + tmp2.split("__")[tmp2.split("__").length - 1] + " "); + } else { + t = t.concat(str + " "); + } } + } else if (p.getName().contains("Authenticity")) { + t = p.getName(); + } else if (p.getName().contains("Initial")) { + t = p.getName(); + } else { + t = p.getName(); } - } else if (p.getName().contains("Authenticity")) { - t = p.getName(); - } else if (p.getName().contains("Initial")) { - t = p.getName(); - } else { - t = p.getName(); + s = s.concat(t + "\n"); + // i++; } - s = s.concat(t + "\n"); - // i++; + pragma.setValue(s); + pragma.makeValue(); + abd.addComponent(pragma, xpos, ypos, false, true); } - pragma.setValue(s); - pragma.makeValue(); - abd.addComponent(pragma, xpos, ypos, false, true); + + + //Add message and key datatype if there is a cryptoblock xpos = 50; - ypos += 200;*/ + ypos += 200; if (hasCrypto) { AvatarBDDataType message = new AvatarBDDataType(xpos, ypos, xpos, xpos * 2, ypos, ypos * 2, false, null, abd); message.setValue("Message"); diff --git a/src/main/java/ui/MainGUI.java b/src/main/java/ui/MainGUI.java index a463f50682..d687209e03 100644 --- a/src/main/java/ui/MainGUI.java +++ b/src/main/java/ui/MainGUI.java @@ -4787,17 +4787,21 @@ public class MainGUI implements ActionListener, WindowListener, KeyListener, Per * (tp instanceof TMLComponentDesignPanel) { * ((TMLComponentDesignPanel)tp).modelBacktracingProVerif(pvoa); } } */ - gtm.getTMLMapping().getTMLModeling().clearBacktracing(); - gtm.getTMLMapping().getTMLModeling().backtrace(pvoa, getTabName(tp)); - gtm.getTML2Avatar().backtraceReachability(pvoa.getReachabilityResults()); - gtm.getTMLMapping().getTMLModeling().backtraceAuthenticity(pvoa, getTabName(tp)); + if (gtm.getTMLMapping() != null) { + gtm.getTMLMapping().getTMLModeling().clearBacktracing(); + gtm.getTMLMapping().getTMLModeling().backtrace(pvoa, getTabName(tp)); + gtm.getTML2Avatar().backtraceReachability(pvoa.getReachabilityResults()); + gtm.getTMLMapping().getTMLModeling().backtraceAuthenticity(pvoa, getTabName(tp)); + } } else if (tp instanceof TMLComponentDesignPanel) { TraceManager.addDev("Backtracing to TMLComponentDesignPanel"); - gtm.getTMLMapping().getTMLModeling().clearBacktracing(); - gtm.getTMLMapping().getTMLModeling().backtrace(pvoa, "Default Mapping"); - gtm.getTML2Avatar().backtraceReachability(pvoa.getReachabilityResults()); - gtm.getTMLMapping().getTMLModeling().backtraceAuthenticity(pvoa, "Default Mapping"); + if (gtm.getTMLMapping() != null) { + gtm.getTMLMapping().getTMLModeling().clearBacktracing(); + gtm.getTMLMapping().getTMLModeling().backtrace(pvoa, "Default Mapping"); + gtm.getTML2Avatar().backtraceReachability(pvoa.getReachabilityResults()); + gtm.getTMLMapping().getTMLModeling().backtraceAuthenticity(pvoa, "Default Mapping"); + } } return; } diff --git a/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java b/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java index af00092c29..d6b6d81bf9 100755 --- a/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java +++ b/src/main/java/ui/tmlcompd/TMLCPrimitivePort.java @@ -374,6 +374,10 @@ Color c = g.getColor(); Color c1; Color c2; + + //TraceManager.addDev("Drawing port " + getPortName() + ": checkStrongAuthStatus=" + checkStrongAuthStatus); + //TraceManager.addDev("Drawing port " + getPortName() + ": checkWeakAuthStatus=" + checkWeakAuthStatus); + switch (checkStrongAuthStatus) { case 2: c1 = Color.green; @@ -1268,10 +1272,12 @@ public void setStrongAuthStatus(int _status) { + TraceManager.addDev("Port " + getPortName() + ": Strong Auth status set to " + _status ); checkStrongAuthStatus = _status; } public void setWeakAuthStatus(int _status) { + TraceManager.addDev("Port " + getPortName() + ": Weak Auth status set to " + _status ); checkWeakAuthStatus = _status; } diff --git a/src/main/java/ui/window/JDialogProverifVerification.java b/src/main/java/ui/window/JDialogProverifVerification.java index 4391c4f358..9a172e77e9 100644 --- a/src/main/java/ui/window/JDialogProverifVerification.java +++ b/src/main/java/ui/window/JDialogProverifVerification.java @@ -138,6 +138,8 @@ public class JDialogProverifVerification extends JDialog implements ActionListen private static boolean PI_CALCULUS = true; private static int LOOP_ITERATION = 1; + private static boolean DRAW_AVATAR = false; + protected MainGUI mgui; private AvatarDesignPanel adp; @@ -181,7 +183,7 @@ public class JDialogProverifVerification extends JDialog implements ActionListen // Security generation buttons ButtonGroup secGroup; - protected JCheckBox autoConf, autoWeakAuth, autoStrongAuth, custom, addHSM; + protected JCheckBox drawAvatarDesign, autoConf, autoWeakAuth, autoStrongAuth, custom, addHSM; protected JRadioButton autoSec, autoMapKeys; protected JTextField encTime, decTime, secOverhead; protected JComboBox<String> addtoCPU; @@ -496,6 +498,8 @@ public class JDialogProverifVerification extends JDialog implements ActionListen GridBagConstraints.BOTH, insets, 0, 0)); curY++; + + JLabel gen = new JLabel("Generate ProVerif code in: "); addComponent(jp01, gen, 0, curY, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH); @@ -554,6 +558,13 @@ public class JDialogProverifVerification extends JDialog implements ActionListen curY++; } + if (mgui.isExperimentalOn()) { + drawAvatarDesign = new JCheckBox("Draw Avatar model"); + drawAvatarDesign.setSelected(DRAW_AVATAR); + drawAvatarDesign.addActionListener(this); + addComponent(jp01, drawAvatarDesign, 2, curY, 2, GridBagConstraints.CENTER, GridBagConstraints.BOTH); + } + JLabel empty = new JLabel(""); jp01.add(empty, new GridBagConstraints(0, curY, 3, 1, 1.0, 1.0, GridBagConstraints.CENTER, GridBagConstraints.BOTH, insets, 0, 0)); @@ -663,6 +674,11 @@ public class JDialogProverifVerification extends JDialog implements ActionListen public void actionPerformed(ActionEvent evt) { String command = evt.getActionCommand(); + if (evt.getSource() == drawAvatarDesign) { + DRAW_AVATAR = drawAvatarDesign.isSelected(); + return; + } + switch (command) { case "Start": startProcess(); @@ -902,16 +918,21 @@ public class JDialogProverifVerification extends JDialog implements ActionListen TraceManager.addDev("FILE EXISTS!!!"); } + + if (!mgui.gtm.generateProVerifFromAVATAR( pathCode, - stateReachabilityAll.isSelected() ? REACHABILITY_ALL : stateReachabilitySelected.isSelected() ? REACHABILITY_SELECTED : REACHABILITY_NONE, + stateReachabilityAll.isSelected() ? REACHABILITY_ALL : + stateReachabilitySelected.isSelected() ? REACHABILITY_SELECTED : REACHABILITY_NONE, typedLanguage.isSelected(), privateChannelDup.isSelected(), loopLimit.getText()) ) { throw new ProVerifVerificationException("Could not generate proverif code"); } - + + + String cmd = exe2.getText().trim(); @@ -943,6 +964,12 @@ public class JDialogProverifVerification extends JDialog implements ActionListen mgui.modelBacktracingProVerif(pvoa); + if (drawAvatarDesign != null) { + if (drawAvatarDesign.isSelected()) { + mgui.drawAvatarSpecification(mgui.gtm.getAvatarSpecification()); + } + } + mode = NOT_STARTED; } -- GitLab