package ui; import java.awt.Point; import java.io.Reader; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import java.util.Vector; import avatartranslator.AvatarPragmaAuthenticity; import avatartranslator.AvatarPragmaSecret; import avatartranslator.AvatarSpecification; import avatartranslator.toproverif.AVATAR2ProVerif; import common.ConfigurationTTool; import launcher.RshClient; import myutil.TraceManager; import proverifspec.ProVerifOutputAnalyzer; import proverifspec.ProVerifQueryAuthResult; import proverifspec.ProVerifQueryResult; import proverifspec.ProVerifSpec; import tmltranslator.TMLChannel; import tmltranslator.TMLMapping; import tmltranslator.TMLModeling; import tmltranslator.TMLPort; import tmltranslator.TMLTask; import tmltranslator.toavatarsec.TML2Avatar; import ui.tmlad.TGConnectorTMLAD; import ui.tmlad.TMLADChoice; import ui.tmlad.TMLADDecrypt; import ui.tmlad.TMLADEncrypt; import ui.tmlad.TMLADReadChannel; import ui.tmlad.TMLADReadRequestArg; import ui.tmlad.TMLADSendRequest; import ui.tmlad.TMLADStartState; import ui.tmlad.TMLADStopState; import ui.tmlad.TMLADWriteChannel; import ui.tmlad.TMLActivityDiagramPanel; import ui.tmlcompd.TMLCChannelOutPort; import ui.tmlcompd.TMLCCompositeComponent; import ui.tmlcompd.TMLCPortConnector; import ui.tmlcompd.TMLCPrimitiveComponent; import ui.tmlcompd.TMLCPrimitivePort; import ui.tmlcompd.TMLComponentTaskDiagramPanel; import ui.tmldd.TMLArchiArtifact; import ui.tmldd.TMLArchiBUSNode; import ui.tmldd.TMLArchiCPUNode; import ui.tmldd.TMLArchiConnectorNode; import ui.tmldd.TMLArchiDiagramPanel; import ui.tmldd.TMLArchiHWANode; import ui.tmldd.TMLArchiMemoryNode; public class SecurityGeneration implements Runnable { MainGUI gui; String name; TMLMapping<TGComponent> map; TMLArchiPanel newarch; String encComp; String overhead; String decComp; Map<String, List<String>> selectedCPUTasks; boolean autoConf; boolean autoWeakAuth; boolean autoStrongAuth; int channelIndex=0; TMLComponentDesignPanel tmlcdp; AVATAR2ProVerif avatar2proverif; AvatarSpecification avatarspec; ProVerifSpec proverif; Map<String, HSMChannel> hsmChannels = new HashMap<String, HSMChannel>(); Map<String, HSMChannel> secChannels = new HashMap<String, HSMChannel>(); Map<String, Integer> channelIndexMap = new HashMap<String, Integer>(); Map<String, List<HSMChannel>> hsmChannelMap = new HashMap<String, List<HSMChannel>>(); Map<String, String> taskHSMMap = new HashMap<String, String>(); List<String> hsmTasks = new ArrayList<String>(); Map<String, String> channelSecMap = new HashMap<String, String>(); TMLMapping<TGComponent> newMap; public SecurityGeneration(MainGUI gui, String name, TMLMapping<TGComponent> map, TMLArchiPanel newarch, String encComp, String overhead, String decComp, boolean autoConf, boolean autoWeakAuth, boolean autoStrongAuth, Map<String, List<String>> selectedCPUTasks){ this.gui = gui; this.name=name; this.map=map; this.newMap=map; this.newarch=newarch; this.encComp = encComp; this.overhead = overhead; this.decComp = decComp; this.autoConf=autoConf; this.autoWeakAuth = autoWeakAuth; this.autoStrongAuth = autoStrongAuth; this.selectedCPUTasks = selectedCPUTasks; } public void proverifAnalysis(TMLMapping<TGComponent> map, List<String> nonAuthChans, List<String> nonConfChans) { if (map == null) { TraceManager.addDev("No mapping"); return; } //Perform ProVerif Analysis TML2Avatar t2a = new TML2Avatar(newMap, false, true); AvatarSpecification avatarspec = t2a.generateAvatarSpec("1"); if (avatarspec == null) { TraceManager.addDev("No avatar spec"); return; } avatar2proverif = new AVATAR2ProVerif(avatarspec); try { proverif = avatar2proverif.generateProVerif(true, true, 3, true, true); //warnings = avatar2proverif.getWarnings(); if (!avatar2proverif.saveInFile("pvspec")) { return; } RshClient rshc = new RshClient(ConfigurationTTool.ProVerifVerifierHost); rshc.setCmd(ConfigurationTTool.ProVerifVerifierPath + " -in pitype pvspec"); rshc.sendExecuteCommandRequest(); Reader data = rshc.getDataReaderFromProcess(); ProVerifOutputAnalyzer pvoa = avatar2proverif.getOutputAnalyzer(); pvoa.analyzeOutput(data, true); if (pvoa.getResults().size() ==0){ TraceManager.addDev("ERROR: No security results"); } Map<AvatarPragmaSecret, ProVerifQueryResult> confResults = pvoa.getConfidentialityResults(); for (AvatarPragmaSecret pragma : confResults.keySet()) { // System.out.println("Pragma " + pragma); if (confResults.get(pragma).isProved() && !confResults.get(pragma).isSatisfied()) { nonConfChans.add(pragma.getArg().getBlock().getName() + "__" + pragma.getArg().getName()); TraceManager.addDev(pragma.getArg().getBlock().getName() + "." + pragma.getArg().getName() + " is not secret"); TMLChannel chan = map.getTMLModeling().getChannelByShortName(pragma.getArg().getName().replaceAll("_chData", "")); if (chan==null){ chan = map.getTMLModeling().getChannelByOriginPortName(pragma.getArg().getName().replaceAll("_chData", "")); } if (chan==null){ continue; } if (chan.isBasicChannel()){ nonConfChans.add(chan.getOriginTask().getName() + "__" + pragma.getArg().getName()); } else { for (TMLTask originTask: chan.getOriginTasks()){ nonConfChans.add(originTask.getName() + "__" + pragma.getArg().getName()); } } } } Map<AvatarPragmaAuthenticity, ProVerifQueryAuthResult> authResults = pvoa.getAuthenticityResults(); for (AvatarPragmaAuthenticity pragma : authResults.keySet()) { if (authResults.get(pragma).isProved() && !authResults.get(pragma).isSatisfied()) { nonAuthChans.add(pragma.getAttrA().getAttribute().getBlock().getName() + "__" + pragma.getAttrA().getAttribute().getName().replaceAll("_chData", "")); nonAuthChans.add(pragma.getAttrB().getAttribute().getBlock().getName() + "__" + pragma.getAttrB().getAttribute().getName().replaceAll("_chData", "")); } } // TraceManager.addDev("nonConfChans " + nonConfChans); // TraceManager.addDev("nonauthchans " + nonAuthChans); // TraceManager.addDev("all results displayed"); } catch (Exception e) { System.out.println("EXCEPTION " + e); } } public TMLMapping<TGComponent> startThread(){ Thread t = new Thread(this); t.start(); try { t.join(); } catch (Exception e){ TraceManager.addDev("Error in Security Generation Thread"); System.out.println("Error in Security Generation Thread"); } return map; } /** * Issue #204: Accounting for the change in naming tasks * @param task * @return */ private String getActivityDiagramName( final TMLTask task ) { if ( task == null || task.getName() == null ) { return null; } final String[] splittedName = task.getName().split( "__"); if ( splittedName.length > 0 ) { return splittedName[ 1 ]; } return task.getName(); } public boolean portInTask(TMLTask task, String portName){ TMLActivityDiagramPanel tad = tmlcdp.getTMLActivityDiagramPanel(task.getName());// FIXME ( getActivityDiagramName( task ) ); for (TGComponent tg : tad.getComponentList()) { if (tg instanceof TMLADWriteChannel) { TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg; if (writeChannel.getChannelName().equals(portName)) { return true; } } else if (tg instanceof TMLADReadChannel){ TMLADReadChannel readChannel = (TMLADReadChannel) tg; if (readChannel.getChannelName().equals(portName)) { return true; } } } return false; } public void run(){ GTMLModeling gtm = new GTMLModeling(newarch, true); map = gtm.translateToTMLMapping(); // oldmodel = map.getTMLModeling(); Map<TMLTask, HashSet<TMLTask>> toSecure = new HashMap<TMLTask, HashSet<TMLTask>>(); Map<TMLTask, HashSet<TMLTask>> toSecureRev = new HashMap<TMLTask, HashSet<TMLTask>>(); Map<TMLTask, HashSet<String>> secOutChannels = new HashMap<TMLTask, HashSet<String>>(); Map<TMLTask, HashSet<String>> secInChannels = new HashMap<TMLTask, HashSet<String>>(); Map<TMLTask, HashSet<String>> nonceOutChannels = new HashMap<TMLTask, HashSet<String>>(); Map<TMLTask, HashSet<String>> nonceInChannels = new HashMap<TMLTask, HashSet<String>>(); Map<TMLTask, HashSet<String>> macOutChannels = new HashMap<TMLTask, HashSet<String>>(); Map<TMLTask, HashSet<String>> macInChannels = new HashMap<TMLTask, HashSet<String>>(); Map<TMLTask, HashSet<String>> hsmSecInChannels = new HashMap<TMLTask, HashSet<String>>(); Map<TMLTask, HashSet<String>> hsmSecOutChannels = new HashMap<TMLTask, HashSet<String>>(); //TraceManager.addDev("mapping " + map.getSummaryTaskMapping()); // Map<String, HSMChannel> secChannels = new HashMap<String, HSMChannel>(); //Map<String, HSMChannel> hsmChannels = new HashMap<String, HSMChannel>(); for (String cpuName : selectedCPUTasks.keySet()) { for (String task: selectedCPUTasks.get(cpuName)){ hsmTasks.add(task); taskHSMMap.put(task, cpuName); } hsmChannelMap.put(cpuName, new ArrayList<HSMChannel>()); } //Proverif Analysis channels List<String> nonAuthChans = new ArrayList<String>(); List<String> nonConfChans = new ArrayList<String>(); proverifAnalysis(map, nonAuthChans, nonConfChans); TMLModeling<TGComponent> tmlmodel = map.getTMLModeling(); List<TMLChannel> channels = tmlmodel.getChannels(); for (TMLChannel channel : channels) { for (TMLCPrimitivePort p : channel.ports) { channel.checkConf = channel.checkConf || p.checkConf; channel.checkAuth = channel.checkAuth || p.checkAuth; } } //System.out.println("Nonauth " + nonAuthChans); //System.out.println("NonConf " + nonConfChans); //Create clone of Component Diagram + Activity diagrams to secure TGComponent tgcomp = map.getTMLModeling().getTGComponent(); tmlcdp = (TMLComponentDesignPanel) tgcomp.getTDiagramPanel().tp; // TMLComponentDesignPanel tmlcdp = map.getTMLCDesignPanel(); int ind = gui.tabs.indexOf(tmlcdp); if (ind == -1) { TraceManager.addDev("No Component Design Panel"); return; } String tabName = gui.getTitleAt(tmlcdp); String title = tabName; gui.cloneRenameTab(ind, name); tmlcdp = (TMLComponentDesignPanel) gui.tabs.get(gui.tabs.size() - 1); TMLComponentTaskDiagramPanel tcdp = tmlcdp.tmlctdp; //Create clone of architecture panel and map tasks to it newarch.renameMapping(tabName, tabName + "_" + name); for (TMLTask task : map.getTMLModeling().getTasks()) { HashSet<String> tmp = new HashSet<String>(); HashSet<String> tmp2 = new HashSet<String>(); HashSet<TMLTask> tmp3 = new HashSet<TMLTask>(); HashSet<TMLTask> tmp4 = new HashSet<TMLTask>(); HashSet<String> tmp5 = new HashSet<String>(); HashSet<String> tmp6 = new HashSet<String>(); HashSet<String> tmp7 = new HashSet<String>(); HashSet<String> tmp8 = new HashSet<String>(); HashSet<String> tmp9 = new HashSet<String>(); HashSet<String> tmp10 = new HashSet<String>(); secInChannels.put(task, tmp); secOutChannels.put(task, tmp2); toSecure.put(task, tmp3); toSecureRev.put(task, tmp4); nonceInChannels.put(task, tmp5); nonceOutChannels.put(task, tmp6); macInChannels.put(task, tmp7); macOutChannels.put(task, tmp8); hsmSecInChannels.put(task, tmp9); hsmSecOutChannels.put(task, tmp10); } //ToSecure keeps a map of origin task: {dest task} for which security operators need to be added //ToSecureRev keeps a map of dest task: {origin task} for which security operators need to be added //SecOutChannels are channels which need symmetric encryption operators added //SecInChannels are channels which need sym decryption operators added //nonceInChannels are channels which need to send a nonce before receiving the channel data //nonceOutChannels are channels which need to receive a nonce before sending the channel data //macInChannels are channels which need verifymac operators added //macOutChannels are channels which need mac operators added //hsmSecInChannels need to send data to the hsm to decrypt after receiving channel data //hsmSecOutChannels need to send data to the hsm to encrypt before sending channel data //With the proverif results, check which channels need to be secured for (TMLTask task : map.getTMLModeling().getTasks()) { //System.out.println("Task " + task.getName()); //Check if all channel operators are secured TMLActivityDiagramPanel tad = tmlcdp.getTMLActivityDiagramPanel(task.getName()); //FIXME getActivityDiagramName( task ) ) if (tad==null){ continue; } for (TMLChannel chan: tmlmodel.getChannels(task)){ //Origin and Destination ports can have different names. Therefore, we need to put both names in the list of channels to secure. List<String> portNames = new ArrayList<String>(); boolean nonConf = false; boolean nonAuth = false; if (chan.isBasicChannel()){ portNames.add(chan.getOriginPort().getName()); portNames.add(chan.getDestinationPort().getName()); if (nonConfChans.contains(chan.getOriginTask().getName().split("__")[1] + "__" + chan.getOriginPort().getName() + "_chData")){ nonConf=true; } if (nonAuthChans.contains(chan.getDestinationTask().getName().split("__")[1] + "__" + title + "__" + chan.getDestinationPort().getName())){ nonAuth=true; } //When port names are different if (nonAuthChans.contains(chan.getDestinationTask().getName().split("__")[1] + "__" + chan.getName())){ nonAuth=true; } } else { for (TMLPort port: chan.getOriginPorts()){ for (TMLTask origTask: chan.getOriginTasks()){ if (nonConfChans.contains(origTask.getName().split("__")[1] + "__" + port.getName() + "_chData")){ nonConf=true; } } portNames.add(port.getName()); } for (TMLTask destTask: chan.getDestinationTasks()){ for (TMLPort port: chan.getDestinationPorts()){ if (nonAuthChans.contains(destTask.getName().split("__")[1] + "__" + title + "__" + port.getName())){ nonAuth=true; } if (!portNames.contains(port.getName())){ portNames.add(port.getName()); } } //System.out.println(destTask.getName().split("__")[1] + "__" + chan.getName()); if (nonAuthChans.contains(destTask.getName().split("__")[1] + "__" + chan.getName())){ nonAuth=true; } } //When port names are different } // System.out.println("channel " + chan.getName() + " ports " + portNames); String secName = chan.getName().split("__")[chan.getName().split("__").length-1]; for (String chanName: portNames){ //Classify channels based on the type of security requirements and unsatisfied properties if (chan.isBasicChannel()){ if (chan.checkConf && autoConf && nonConf) { toSecure.get(chan.getOriginTask()).add(chan.getDestinationTask()); if (chan.checkAuth && autoStrongAuth) { if (!toSecureRev.get(chan.getDestinationTask()).contains(chan.getOriginTask())){ toSecureRev.get(chan.getDestinationTask()).add(chan.getOriginTask()); } } if (hsmTasks.contains(chan.getOriginTask().getName().split("__")[1])){ channelSecMap.put(chanName, "hsmSec_"+secName); if (!hsmSecOutChannels.get(chan.getOriginTask()).contains(chanName) && portInTask(chan.getOriginTask(),chanName)){ HSMChannel hsmchan = new HSMChannel(chanName, chan.getOriginTask().getName().split("__")[1], HSMChannel.SENC); hsmChannelMap.get(taskHSMMap.get(chan.getOriginTask().getName().split("__")[1])).add(hsmchan); hsmSecOutChannels.get(chan.getOriginTask()).add(chanName); if (chan.checkAuth && autoStrongAuth) { nonceOutChannels.get(chan.getOriginTask()).add(chanName); hsmchan.nonceName="nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1]; } } } else { if (!secOutChannels.get(chan.getOriginTask()).contains(chanName)) { secOutChannels.get(chan.getOriginTask()).add(chanName); channelSecMap.put(chanName, "autoEncrypt_"+secName); if (chan.checkAuth && autoStrongAuth) { nonceOutChannels.get(chan.getOriginTask()).add(chanName); } } } if (hsmTasks.contains(chan.getDestinationTask().getName().split("__")[1])){ if (!hsmSecInChannels.get(chan.getDestinationTask()).contains(chanName) && portInTask(chan.getDestinationTask(),chanName) ) { HSMChannel hsmchan = new HSMChannel(chanName, chan.getDestinationTask().getName().split("__")[1], HSMChannel.DEC); hsmChannelMap.get(taskHSMMap.get(chan.getDestinationTask().getName().split("__")[1])).add(hsmchan); hsmSecInChannels.get(chan.getDestinationTask()).add(chanName); if (chan.checkAuth && autoStrongAuth) { nonceInChannels.get(chan.getDestinationTask()).add(chanName); hsmchan.nonceName="nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1]; } } } else { if (!secInChannels.get(chan.getDestinationTask()).contains(chanName)) { secInChannels.get(chan.getDestinationTask()).add(chanName); if (chan.checkAuth && autoStrongAuth) { nonceInChannels.get(chan.getDestinationTask()).add(chanName); } } } } else if (chan.checkAuth && autoWeakAuth && nonAuth) { toSecure.get(chan.getOriginTask()).add(chan.getDestinationTask()); if (autoStrongAuth) { if (!toSecureRev.get(chan.getDestinationTask()).contains(chan.getOriginTask())){ toSecureRev.get(chan.getDestinationTask()).add(chan.getOriginTask()); } /*} else { TMLChannel chantmp = oldmodel.getChannelByShortName("__"+chan.getName()); System.out.println("Channel found "+ chantmp); }*/ } if (hsmTasks.contains(chan.getOriginTask().getName().split("__")[1])){ channelSecMap.put(chanName, "hsmSec_"+secName); if (!hsmSecOutChannels.get(chan.getOriginTask()).contains(chanName) && portInTask(chan.getOriginTask(),chanName)){ HSMChannel hsmchan = new HSMChannel(chanName, chan.getOriginTask().getName().split("__")[1], HSMChannel.MAC); hsmChannelMap.get(taskHSMMap.get(chan.getOriginTask().getName().split("__")[1])).add(hsmchan); hsmSecOutChannels.get(chan.getOriginTask()).add(chanName); if (autoStrongAuth) { nonceOutChannels.get(chan.getOriginTask()).add(chanName); hsmchan.nonceName="nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1]; } } } else { if (!macInChannels.get(chan.getOriginTask()).contains(chanName)) { macOutChannels.get(chan.getOriginTask()).add(chanName); channelSecMap.put(chanName, "autoEncrypt_"+secName); if (autoStrongAuth) { nonceOutChannels.get(chan.getOriginTask()).add(chanName); } } } if (hsmTasks.contains(chan.getDestinationTask().getName().split("__")[1])){ if (!hsmSecInChannels.get(chan.getDestinationTask()).contains(chanName) && portInTask(chan.getDestinationTask(),chanName)) { HSMChannel hsmchan = new HSMChannel(chanName, chan.getDestinationTask().getName().split("__")[1], HSMChannel.DEC); hsmChannelMap.get(taskHSMMap.get(chan.getDestinationTask().getName().split("__")[1])).add(hsmchan); hsmSecInChannels.get(chan.getDestinationTask()).add(chanName); if (chan.checkAuth && autoStrongAuth) { nonceInChannels.get(chan.getDestinationTask()).add(chanName); hsmchan.nonceName="nonce_" + chan.getDestinationTask().getName().split("__")[1] + "_" + chan.getOriginTask().getName().split("__")[1]; } } } else { if (!secInChannels.get(chan.getDestinationTask()).contains(chanName)) { secInChannels.get(chan.getDestinationTask()).add(chanName); if (chan.checkAuth && autoStrongAuth) { nonceInChannels.get(chan.getDestinationTask()).add(chanName); } } } } } else { //Ignore strong authenticity for fork and join channels //Only add hsm channel for own port for (TMLTask orig: chan.getOriginTasks()){ for (TMLTask dest:chan.getDestinationTasks()){ if (chan.checkConf && autoConf && nonConf) { toSecure.get(orig).add(dest); /*if (chan.checkAuth && autoStrongAuth) { if (!toSecureRev.get(dest).contains(orig)){ toSecureRev.get(dest).add(orig); } }*/ if (hsmTasks.contains(orig.getName().split("__")[1])){ channelSecMap.put(chanName, "hsmSec_"+secName); if (!hsmSecOutChannels.get(orig).contains(chanName) && portInTask(orig,chanName)){ HSMChannel hsmchan = new HSMChannel(chanName, orig.getName().split("__")[1], HSMChannel.SENC); hsmChannelMap.get(taskHSMMap.get(orig.getName().split("__")[1])).add(hsmchan); hsmSecOutChannels.get(orig).add(chanName); /* if (chan.checkAuth && autoStrongAuth) { nonceOutChannels.get(orig).add(chanName); hsmchan.nonceName="nonce_" + dest.getName().split("__")[1] + "_" + orig.getName().split("__")[1]; }*/ } } else { if (!secOutChannels.get(orig).contains(chanName)) { secOutChannels.get(orig).add(chanName); channelSecMap.put(chanName, "autoEncrypt_"+secName); /* if (chan.checkAuth && autoStrongAuth) { nonceOutChannels.get(orig).add(chanName); }*/ } } if (hsmTasks.contains(dest.getName().split("__")[1])){ if (!hsmSecInChannels.get(dest).contains(chanName) && portInTask(dest,chanName)) { HSMChannel hsmchan = new HSMChannel(chanName, dest.getName().split("__")[1], HSMChannel.DEC); hsmChannelMap.get(taskHSMMap.get(dest.getName().split("__")[1])).add(hsmchan); hsmSecInChannels.get(dest).add(chanName); /* if (chan.checkAuth && autoStrongAuth) { nonceInChannels.get(dest).add(chanName); hsmchan.nonceName="nonce_" + dest.getName().split("__")[1] + "_" + orig.getName().split("__")[1]; }*/ } } else { if (!secInChannels.get(dest).contains(chanName)) { secInChannels.get(dest).add(chanName); /*if (chan.checkAuth && autoStrongAuth) { nonceInChannels.get(dest).add(chanName); }*/ } } } else if (chan.checkAuth && autoWeakAuth && nonAuth) { toSecure.get(orig).add(dest); /* if (autoStrongAuth) { /* if (chan.getOriginTask().getReferenceObject() instanceof TMLCPrimitiveComponent && chan.getDestinationTask().getReferenceObject() instanceof TMLCPrimitiveComponent){*/ /*if (!toSecureRev.get(dest).contains(orig)){ toSecureRev.get(dest).add(orig); }*/ /*} else { TMLChannel chantmp = oldmodel.getChannelByShortName("__"+chan.getName()); System.out.println("Channel found "+ chantmp); } }*/ if (hsmTasks.contains(orig.getName().split("__")[1])){ channelSecMap.put(chanName, "hsmSec_"+secName); if (!hsmSecOutChannels.get(orig).contains(chanName) && portInTask(orig,chanName)){ HSMChannel hsmchan = new HSMChannel(chanName, orig.getName().split("__")[1], HSMChannel.MAC); hsmChannelMap.get(taskHSMMap.get(orig.getName().split("__")[1])).add(hsmchan); hsmSecOutChannels.get(orig).add(chanName); /*if (autoStrongAuth) { nonceOutChannels.get(orig).add(chanName); hsmchan.nonceName="nonce_" + dest.getName().split("__")[1] + "_" + orig.getName().split("__")[1]; }*/ } } else { if (!macInChannels.get(orig).contains(chanName)) { macOutChannels.get(orig).add(chanName); channelSecMap.put(chanName, "autoEncrypt_"+secName); /* if (autoStrongAuth) { nonceOutChannels.get(orig).add(chanName); }*/ } } if (hsmTasks.contains(dest.getName().split("__")[1])){ if (!hsmSecInChannels.get(dest).contains(chanName) && portInTask(dest,chanName)) { HSMChannel hsmchan = new HSMChannel(chanName, dest.getName().split("__")[1], HSMChannel.DEC); hsmChannelMap.get(taskHSMMap.get(dest.getName().split("__")[1])).add(hsmchan); hsmSecInChannels.get(dest).add(chanName); /*if (chan.checkAuth && autoStrongAuth) { nonceInChannels.get(dest).add(chanName); hsmchan.nonceName="nonce_" + dest.getName().split("__")[1] + "_" + orig.getName().split("__")[1]; }*/ } } else { if (!secInChannels.get(dest).contains(chanName)) { secInChannels.get(dest).add(chanName); /*if (chan.checkAuth && autoStrongAuth) { nonceInChannels.get(dest).add(chanName); }*/ } } } } } } } } } // System.out.println("hsmchannelmap" + hsmChannelMap); TraceManager.addDev("secChannelMap" + channelSecMap); TraceManager.addDev("macoutchans " + macOutChannels); TraceManager.addDev("macinchans " + macInChannels); TraceManager.addDev("nonsecin " + secInChannels); TraceManager.addDev("nonsecout " + secOutChannels); TraceManager.addDev("noncein " + nonceInChannels); TraceManager.addDev("nonceout " + nonceOutChannels); TraceManager.addDev("hsmsecin " + hsmSecInChannels); TraceManager.addDev("hsmsecout " + hsmSecOutChannels); TraceManager.addDev("tosecrev " + toSecureRev); //Add a HSM Task for each selected CPU on the component diagram, add associated channels, etc for (String cpuName : selectedCPUTasks.keySet()) { TMLCPrimitiveComponent hsm = new TMLCPrimitiveComponent(0, tcdp.getMaxY()-200, tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxY(), false, null, tcdp); TAttribute index = new TAttribute(2, "channelIndex", "0", 0); hsm.getAttributeList().add(index); tcdp.addComponent(hsm, 0, 500, false, true); hsm.setValueWithChange("HSM_" + cpuName); //Find all associated components List<TMLCPrimitiveComponent> comps = new ArrayList<TMLCPrimitiveComponent>(); //Find the component to add a HSM to for (TGComponent tg : tcdp.getComponentList()) { if (tg instanceof TMLCPrimitiveComponent) { for (String compName : selectedCPUTasks.get(cpuName)) { if (tg.getValue().equals(compName)) { comps.add((TMLCPrimitiveComponent) tg); break; } } } else if (tg instanceof TMLCCompositeComponent) { TMLCCompositeComponent cc = (TMLCCompositeComponent) tg; List<TMLCPrimitiveComponent> pcomps = cc.getAllPrimitiveComponents(); for (TMLCPrimitiveComponent pc : pcomps) { for (String compName : selectedCPUTasks.get(cpuName)) { if (pc.getValue().equals(compName)) { comps.add(pc); break; } } } } } if (comps.size() == 0) { //System.out.println("No Components found"); continue; } for (TMLCPrimitiveComponent comp : comps) { //Map<String, HSMChannel> compChannels = new HashMap<String, HSMChannel>(); //String compName = comp.getValue(); List<ChannelData> hsmChans = new ArrayList<ChannelData>(); ChannelData chd = new ChannelData("startHSM_" + cpuName, false, false); hsmChans.add(chd); for (HSMChannel hsmChan : hsmChannelMap.get(cpuName)) { if (!hsmChan.task.equals(comp.getValue())){ continue; } if (!channelIndexMap.containsKey(hsmChan.name)){ channelIndexMap.put(hsmChan.name,channelIndex); channelIndex++; } chd = new ChannelData("data_" + hsmChan.name + "_" + hsmChan.task, false, true); hsmChans.add(chd); chd = new ChannelData("retData_" + hsmChan.name + "_" + hsmChan.task, true, true); hsmChans.add(chd); } for (ChannelData hsmChan : hsmChans) { TMLCChannelOutPort originPort = new TMLCChannelOutPort(comp.getX(), comp.getY(), tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxX(), true, hsm, tcdp); TMLCChannelOutPort destPort = new TMLCChannelOutPort(comp.getX(), comp.getY(), tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxX(), true, comp, tcdp); originPort.commName = hsmChan.name; originPort.isOrigin = hsmChan.isOrigin; tcdp.addComponent(originPort, hsm.getX(), hsm.getY(), true, true); destPort.commName = hsmChan.name; if (!hsmChan.isChan) { originPort.typep = 2; destPort.typep = 2; originPort.setParam(0, new TType(1)); destPort.setParam(0, new TType(1)); } destPort.isOrigin = !hsmChan.isOrigin; tcdp.addComponent(destPort, comp.getX(), comp.getY(), true, true); TMLCPortConnector conn = new TMLCPortConnector(0, 0, tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxX(), true, null, tcdp, originPort.getTGConnectingPointAtIndex(0), destPort.getTGConnectingPointAtIndex(0), new Vector<Point>()); tcdp.addComponent(conn, 0, 0, false, true); } } } for (String cpuName : selectedCPUTasks.keySet()) { buildHSMActivityDiagram(cpuName); //Add a private bus to Hardware Accelerator with the task for hsm //Find the CPU the task is mapped to TMLArchiDiagramPanel archPanel = newarch.tmlap; TMLArchiCPUNode cpu = null; String refTask = ""; for (TGComponent tg : archPanel.getComponentList()) { if (tg instanceof TMLArchiCPUNode) { if (tg.getName().equals(cpuName)) { cpu = (TMLArchiCPUNode) tg; TMLArchiArtifact art = cpu.getArtifactList().get(0); refTask = art.getReferenceTaskName(); break; } } } if (cpu == null) { return; } //Add new memory TMLArchiMemoryNode mem = new TMLArchiMemoryNode(cpu.getX(), archPanel.getMaxY()-800, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel); archPanel.addComponent(mem, cpu.getX(), archPanel.getMaxY()-400, false, true); mem.setName("HSMMemory_" + cpuName); //Add Hardware Accelerator TMLArchiHWANode hwa = new TMLArchiHWANode(cpu.getX(), archPanel.getMaxY()-300, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel); archPanel.addComponent(hwa, cpu.getX() + 100, cpu.getY() + 100, false, true); hwa.setName("HSM_" + cpuName); //Add hsm task to hwa TMLArchiArtifact hsmArt = new TMLArchiArtifact(cpu.getX(), archPanel.getMaxY()- 280, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, hwa, archPanel); archPanel.addComponent(hsmArt, cpu.getX() + 100, archPanel.getMaxY()- 280, true, true); hsmArt.setFullName("HSM_" + cpuName, refTask); //Add bus connecting the cpu and HWA TMLArchiBUSNode bus = new TMLArchiBUSNode(cpu.getX() + 50, archPanel.getMaxY() -500, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel); bus.setPrivacy(1); bus.setName("HSMBus_" + cpuName); archPanel.addComponent(bus, cpu.getX() + 200, cpu.getY() + 200, false, true); //Connect Bus and CPU TMLArchiConnectorNode connect = new TMLArchiConnectorNode(cpu.getX() + 100, archPanel.getMaxY() -300, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel, null, null, new Vector<Point>()); TGConnectingPoint p1 = bus.findFirstFreeTGConnectingPoint(true, true); p1.setFree(false); connect.setP2(p1); TGConnectingPoint p2 = cpu.findFirstFreeTGConnectingPoint(true, true); p2.setFree(false); connect.setP1(p2); archPanel.addComponent(connect, cpu.getX() + 100, cpu.getY() + 100, false, true); //Connect Bus and HWA connect = new TMLArchiConnectorNode(cpu.getX() + 100, cpu.getY() + 100, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel, null, null, new Vector<Point>()); p1 = bus.findFirstFreeTGConnectingPoint(true, true); p1.setFree(false); connect.setP2(p1); p2 = hwa.findFirstFreeTGConnectingPoint(true, true); p2.setFree(false); connect.setP1(p2); archPanel.addComponent(connect, cpu.getX() + 100, cpu.getY() + 100, false, true); //Connect Bus and Memory connect = new TMLArchiConnectorNode(cpu.getX() + 100, cpu.getY() + 100, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel, null, null, new Vector<Point>()); p1 = bus.findFirstFreeTGConnectingPoint(true, true); p1.setFree(false); connect.setP2(p1); p2 = mem.findFirstFreeTGConnectingPoint(true, true); p2.setFree(false); connect.setP1(p2); archPanel.addComponent(connect, cpu.getX() + 100, cpu.getY() + 100, false, true); } // // int num=0; //int nonceNum=0; //Create reverse channels on component diagram to send nonces if they don't already exist for (TMLTask task : toSecureRev.keySet()) { // TraceManager.addDev("Adding nonces to " + task.getName()); List<TMLChannel> chans = tmlmodel.getChannelsFromMe(task); for (TMLTask task2 : toSecureRev.get(task)) { boolean addChan = true; for (TMLChannel chan : chans) { if (chan.getDestinationTask() == task2) { addChan = false; } } if (addChan) { TMLCChannelOutPort originPort = new TMLCChannelOutPort(0, 0, tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxX(), true, null, tcdp); TMLCChannelOutPort destPort = new TMLCChannelOutPort(0, 0, tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxX(), true, null, tcdp); if (task.getReferenceObject() instanceof TMLCPrimitiveComponent){ TGComponent tg = (TGComponent) task.getReferenceObject(); originPort = new TMLCChannelOutPort(tg.getX(), tg.getY(), tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxX(), true, tg, tcdp); originPort.commName = "nonceCh" + task.getName().split("__")[1] + "_" + task2.getName().split("__")[1]; tcdp.addComponent(originPort, tg.getX(), tg.getY(), true, true); } if (task2.getReferenceObject() instanceof TMLCPrimitiveComponent){ TGComponent tg = (TGComponent) task2.getReferenceObject(); destPort = new TMLCChannelOutPort(tg.getX(), tg.getY(), tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxX(), true, tg, tcdp); destPort.isOrigin = false; destPort.commName = "nonceCh" + task.getName().split("__")[1] + "_" + task2.getName().split("__")[1]; tcdp.addComponent(destPort, tg.getX(), tg.getY(), true, true); } tmlmodel.addChannel(new TMLChannel("nonceCh" + task.getName().split("__")[1] + "_" + task2.getName().split("__")[1], originPort)); //Add connection TMLCPortConnector conn = new TMLCPortConnector(0, 0, tcdp.getMinX(), tcdp.getMaxX(), tcdp.getMinY(), tcdp.getMaxX(), true, null, tcdp, originPort.getTGConnectingPointAtIndex(0), destPort.getTGConnectingPointAtIndex(0), new Vector<Point>()); tcdp.addComponent(conn, 0, 0, false, true); } } } // } //Add encryption/nonces to activity diagram for (TMLTask task : toSecure.keySet()) { TraceManager.addDev("Securing task " + task.getName()); TMLActivityDiagramPanel tad = tmlcdp.getTMLActivityDiagramPanel(task.getName()); if (tad==null){ continue; } //Get start state position, shift everything down int xpos = 0; int ypos = 0; TGConnector fromStart = new TGConnectorTMLAD(0, 0, 0, 0, 0, 0, false, null, tad, null, null, new Vector<Point>()); TGConnectingPoint point = new TGConnectingPoint(null, 0, 0, false, false); //Find states immediately before the write channel operator //For each occurence of a write channel operator, add encryption/nonces before it for (String channel : secOutChannels.get(task)) { Set<TGComponent> channelInstances = new HashSet<TGComponent>(); int yShift = 50; TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + channel); if (tmlc==null){ //Find by origin port instead tmlc = tmlmodel.getChannelByOriginPortName(channel); } if (tmlc==null){ continue; } //First, find the connector that points to it. We will add the encryption, nonce operators directly before the write channel operator for (TGComponent tg : tad.getComponentList()) { if (tg instanceof TMLADWriteChannel) { TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg; if (writeChannel.getChannelName().equals(channel) && writeChannel.getSecurityContext().equals("")) { if (fromStart != null) { channelInstances.add(tg); } } } } for (TGComponent comp : channelInstances) { yShift=50; //TMLADWriteChannel writeChannel = (TMLADWriteChannel) comp; xpos = comp.getX(); ypos = comp.getY(); fromStart = tad.findTGConnectorEndingAt(comp.getTGConnectingPointAtIndex(0)); point = fromStart.getTGConnectingPointP2(); //Add encryption operator TMLADEncrypt enc = new TMLADEncrypt(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); TMLADReadChannel rd = new TMLADReadChannel(0, 0, 0, 0, 0, 0, false, null, tad); if (nonceOutChannels.get(task).contains(channel)) { //Receive any nonces if ensuring authenticity rd = new TMLADReadChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); //System.out.println("tmlc " + tmlc); // System.out.println("Checking "+ tmlc.getDestinationTask() + " " + tmlc.getOriginTask()); List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask()); if (matches.size() > 0) { rd.setChannelName(matches.get(0).getName().replaceAll(title + "__", "")); } else { rd.setChannelName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); } rd.setSecurityContext("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); tad.addComponent(rd, xpos, ypos + yShift, false, true); fromStart.setP2(rd.getTGConnectingPointAtIndex(0)); fromStart = new TGConnectorTMLAD(enc.getX(), enc.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); tad.addComponent(fromStart, xpos, ypos, false, true); fromStart.setP1(rd.getTGConnectingPointAtIndex(1)); yShift += 60; //Move encryption operator after receive nonce component enc.setCd(xpos, ypos + yShift); if (tmlc != null) { enc.nonce = "nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]; } } enc.securityContext = channelSecMap.get(channel); enc.type = "Symmetric Encryption"; enc.message_overhead = overhead; enc.encTime = encComp; enc.decTime = decComp; tad.addComponent(enc, xpos, ypos + yShift, false, true); yShift += 60; fromStart.setP2(enc.getTGConnectingPointAtIndex(0)); fromStart = new TGConnectorTMLAD(enc.getX(), enc.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); tad.addComponent(fromStart, xpos, ypos, false, true); fromStart.setP1(enc.getTGConnectingPointAtIndex(1)); //Direct the last TGConnector back to the start of the write channel operator fromStart.setP2(point); //Shift components down to make room for the added ones, and add security contexts to write channels for (TGComponent tg : tad.getComponentList()) { if (tg instanceof TMLADWriteChannel) { TMLADWriteChannel wChannel = (TMLADWriteChannel) tg; if (channel.equals(wChannel.getChannelName()) && wChannel.getSecurityContext().equals("")) { wChannel.setSecurityContext(channelSecMap.get(channel)); wChannel.setEncForm(true); } } if (tg.getY() >= ypos && tg != enc && tg != rd) { tg.setCd(tg.getX(), tg.getY() + yShift); } } tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift); tad.repaint(); } } for (String channel : macOutChannels.get(task)) { //Add MAC before writechannel int yShift = 50; TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + channel); //First, find the connector that points to it. We will add the encryption, nonce operators directly before the write channel operator if (tmlc ==null){ tmlc = tmlmodel.getChannelByOriginPortName(channel); } if (tmlc ==null){ continue; } Set<TGComponent> channelInstances = new HashSet<TGComponent>(); for (TGComponent tg : tad.getComponentList()) { if (tg instanceof TMLADWriteChannel) { TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg; if (writeChannel.getChannelName().equals(channel) && writeChannel.getSecurityContext().equals("")) { xpos = tg.getX(); ypos = tg.getY(); fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0)); if (fromStart != null) { channelInstances.add(tg); } } } } for (TGComponent comp : channelInstances) { yShift=50; //TMLADWriteChannel writeChannel = (TMLADWriteChannel) comp; xpos = comp.getX(); ypos = comp.getY(); fromStart = tad.findTGConnectorEndingAt(comp.getTGConnectingPointAtIndex(0)); point = fromStart.getTGConnectingPointP2(); TMLADEncrypt enc = new TMLADEncrypt(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); //If we need to receive a nonce TMLADReadChannel rd = new TMLADReadChannel(0, 0, 0, 0, 0, 0, false, null, tad); if (nonceOutChannels.get(task).contains(channel)) { //Receive any nonces if ensuring authenticity rd = new TMLADReadChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask()); if (matches.size() > 0) { rd.setChannelName(matches.get(0).getName().replaceAll(title + "__", "")); } else { rd.setChannelName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); } rd.setSecurityContext("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); tad.addComponent(rd, xpos, ypos + yShift, false, true); fromStart.setP2(rd.getTGConnectingPointAtIndex(0)); fromStart = new TGConnectorTMLAD(enc.getX(), enc.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); tad.addComponent(fromStart, xpos, ypos, false, true); fromStart.setP1(rd.getTGConnectingPointAtIndex(1)); yShift += 60; //Move encryption operator after receive nonce component enc.setCd(xpos, ypos + yShift); if (tmlc != null) { enc.nonce = "nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]; } } //Add encryption operator enc.securityContext = channelSecMap.get(channel); enc.type = "MAC"; enc.message_overhead = overhead; enc.encTime = encComp; enc.decTime = decComp; enc.size = overhead; tad.addComponent(enc, xpos, ypos + yShift, false, true); yShift += 60; fromStart.setP2(enc.getTGConnectingPointAtIndex(0)); fromStart = new TGConnectorTMLAD(enc.getX(), enc.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); tad.addComponent(fromStart, xpos, ypos, false, true); fromStart.setP1(enc.getTGConnectingPointAtIndex(1)); //Direct the last TGConnector back to the start of the write channel operator fromStart.setP2(point); //Shift components down to make room for the added ones, and add security contexts to write channels for (TGComponent tg : tad.getComponentList()) { if (tg instanceof TMLADWriteChannel) { TMLADWriteChannel wChannel = (TMLADWriteChannel) tg; if (channel.equals(wChannel.getChannelName()) && wChannel.getSecurityContext().equals("")) { wChannel.setSecurityContext(channelSecMap.get(channel)); wChannel.setEncForm(true); tad.repaint(); } } if (tg.getY() >= ypos && tg != enc && tg != rd) { tg.setCd(tg.getX(), tg.getY() + yShift); } } tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift); } } for (String channel: hsmSecOutChannels.get(task)){ Set<TGComponent> channelInstances = new HashSet<TGComponent>(); //TGConnector conn = new TGConnectorTMLAD(0, 0, 0, 0, 0, 0, false, null, tad, null, null, new Vector<Point>()); //TGConnectingPoint next = new TGConnectingPoint(null, 0, 0, false, false); for (TGComponent tg : tad.getComponentList()) { if (tg instanceof TMLADWriteChannel) { TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg; if (writeChannel.getChannelName().equals(channel) && writeChannel.getSecurityContext().equals("")) { fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0)); if (fromStart != null) { channelInstances.add(tg); } } } } for (TGComponent chan : channelInstances) { TMLADWriteChannel writeChannel = (TMLADWriteChannel) chan; String chanName = writeChannel.getChannelName(); TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + chanName); if (tmlc ==null){ tmlc = tmlmodel.getChannelByOriginPortName(channel); } if (tmlc ==null){ continue; } writeChannel.setSecurityContext(channelSecMap.get(chanName)); writeChannel.setEncForm(true); xpos = chan.getX(); ypos = chan.getY(); fromStart = tad.findTGConnectorEndingAt(chan.getTGConnectingPointAtIndex(0)); point = fromStart.getTGConnectingPointP2(); int yShift = 50; TMLADSendRequest req = new TMLADSendRequest(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); req.setRequestName("startHSM_" + taskHSMMap.get(task.getName().split("__")[1])); req.setParam(0, Integer.toString(channelIndexMap.get(chanName))); req.makeValue(); tad.addComponent(req, xpos, ypos + yShift, false, true); fromStart.setP2(req.getTGConnectingPointAtIndex(0)); //tad.addComponent(fromStart, xpos, ypos, false, true); //Add connection fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(req.getTGConnectingPointAtIndex(1)); TMLADWriteChannel wr = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); yShift += 50; //Add write channel operator wr = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); wr.setChannelName("data_" + chanName + "_" + task.getName().split("__")[1]); wr.setEncForm(false); wr.setSecurityContext(channelSecMap.get(chanName)); tad.addComponent(wr, xpos, ypos + yShift, false, true); fromStart.setP2(wr.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, xpos, ypos, false, true); fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); tad.addComponent(fromStart, xpos, ypos, false, true); fromStart.setP1(wr.getTGConnectingPointAtIndex(1)); TMLADReadChannel rd = new TMLADReadChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); TMLADWriteChannel wr2 = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); //Receive any nonces if ensuring authenticity if (nonceOutChannels.get(task).contains(channel)) { //Read nonce from rec task yShift+=50; List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask()); rd = new TMLADReadChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); if (matches.size() > 0) { rd.setChannelName(matches.get(0).getName().replaceAll(title + "__", "")); } else { rd.setChannelName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); } rd.setSecurityContext("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); tad.addComponent(rd, xpos, ypos + yShift, false, true); fromStart.setP2(rd.getTGConnectingPointAtIndex(0)); fromStart = new TGConnectorTMLAD(rd.getX(), rd.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); tad.addComponent(fromStart, xpos, ypos, false, true); fromStart.setP1(rd.getTGConnectingPointAtIndex(1)); //Also send nonce to hsm yShift+=50; wr2 = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); wr2.setChannelName("data_" + chanName + "_" + task.getName().split("__")[1]); wr2.setSecurityContext(channelSecMap.get(chanName)); tad.addComponent(wr2, xpos, ypos + yShift, false, true); TGConnectorTMLAD tmp = new TGConnectorTMLAD(wr2.getX(), wr2.getY() + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, rd.getTGConnectingPointAtIndex(1), wr2.getTGConnectingPointAtIndex(0), new Vector<Point>()); tad.addComponent(tmp, xpos, ypos, false, true); fromStart.setP2(wr2.getTGConnectingPointAtIndex(0)); fromStart = new TGConnectorTMLAD(rd.getX(), rd.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); tad.addComponent(fromStart, xpos, ypos, false, true); fromStart.setP1(wr2.getTGConnectingPointAtIndex(1)); yShift += 60; } //Read channel operator to receive hsm data yShift += 60; TMLADReadChannel rd2 = new TMLADReadChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); rd2.setChannelName("retData_" + chanName + "_" + task.getName().split("__")[1]); rd2.setSecurityContext(channelSecMap.get(chanName)); tad.addComponent(rd2, xpos, ypos + yShift, false, true); fromStart.setP2(rd2.getTGConnectingPointAtIndex(0)); yShift += 50; //Add connector fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); tad.addComponent(fromStart, xpos, ypos, false, true); fromStart.setP1(rd2.getTGConnectingPointAtIndex(1)); yShift += 50; //Direct the last TGConnector back to the start of the write channel operator fromStart.setP2(point); //Shift components down to make room for the added ones, and add security contexts to write channels for (TGComponent tg : tad.getComponentList()) { if (tg.getY() >= ypos && tg != wr && tg != req && tg != rd && tg!=wr2 && tg!=rd2) { tg.setCd(tg.getX(), tg.getY() + yShift); } } tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift); tad.repaint(); } } for (String channel: hsmSecInChannels.get(task)){ //System.out.println("Checking hsmsecinchannel " + channel + " " + task.getName()); Set<TGComponent> channelInstances = new HashSet<TGComponent>(); //TGConnector conn = new TGConnectorTMLAD(0, 0, 0, 0, 0, 0, false, null, tad, null, null, new Vector<Point>()); //TGConnectingPoint next = new TGConnectingPoint(null, 0, 0, false, false); for (TGComponent tg : tad.getComponentList()) { if (tg instanceof TMLADReadChannel) { TMLADReadChannel readChannel = (TMLADReadChannel) tg; if (readChannel.getChannelName().equals(channel) && readChannel.getSecurityContext().equals("")) { fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0)); if (fromStart != null) { channelInstances.add(tg); } } } } //System.out.println("matches " + channelInstances); for (TGComponent chan : channelInstances) { TMLADReadChannel readChannel = (TMLADReadChannel) chan; String chanName = readChannel.getChannelName(); TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + chanName); if (tmlc ==null){ tmlc = tmlmodel.getChannelByDestinationPortName(channel); } if (tmlc ==null){ continue; } readChannel.setSecurityContext(channelSecMap.get(chanName)); readChannel.setEncForm(true); xpos = chan.getX()+1; ypos = chan.getY()+1; fromStart = tad.findTGConnectorStartingAt(chan.getTGConnectingPointAtIndex(1)); point = fromStart.getTGConnectingPointP2(); int yShift = 50; TMLADSendRequest req = new TMLADSendRequest(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); req.setRequestName("startHSM_" + taskHSMMap.get(task.getName().split("__")[1])); req.setParam(0, Integer.toString(channelIndexMap.get(chanName))); req.makeValue(); tad.addComponent(req, xpos, ypos + yShift, false, true); fromStart.setP2(req.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, xpos, ypos, false, true); //Add connection fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(req.getTGConnectingPointAtIndex(1)); TMLADWriteChannel wr = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); yShift += 50; //Add write channel operator wr = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); wr.setChannelName("data_" + chanName + "_" + task.getName().split("__")[1]); wr.setSecurityContext(channelSecMap.get(chanName)); wr.makeValue(); tad.addComponent(wr, xpos, ypos + yShift, false, true); //Add connector between request and write fromStart.setP2(wr.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, xpos, ypos, false, true); //Add connector between write and ??? fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); tad.addComponent(fromStart, xpos, ypos, false, true); fromStart.setP1(wr.getTGConnectingPointAtIndex(1)); //If needed, forge nonce, send it to receiving task TMLADEncrypt nonce = new TMLADEncrypt(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); TMLADWriteChannel wr3 = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); TMLADWriteChannel wr2 = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); if (nonceInChannels.get(task).contains(channel)) { //Create a nonce operator and a write channel operator yShift+=60; nonce = new TMLADEncrypt(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); nonce.securityContext = "nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]; nonce.type = "Nonce"; nonce.message_overhead = overhead; nonce.encTime = encComp; nonce.decTime = decComp; tad.addComponent(nonce, xpos, ypos + yShift, false, true); fromStart.setP2(nonce.getTGConnectingPointAtIndex(0)); yShift += 50; wr3 = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); //Send nonce along channel, the newly created nonce channel or an existing channel with the matching sender and receiver //Find matching channels List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask()); if (matches.size() > 0) { wr3.setChannelName(matches.get(0).getName().replaceAll(title + "__", "")); } else { wr3.setChannelName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); } //send the nonce along the channel wr3.setSecurityContext("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); tad.addComponent(wr3, xpos, ypos + yShift, false, true); wr3.makeValue(); TGConnector tmp = new TGConnectorTMLAD(wr3.getX(), wr3.getY() + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, nonce.getTGConnectingPointAtIndex(1), wr3.getTGConnectingPointAtIndex(0), new Vector<Point>()); tad.addComponent(tmp, xpos, ypos, false, true); //Also send nonce to hsm yShift+=50; wr2 = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); wr2.setChannelName("data_" + chanName + "_" + task.getName().split("__")[1]); wr2.setSecurityContext("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); tad.addComponent(wr2, xpos, ypos + yShift, false, true); tmp = new TGConnectorTMLAD(wr2.getX(), wr2.getY() + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, wr3.getTGConnectingPointAtIndex(1), wr2.getTGConnectingPointAtIndex(0), new Vector<Point>()); tad.addComponent(tmp, xpos, ypos, false, true); fromStart = new TGConnectorTMLAD(wr2.getX(), wr.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, wr2.getTGConnectingPointAtIndex(1), null, new Vector<Point>()); tad.addComponent(fromStart, xpos, ypos, false, true); //Connect created write channel operator to start of read channel operator fromStart.setP1(wr2.getTGConnectingPointAtIndex(1)); fromStart.setP2(point); /* //Shift everything from the read channel on down for (TGComponent tg : tad.getComponentList()) { if (tg.getY() >= ypos && tg != nonce && tg != wr2 && tg!=wr3) { tg.setCd(tg.getX(), tg.getY() + yShift); } }*/ } //Add read channel operator yShift += 60; TMLADReadChannel rd = new TMLADReadChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); rd.setChannelName("retData_" + chanName + "_" + task.getName().split("__")[1]); rd.setSecurityContext(channelSecMap.get(chanName)); rd.setEncForm(false); tad.addComponent(rd, xpos, ypos + yShift, false, true); fromStart.setP2(rd.getTGConnectingPointAtIndex(0)); yShift += 50; //Add connector fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); tad.addComponent(fromStart, xpos, ypos, false, true); fromStart.setP1(rd.getTGConnectingPointAtIndex(1)); yShift += 50; //Direct the last TGConnector back to the start of the operator after the read channel fromStart.setP2(point); //Shift components down to make room for the added ones, and add security contexts to write channels for (TGComponent tg : tad.getComponentList()) { if (tg.getY() >= ypos && tg != wr && tg != req && tg != rd && tg!=wr2 && tg!=nonce && tg!=wr3) { tg.setCd(tg.getX(), tg.getY() + yShift); } } tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift); tad.repaint(); } } for (String channel : macInChannels.get(task)) { //Add decryptmac after readchannel int yShift = 50; Set<TGComponent> channelInstances = new HashSet<TGComponent>(); TGConnector conn = new TGConnectorTMLAD(0, 0, 0, 0, 0, 0, false, null, tad, null, null, new Vector<Point>()); TGConnectingPoint next = new TGConnectingPoint(null, 0, 0, false, false); //Find read channel operator TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + channel); if (tmlc ==null){ tmlc = tmlmodel.getChannelByDestinationPortName(channel); } if (tmlc ==null){ continue; } for (TGComponent tg : tad.getComponentList()) { if (tg instanceof TMLADReadChannel) { TMLADReadChannel readChannel = (TMLADReadChannel) tg; if (readChannel.getChannelName().equals(channel) && readChannel.getSecurityContext().equals("")) { fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0)); if (fromStart != null) { channelInstances.add(tg); } } } } for (TGComponent comp : channelInstances) { yShift=50; fromStart = tad.findTGConnectorEndingAt(comp.getTGConnectingPointAtIndex(0)); point = fromStart.getTGConnectingPointP2(); conn = tad.findTGConnectorStartingAt(comp.getTGConnectingPointAtIndex(1)); next = conn.getTGConnectingPointP2(); xpos = fromStart.getX(); ypos = fromStart.getY(); TMLADReadChannel readChannel = (TMLADReadChannel) comp; readChannel.setSecurityContext(channelSecMap.get(readChannel.getChannelName())); tad.repaint(); TMLADWriteChannel wr = new TMLADWriteChannel(0, 0, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); //Create nonce and send it if (nonceInChannels.get(task).contains(channel)) { //Create a nonce operator and a write channel operator TMLADEncrypt nonce = new TMLADEncrypt(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); nonce.securityContext = "nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]; nonce.type = "Nonce"; nonce.message_overhead = overhead; nonce.encTime = encComp; nonce.decTime = decComp; tad.addComponent(nonce, xpos, ypos + yShift, false, true); fromStart.setP2(nonce.getTGConnectingPointAtIndex(0)); yShift += 50; wr = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); //Send nonce along channel, the newly created nonce channel or an existing channel with the matching sender and receiver //Find matching channels List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask()); if (matches.size() > 0) { wr.setChannelName(matches.get(0).getName().replaceAll(title + "__", "")); } else { wr.setChannelName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); } //send the nonce along the channel wr.setSecurityContext("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); tad.addComponent(wr, xpos, ypos + yShift, false, true); wr.makeValue(); TGConnector tmp = new TGConnectorTMLAD(wr.getX(), wr.getY() + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, nonce.getTGConnectingPointAtIndex(1), wr.getTGConnectingPointAtIndex(0), new Vector<Point>()); tad.addComponent(tmp, xpos, ypos, false, true); fromStart = new TGConnectorTMLAD(wr.getX(), wr.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, wr.getTGConnectingPointAtIndex(1), null, new Vector<Point>()); tad.addComponent(fromStart, xpos, ypos, false, true); //Connect created write channel operator to start of read channel operator fromStart.setP1(wr.getTGConnectingPointAtIndex(1)); fromStart.setP2(point); yShift+=40; //Shift everything from the read channel on down for (TGComponent tg : tad.getComponentList()) { if ((tg.getY() >= ypos && tg != nonce && tg != wr) || tg == readChannel) { tg.setCd(tg.getX(), tg.getY() + yShift); } } } //Add decryption operator if it does not already exist xpos = conn.getX(); ypos = conn.getY(); TMLADDecrypt dec = new TMLADDecrypt(xpos + 10, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); dec.securityContext = channelSecMap.get(readChannel.getChannelName()); tad.addComponent(dec, dec.getX(), dec.getY(), false, true); conn.setP2(dec.getTGConnectingPointAtIndex(0)); yShift += 60; conn = new TGConnectorTMLAD(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, dec.getTGConnectingPointAtIndex(1), next, new Vector<Point>()); conn.setP1(dec.getTGConnectingPointAtIndex(1)); conn.setP2(next); tad.addComponent(conn, conn.getX(), conn.getY(), false, true); //Shift everything down for (TGComponent tg : tad.getComponentList()) { if (tg instanceof TMLADReadChannel) { readChannel = (TMLADReadChannel) tg; if (channel.equals(readChannel.getChannelName()) && readChannel.getSecurityContext().equals("")) { readChannel.setSecurityContext(channelSecMap.get(readChannel.getChannelName())); readChannel.setEncForm(true); } } if (tg.getY() >= ypos && tg != dec && tg != comp) { tg.setCd(tg.getX(), tg.getY() + yShift); } } tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift); tad.repaint(); } } for (String channel : secInChannels.get(task)) { TraceManager.addDev("securing channel " + channel); int yShift = 20; // String title = task.getName().split("__")[0]; TGConnector conn = new TGConnectorTMLAD(0, 0, 0, 0, 0, 0, false, null, tad, null, null, new Vector<Point>()); TGConnectingPoint next = new TGConnectingPoint(null, 0, 0, false, false); //Find read channel operator TMLChannel tmlc = tmlmodel.getChannelByName(title + "__" + channel); if (tmlc ==null){ tmlc = tmlmodel.getChannelByDestinationPortName(channel); } if (tmlc ==null){ continue; } TMLADReadChannel readChannel = new TMLADReadChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); HashSet<TGComponent> channelInstances = new HashSet<TGComponent>(); for (TGComponent tg : tad.getComponentList()) { if (tg instanceof TMLADReadChannel) { readChannel = (TMLADReadChannel) tg; if (readChannel.getChannelName().equals(channel) && readChannel.getSecurityContext().equals("")) { fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0)); if (fromStart != null) { channelInstances.add(tg); } } } } for (TGComponent comp : channelInstances) { yShift=30; readChannel = (TMLADReadChannel) comp; fromStart = tad.findTGConnectorEndingAt(comp.getTGConnectingPointAtIndex(0)); point = fromStart.getTGConnectingPointP2(); conn = tad.findTGConnectorStartingAt(comp.getTGConnectingPointAtIndex(1)); next = conn.getTGConnectingPointP2(); xpos = comp.getX(); ypos = comp.getY(); TMLADWriteChannel wr = new TMLADWriteChannel(0, 0, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); TMLADEncrypt nonce = new TMLADEncrypt(0, 0, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); if (nonceInChannels.get(task).contains(channel)) { //Create a nonce operator and a write channel operator nonce = new TMLADEncrypt(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); nonce.securityContext = "nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]; nonce.type = "Nonce"; nonce.message_overhead = overhead; nonce.encTime = encComp; nonce.decTime = decComp; tad.addComponent(nonce, xpos, ypos + yShift, false, true); fromStart.setP2(nonce.getTGConnectingPointAtIndex(0)); yShift += 50; wr = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); //Send nonce along channel, the newly created nonce channel or an existing channel with the matching sender and receiver //Find matching channels List<TMLChannel> matches = tmlmodel.getChannels(tmlc.getDestinationTask(), tmlc.getOriginTask()); if (matches.size() > 0) { wr.setChannelName(matches.get(0).getName().replaceAll(title + "__", "")); } else { wr.setChannelName("nonceCh" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); } yShift+=40; //send the nonce along the channel wr.setSecurityContext("nonce_" + tmlc.getDestinationTask().getName().split("__")[1] + "_" + tmlc.getOriginTask().getName().split("__")[1]); tad.addComponent(wr, xpos, ypos + yShift, false, true); wr.makeValue(); TGConnector tmp = new TGConnectorTMLAD(wr.getX(), wr.getY() + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, nonce.getTGConnectingPointAtIndex(1), wr.getTGConnectingPointAtIndex(0), new Vector<Point>()); tad.addComponent(tmp, xpos, ypos, false, true); fromStart = new TGConnectorTMLAD(wr.getX(), wr.getY(), tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, wr.getTGConnectingPointAtIndex(1), null, new Vector<Point>()); tad.addComponent(fromStart, xpos, ypos, false, true); //Connect created write channel operator to start of read channel operator fromStart.setP1(wr.getTGConnectingPointAtIndex(1)); fromStart.setP2(point); //Shift everything from the read channel on down for (TGComponent tg : tad.getComponentList()) { if ((tg.getY() >= ypos && tg != nonce && tg != wr)) { tg.setCd(tg.getX(), tg.getY() + yShift); } } } //tad.repaint(); //Now add the decrypt operator yShift += 40; readChannel.setSecurityContext(channelSecMap.get(readChannel.getChannelName())); readChannel.setEncForm(true); tad.repaint(); //Add decryption operator if it does not already exist xpos = readChannel.getX(); ypos = readChannel.getY(); TMLADDecrypt dec = new TMLADDecrypt(xpos + 10, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); dec.securityContext = channelSecMap.get(readChannel.getChannelName()); tad.addComponent(dec, dec.getX(), dec.getY(), false, true); conn.setP2(dec.getTGConnectingPointAtIndex(0)); yShift += 60; conn = new TGConnectorTMLAD(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, dec.getTGConnectingPointAtIndex(1), next, new Vector<Point>()); conn.setP1(dec.getTGConnectingPointAtIndex(1)); conn.setP2(next); tad.addComponent(conn, conn.getX(), conn.getY(), false, true); //Shift everything down for (TGComponent tg : tad.getComponentList()) { if (tg instanceof TMLADReadChannel) { readChannel = (TMLADReadChannel) tg; if (channel.equals(readChannel.getChannelName()) && readChannel.getSecurityContext().equals("")) { readChannel.setSecurityContext( channelSecMap.get(readChannel.getChannelName())); readChannel.setEncForm(true); } } if (tg.getY() >= ypos && tg != dec && tg!= wr && tg != nonce && tg!= comp) { tg.setCd(tg.getX(), tg.getY() + yShift); } } tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift); tad.repaint(); } } } // GTMLModeling gtm = new GTMLModeling(newarch, false); // map = gtm.translateToTMLMapping(); //if (gtm.getCheckingErrors().size() > 0){ //System.out.println("@$()(#"); //map= null; // } /*for (TMLTask task : newmodel.getTasks()) { task.setName(tabName + "_" + name + "__" + task.getName()); } for (TMLTask task : tmlmodel.getTasks()) { HwExecutionNode node = (HwExecutionNode) map.getHwNodeOf(task); if (newmodel.getTMLTaskByName(task.getName().replace(tabName, tabName + "_" + name)) != null) { map.addTaskToHwExecutionNode(newmodel.getTMLTaskByName(task.getName().replace(tabName, tabName + "_" + name)), node); map.removeTask(task); } else { } }*/ //map.setTMLModeling(newmodel); // map.setTMLModeling(newmodel); return; } public void buildHSMActivityDiagram(String cpuName){ int xpos = 0; int ypos = 0; TGConnector fromStart; //Build HSM Activity diagram TMLActivityDiagramPanel tad = tmlcdp.getTMLActivityDiagramPanel("HSM_" + cpuName); if (tad ==null){ System.out.println("Missing task "); return; } TMLADStartState start = (TMLADStartState) tad.getComponentList().get(0); fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); if (hsmChannelMap.get(cpuName).size() ==0){ TMLADStopState stop = new TMLADStopState(100, 100, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); tad.addComponent(stop, 100, 100, false, true); //Connect stop and start fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(start.getTGConnectingPointAtIndex(0)); fromStart.setP2(stop.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 100, 100, false, true); return; } TMLADReadRequestArg req = new TMLADReadRequestArg(300, 100, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); tad.addComponent(req, 300, 100, false, true); req.setParam(0, "channelIndex"); req.makeValue(); //Connect start and readrequest fromStart.setP1(start.getTGConnectingPointAtIndex(0)); fromStart.setP2(req.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); TMLADChoice choice = new TMLADChoice(300, 200, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); tad.addComponent(choice, 300, 200, false, true); //Connect readrequest and choice fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(req.getTGConnectingPointAtIndex(1)); fromStart.setP2(choice.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); int xc = 150; //Allows 9 channels max to simplify the diagram //If more than 3 channels, build 2 levels of choices if (hsmChannelMap.get(cpuName).size() > 3) { TMLADChoice choice2 = new TMLADChoice(xc, 400, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); int i = 0; for (HSMChannel ch : hsmChannelMap.get(cpuName)) { if (i>8){ break; } if (i % 3 == 0) { //Add a new choice every third channel choice2 = new TMLADChoice(xc, 250, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); tad.addComponent(choice2, xc, 400, false, true); //Connect new choice operator to top choice fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(choice.getTGConnectingPointAtIndex(i / 3 + 1)); fromStart.setP2(choice2.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); } TMLADReadChannel rd = new TMLADReadChannel(xc, 300, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); rd.setChannelName("data_" + ch.name + "_" + ch.task); rd.setSecurityContext(channelSecMap.get(ch.name)); tad.addComponent(rd, xc, 300, false, true); //Connect choice and readchannel fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(choice2.getTGConnectingPointAtIndex(i % 3 + 1)); fromStart.setP2(rd.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); TMLADWriteChannel wr = new TMLADWriteChannel(xc, 600, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); wr.setChannelName("retData_" + ch.name + "_" + ch.task); tad.addComponent(wr, xc, 600, false, true); wr.setSecurityContext(channelSecMap.get(ch.name)); if (ch.secType == HSMChannel.DEC) { TMLADDecrypt dec = new TMLADDecrypt(xc, 500, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); dec.securityContext = channelSecMap.get(ch.name); tad.addComponent(dec, xc, 500, false, true); fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(rd.getTGConnectingPointAtIndex(1)); fromStart.setP2(dec.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(rd.getTGConnectingPointAtIndex(1)); fromStart.setP2(dec.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); //Connect encrypt and writechannel fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(dec.getTGConnectingPointAtIndex(1)); fromStart.setP2(wr.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); } else { TMLADEncrypt enc = new TMLADEncrypt(xc, 500, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); enc.securityContext = channelSecMap.get(ch.name); if (ch.secType == HSMChannel.SENC) { enc.type = "Symmetric Encryption"; } else if (ch.secType == HSMChannel.AENC) { enc.type = "Asymmetric Encryption"; } else if (ch.secType == HSMChannel.MAC) { enc.type = "MAC"; } else if (ch.secType == HSMChannel.NONCE) { enc.type = "Nonce"; } enc.message_overhead = overhead; enc.encTime = encComp; enc.decTime = decComp; enc.nonce = ch.nonceName; tad.addComponent(enc, xc, 500, false, true); //Connect encrypt and readchannel fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(rd.getTGConnectingPointAtIndex(1)); fromStart.setP2(enc.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); //Connect encrypt and writechannel fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(enc.getTGConnectingPointAtIndex(1)); fromStart.setP2(wr.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); //Add Stop TMLADStopState stop = new TMLADStopState(xc, 600, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); tad.addComponent(stop, xc, 700, false, true); //Connext stop and write channel fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(wr.getTGConnectingPointAtIndex(1)); fromStart.setP2(stop.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); } xc += 300; i++; } } else { int i = 1; for (HSMChannel ch : hsmChannelMap.get(cpuName)) { //Add guard as channelindex choice.setGuard("[channelIndex=="+channelIndexMap.get(ch.name)+"]",i-1); TMLADReadChannel rd = new TMLADReadChannel(xc, 300, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); rd.setChannelName("data_" + ch.name + "_" + ch.task); rd.setSecurityContext(channelSecMap.get(ch.name)); tad.addComponent(rd, xc, 300, false, true); //Recieve plaintext data if encrypting if (ch.secType != HSMChannel.DEC) { rd.setEncForm(false); } //Connect choice and readchannel fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(choice.getTGConnectingPointAtIndex(i)); fromStart.setP2(rd.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, xc, 300, false, true); fromStart = new TGConnectorTMLAD(xc, 350, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(rd.getTGConnectingPointAtIndex(1)); //If needed, receive nonce from task if (!ch.nonceName.equals("")){ tad.addComponent(fromStart, 300, 200, false, true); rd = new TMLADReadChannel(xc, 350, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); rd.setChannelName("data_" + ch.name + "_" + ch.task); rd.setSecurityContext(ch.nonceName); tad.addComponent(rd, xc, 350, false, true); fromStart.setP2(rd.getTGConnectingPointAtIndex(0)); fromStart = new TGConnectorTMLAD(xc, 350, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(rd.getTGConnectingPointAtIndex(1)); } //Send data back to task TMLADWriteChannel wr = new TMLADWriteChannel(xc, 600, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); wr.setChannelName("retData_" + ch.name + "_" + ch.task); //Return plaintext data if decrypting if (ch.secType == HSMChannel.DEC) { wr.setEncForm(false); } tad.addComponent(wr, xc, 600, false, true); wr.setSecurityContext(channelSecMap.get(ch.name)); if (ch.secType == HSMChannel.DEC) { //Add Decrypt operator TMLADDecrypt dec = new TMLADDecrypt(xc, 500, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); dec.securityContext = channelSecMap.get(ch.name); tad.addComponent(dec, xc, 500, false, true); //Connect decrypt and readchannel fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(rd.getTGConnectingPointAtIndex(1)); fromStart.setP2(dec.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); //Connect encrypt and writechannel fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(dec.getTGConnectingPointAtIndex(1)); fromStart.setP2(wr.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); //Add Stop TMLADStopState stop = new TMLADStopState(xc, 700, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); tad.addComponent(stop, xc, 700, false, true); //Connect stop and write channel fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(wr.getTGConnectingPointAtIndex(1)); fromStart.setP2(stop.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); } else { TMLADEncrypt enc = new TMLADEncrypt(xc, 500, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); enc.securityContext = channelSecMap.get(ch.name); if (ch.secType == HSMChannel.SENC) { enc.type = "Symmetric Encryption"; } else if (ch.secType == HSMChannel.AENC) { enc.type = "Asymmetric Encryption"; } else if (ch.secType == HSMChannel.MAC) { enc.type = "MAC"; } else if (ch.secType == HSMChannel.NONCE) { enc.type = "Nonce"; } enc.message_overhead = overhead; enc.encTime = encComp; enc.decTime = decComp; tad.addComponent(enc, xc, 500, false, true); //Connect encrypt and readchannel fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(rd.getTGConnectingPointAtIndex(1)); fromStart.setP2(enc.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); //Connect encrypt and writechannel fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(enc.getTGConnectingPointAtIndex(1)); fromStart.setP2(wr.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); //Add Stop TMLADStopState stop = new TMLADStopState(xc, 700, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad); tad.addComponent(stop, xc, 700, false, true); //Connect stop and write channel fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>()); fromStart.setP1(wr.getTGConnectingPointAtIndex(1)); fromStart.setP2(stop.getTGConnectingPointAtIndex(0)); tad.addComponent(fromStart, 300, 200, false, true); } xc += 300; i++; } } } class HSMChannel { public String name; public static final int SENC = 0; public static final int NONCE_ENC = 1; public static final int MAC = 2; public static final int DEC = 3; public static final int AENC = 4; public static final int NONCE = 5; public String task; public String securityContext = ""; public int secType; public String nonceName = ""; public HSMChannel(String n, String t, int type) { name = n; task = t; secType = type; } } class ChannelData { public String name; public boolean isOrigin; public boolean isChan; public ChannelData(String n, boolean orig, boolean isCh) { name = n; isOrigin = orig; isChan = isCh; } } }