Skip to content
Snippets Groups Projects
HSMGeneration.java 53.41 KiB
package ui;
/**
 * Class HSMGeneration
 * HSM Generation in separate thread
 * Creation: 1/06/2016
 *
 * @author Letitia LI
 * @version 1.1 5/30/2018
 */
 
 import avatartranslator.*;
import myutil.BoolExpressionEvaluator;
import myutil.Conversion;
import myutil.IntExpressionEvaluator;
import myutil.TraceManager;

import tmltranslator.*;
import tmltranslator.toavatarsec.TML2Avatar;

import avatartranslator.*;
import avatartranslator.toproverif.AVATAR2ProVerif;


import launcher.LauncherException;
import launcher.RemoteExecutionThread;
import launcher.RshClient;

import ui.tmlad.*;
import ui.tmlcd.TMLTaskDiagramPanel;
import ui.tmlcd.TMLTaskOperator;
import ui.tmlcompd.*;
import ui.tmlcp.TMLCPPanel;
import ui.tmldd.*;
import common.ConfigurationTTool;

import ui.tmlsd.TMLSDPanel;

import proverifspec.ProVerifOutputAnalyzer;
import proverifspec.ProVerifQueryAuthResult;
import proverifspec.ProVerifQueryResult;
import proverifspec.ProVerifSpec;

import java.awt.Point;

import java.util.*;
import java.io.*;
 
public class HSMGeneration implements Runnable {
	MainGUI gui;
	Map<String, List<String>> selectedCpuTasks;
	
	AVATAR2ProVerif avatar2proverif;
	AvatarSpecification avatarspec;
	ProVerifSpec proverif;
	TMLMapping<TGComponent> tmap;
	
	public HSMGeneration(MainGUI gui, Map<String, List<String>> selectedCpuTasks, TMLMapping<TGComponent> tmap){
		this.gui = gui;
		this.selectedCpuTasks = selectedCpuTasks;
		this.tmap = tmap;
	}
	public void proverifAnalysis(TMLMapping<TGComponent> map, List<String> nonAuthChans, List<String> nonSecChans) {
        if (map == null) {
            TraceManager.addDev("No mapping");
            return;
        }
        
        //Perform ProVerif Analysis
        TML2Avatar t2a = new TML2Avatar(map, 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()) {
                if (confResults.get(pragma).isProved() && !confResults.get(pragma).isSatisfied()) {
                    nonSecChans.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", ""));
                    for (String block : chan.getTaskNames()) {
                        nonSecChans.add(block + "__" + 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("nonsecchans " + nonSecChans);
            TraceManager.addDev("nonauthchans " + nonAuthChans);
            TraceManager.addDev("all results displayed");

        } catch (Exception e) {
            
        }
    }
    
    
	public void startThread(){
		Thread t = new Thread(this);
		t.start();
		try {
			t.join();
		}
		catch (Exception e){
			TraceManager.addDev("Error in HSM Generation Thread");
		}
		return;
	}
    
    public void run(){
    	Map<String, Integer> channelIndexMap = new HashMap<String, Integer>();
    	int channelIndex=0;
    	TraceManager.addDev("Adding HSM");
        
        String encComp = "100";
        String decComp = "100";
        String overhead = "0";
        String name = "hsm";
        if (tmap == null) {
            return;
        }
        //Clone diagrams
        TURTLEPanel tmlap = tmap.getCorrespondanceList().getTG(tmap.getArch().getFirstCPU()).getTDiagramPanel().tp;
        int arch = gui.tabs.indexOf(tmlap);
        gui.cloneRenameTab(arch, "hsm");
        TMLArchiPanel newarch = (TMLArchiPanel) gui.tabs.get(gui.tabs.size() - 1);

        TGComponent tgcomp = tmap.getTMLModeling().getTGComponent();
        TMLComponentDesignPanel tmlcdp = (TMLComponentDesignPanel) tgcomp.getTDiagramPanel().tp;

//        TMLComponentDesignPanel tmlcdp = tmap.getTMLCDesignPanel();
        int ind = gui.tabs.indexOf(tmlcdp);
        String tabName = gui.getTitleAt(tmlcdp);
        gui.cloneRenameTab(ind, name);
        TMLComponentDesignPanel t = (TMLComponentDesignPanel) gui.tabs.get(gui.tabs.size() - 1);
        TMLComponentTaskDiagramPanel tcdp = t.tmlctdp;
        //Create clone of architecture panel and map tasks to it
        newarch.renameMapping(tabName, tabName + "_" + name);


        //ProVerif analysis
        List<String> nonAuthChans = new ArrayList<String>();
        List<String> nonSecChans = new ArrayList<String>();

        proverifAnalysis(tmap, nonAuthChans, nonSecChans);

        TGConnector fromStart;
        Map<String, HSMChannel> secChannels = new HashMap<String, HSMChannel>();
        //Add a HSM Task for each selected CPU on the component diagram
        for (String cpuName : selectedCpuTasks.keySet()) {
            Map<String, HSMChannel> hsmChannels = new HashMap<String, HSMChannel>();
            TMLCPrimitiveComponent hsm = new TMLCPrimitiveComponent(0, 500, 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) {
                //
                continue;
            }
            for (TMLCPrimitiveComponent comp : comps) {

                Map<String, HSMChannel> compChannels = new HashMap<String, HSMChannel>();
                String compName = comp.getValue();
                TMLActivityDiagramPanel tad = t.getTMLActivityDiagramPanel(compName);
                Set<TGComponent> channelInstances = new HashSet<TGComponent>();
                Set<TGComponent> secOperators = new HashSet<TGComponent>();
              //  isEnc = new TAttribute(2, "isEnc", "true", 4);
                //comp.getAttributeList().add(isEnc);
                //Find all unsecured channels
                //For previously secured channels, relocate encryption to the hsm

                for (TGComponent tg : tad.getComponentList()) {
                    if (tg instanceof TMLADWriteChannel) {
                        TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg;
                        if (writeChannel.getSecurityContext().equals("")) {
                            String nonceName = "";
                            int type = -1;
                            if (nonSecChans.contains(compName + "__" + writeChannel.getChannelName() + "_chData")) {
                                type = HSMChannel.SENC;
                                if (nonAuthChans.contains(compName + "__" + writeChannel.getChannelName())) {
                                    nonceName = "nonce_" + writeChannel.getChannelName();
                                }
                            } else if (nonAuthChans.contains(compName + "__" + writeChannel.getChannelName())) {
                                type = HSMChannel.MAC;
                            }
                            HSMChannel ch = new HSMChannel(writeChannel.getChannelName(), compName, type);
                            ch.securityContext = "hsmSec_" + writeChannel.getChannelName();
                            ch.nonceName = nonceName;
                            fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0));
                            if (fromStart != null) {
                                if (type != -1) {
                                    compChannels.put(writeChannel.getChannelName(), ch);
                                    channelInstances.add(tg);
                                    if (!channelIndexMap.containsKey(writeChannel.getChannelName())){
	                                    channelIndexMap.put(writeChannel.getChannelName(),channelIndex);
	                                    channelIndex++;
									}   
                                }
                            }
                        } else {
                            //
                            fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0));
                            if (fromStart != null) {
                                channelInstances.add(tg);
                                SecurityPattern sp = tmap.getSecurityPatternByName(writeChannel.getSecurityContext());
                                int type = -1;
                                if (sp.type.equals("Symmetric Encryption")) {
                                    type = HSMChannel.SENC;
                                } else if (sp.type.equals("Asymmetric Encryption")) {
                                    type = HSMChannel.AENC;
                                } else if (sp.type.equals("MAC")) {
                                    type = HSMChannel.MAC;
                                } else if (sp.type.equals("Nonce")) {
                                    type = HSMChannel.NONCE;
                                }
                                HSMChannel ch = new HSMChannel(writeChannel.getChannelName(), compName, type);
                                ch.securityContext = writeChannel.getSecurityContext();
                                compChannels.put(writeChannel.getChannelName(), ch);
                                if (!channelIndexMap.containsKey(writeChannel.getChannelName())){
	                            	channelIndexMap.put(writeChannel.getChannelName(),channelIndex);
	                                channelIndex++;
								}   
                                //chanNames.add(writeChannel.getChannelName()+compName);
                            }
                        }
                    }
                    if (tg instanceof TMLADReadChannel) {
                        TMLADReadChannel readChannel = (TMLADReadChannel) tg;
                        if (readChannel.getSecurityContext().equals("")) {
                            fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0));
                            if (fromStart != null) {
                                if (nonSecChans.contains(compName + "__" + readChannel.getChannelName() + "_chData") || nonAuthChans.contains(compName + "__" + readChannel.getChannelName())) {
                                    channelInstances.add(tg);
                                    HSMChannel ch = new HSMChannel(readChannel.getChannelName(), compName, HSMChannel.DEC);
                                    ch.securityContext = "hsmSec_" + readChannel.getChannelName();
                                    compChannels.put(readChannel.getChannelName(), ch);
                                    if (!channelIndexMap.containsKey(readChannel.getChannelName())){
	                            		channelIndexMap.put(readChannel.getChannelName(),channelIndex);
	                                	channelIndex++;
									}   
                                    if (nonSecChans.contains(compName + "__" + readChannel.getChannelName() + "_chData") && nonAuthChans.contains(compName + "__" + readChannel.getChannelName())) {
                                        ch.nonceName = "nonce_" + readChannel.getChannelName();
                                    }
                                }
                            }
                        } else {
                            fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0));
                            if (fromStart != null) {
                                channelInstances.add(tg);
                                HSMChannel ch = new HSMChannel(readChannel.getChannelName(), compName, HSMChannel.DEC);
                                ch.securityContext = readChannel.getSecurityContext();
                                compChannels.put(readChannel.getChannelName(), ch);
                                if (!channelIndexMap.containsKey(readChannel.getChannelName())){
	                            	channelIndexMap.put(readChannel.getChannelName(),channelIndex);
	                                channelIndex++;
								}   
                            }
                        }
                    }
                    if (tg instanceof TMLADEncrypt) {
                        //      TMLADEncrypt enc = (TMLADEncrypt) tg;
                        secOperators.add(tg);
                        //}
                    }
                    if (tg instanceof TMLADDecrypt) {
                        //      TMLADDecrypt dec = (TMLADDecrypt) tg;
                        secOperators.add(tg);
                        //}
                    }
                }
                
               // 
                //
                List<ChannelData> hsmChans = new ArrayList<ChannelData>();
                ChannelData chd = new ChannelData("startHSM_" + cpuName, false, false);
                hsmChans.add(chd);
                for (String s : compChannels.keySet()) {
                    hsmChannels.put(s, compChannels.get(s));
                    chd = new ChannelData("data_" + s + "_" + compChannels.get(s).task, false, true);
                    hsmChans.add(chd);
                    chd = new ChannelData("retData_" + s + "_" + compChannels.get(s).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.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);
                }
                int xpos = 0;
                int ypos = 0;

                //Remove existing security elements
                for (TGComponent op : secOperators) {
                    TGConnector prev = tad.findTGConnectorEndingAt(op.getTGConnectingPointAtIndex(0));
                    //TGConnectingPoint point = prev.getTGConnectingPointP1();
                    TGConnector end = tad.findTGConnectorStartingAt(op.getTGConnectingPointAtIndex(1));
                    TGConnectingPoint point2 = end.getTGConnectingPointP2();
                    tad.removeComponent(op);
                    tad.removeComponent(end);
                    tad.addComponent(prev, 0, 0, false, true);
                    prev.setP2(point2);
                }

                //Modify component activity diagram to add read/write to HSM

                //Add actions before Write Channel
                for (TGComponent chan : channelInstances) {
                    String chanName = "";
                    if (!(chan instanceof TMLADWriteChannel)) {
                        continue;
                    }
                    TMLADWriteChannel writeChannel = (TMLADWriteChannel) chan;
                    chanName = writeChannel.getChannelName();
                    HSMChannel ch = hsmChannels.get(chanName);
                    writeChannel.setSecurityContext(ch.securityContext);
                    xpos = chan.getX();
                    ypos = chan.getY();
                    fromStart = tad.findTGConnectorEndingAt(chan.getTGConnectingPointAtIndex(0));
                    TGConnectingPoint 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_" + cpuName);
                    
                                        
                    
                    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 + "_" + compName);
                    wr.setSecurityContext(ch.securityContext);
                    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));


                    //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 + "_" + compName);
                    rd.setSecurityContext(ch.securityContext);
                    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 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.setCd(tg.getX(), tg.getY() + yShift);
                        }
                    }
                    tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift);
                    tad.repaint();

                }
                //Add actions after Read Channel
                for (TGComponent chan : channelInstances) {
                    String chanName = "";
                    if (!(chan instanceof TMLADReadChannel)) {
                        continue;
                    }
                    TMLADReadChannel readChannel = (TMLADReadChannel) chan;
                    chanName = readChannel.getChannelName();
                    HSMChannel ch = hsmChannels.get(chanName);
                    readChannel.setSecurityContext(ch.securityContext);
                    xpos = chan.getX() + 10;
                    ypos = chan.getY();
                    fromStart = tad.findTGConnectorStartingAt(chan.getTGConnectingPointAtIndex(1));
                    if (fromStart == null) {
                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
                        fromStart.setP1(chan.getTGConnectingPointAtIndex(1));
                        tad.addComponent(fromStart, xpos, ypos, false, true);
                    }
                    TGConnectingPoint point = fromStart.getTGConnectingPointP2();


                    int yShift = 50;


                    yShift += 50;
                    TMLADSendRequest req = new TMLADSendRequest(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                    req.setRequestName("startHSM_" + cpuName);
                    
                    req.setParam(0, Integer.toString(channelIndexMap.get(chanName)));
                    
                    req.makeValue();
                    tad.addComponent(req, xpos, ypos + yShift, false, true);


                    fromStart.setP2(req.getTGConnectingPointAtIndex(0));


                    yShift += 50;
                    //Add write channel operator
                    TMLADWriteChannel wr = new TMLADWriteChannel(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                    wr.setChannelName("data_" + chanName + "_" + compName);
                    wr.setSecurityContext(ch.securityContext);
                    tad.addComponent(wr, xpos, ypos + yShift, 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));
                    fromStart.setP2(wr.getTGConnectingPointAtIndex(0));
                    tad.addComponent(fromStart, xpos, ypos, false, true);

                    //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 + "_" + compName);
                    rd.setSecurityContext(ch.securityContext);
                    tad.addComponent(rd, xpos, ypos + yShift, 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));
                    fromStart.setP2(rd.getTGConnectingPointAtIndex(0));
                    yShift += 50;

                    if (point != null) {
                        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));
                        //Direct the last TGConnector back to the start of the write channel operator

                        fromStart.setP2(point);
                    }
                    yShift += 50;

                    //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 != chan) {
                            tg.setCd(tg.getX(), tg.getY() + yShift);
                        }
                    }
                    tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift);
                    tad.repaint();
                }
            }

            int xpos = 0;
            int ypos = 0;


            //Build HSM Activity diagram

            TMLActivityDiagramPanel tad = t.getTMLActivityDiagramPanel("HSM_" + cpuName);

            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>());


            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 (hsmChannels.keySet().size() > 3) {
                TMLADChoice choice2 = new TMLADChoice(xc, 400, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                int i = 0;
                for (String chan : hsmChannels.keySet()) {
                    HSMChannel ch = hsmChannels.get(chan);
                    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_" + chan + "_" + hsmChannels.get(chan).task);
                    rd.setSecurityContext(ch.securityContext);
                    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_" + chan + "_" + hsmChannels.get(chan).task);
                    tad.addComponent(wr, xc, 600, false, true);
                    wr.setSecurityContext(ch.securityContext);


                    if (hsmChannels.get(chan).secType == HSMChannel.DEC) {
                        TMLADDecrypt dec = new TMLADDecrypt(xc, 500, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                        dec.securityContext = ch.securityContext;
                        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 = ch.securityContext;
                        if (hsmChannels.get(chan).secType == HSMChannel.SENC) {
                            enc.type = "Symmetric Encryption";
                        } else if (hsmChannels.get(chan).secType == HSMChannel.AENC) {
                            enc.type = "Asymmetric Encryption";
                        } else if (hsmChannels.get(chan).secType == HSMChannel.MAC) {
                            enc.type = "MAC";
                        } else if (hsmChannels.get(chan).secType == HSMChannel.NONCE) {
                            enc.type = "Nonce";
                        }

                        enc.message_overhead = overhead;
                        enc.encTime = encComp;
                        enc.decTime = decComp;
                        enc.nonce = hsmChannels.get(chan).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 (String chan : hsmChannels.keySet()) {
                
                	//Add guard as channelindex
                	choice.setGuard("[channelIndex=="+channelIndexMap.get(chan)+"]",i-1);
                	
                    HSMChannel ch = hsmChannels.get(chan);
                    TMLADReadChannel rd = new TMLADReadChannel(xc, 300, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                    rd.setChannelName("data_" + chan + "_" + hsmChannels.get(chan).task);
                    rd.setSecurityContext(ch.securityContext);
                    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(choice.getTGConnectingPointAtIndex(i));
                    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_" + chan + "_" + hsmChannels.get(chan).task);
                    tad.addComponent(wr, xc, 600, false, true);
                    wr.setSecurityContext(ch.securityContext);


                    if (hsmChannels.get(chan).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 = ch.securityContext;
                        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 = ch.securityContext;
                        if (hsmChannels.get(chan).secType == HSMChannel.SENC) {
                            enc.type = "Symmetric Encryption";
                        } else if (hsmChannels.get(chan).secType == HSMChannel.AENC) {
                            enc.type = "Asymmetric Encryption";
                        } else if (hsmChannels.get(chan).secType == HSMChannel.MAC) {
                            enc.type = "MAC";
                        } else if (hsmChannels.get(chan).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++;
                }

            }

            secChannels.putAll(hsmChannels);
        }
        //For all the tasks that receive encrypted data, decrypt it, assuming it has no associated HSM
        for (TMLTask task : tmap.getTMLModeling().getTasks()) {
            int xpos, ypos;
            //
            TMLActivityDiagramPanel tad = t.getTMLActivityDiagramPanel(task.getName());
            HashSet<TGComponent> channelInstances = new HashSet<TGComponent>();
            for (String chan : secChannels.keySet()) {
                HSMChannel ch = secChannels.get(chan);
                channelInstances.clear();
                for (TGComponent tg : tad.getComponentList()) {
                    if (tg instanceof TMLADReadChannel) {
                        TMLADReadChannel readChannel = (TMLADReadChannel) tg;
                        if (readChannel.getChannelName().equals(chan) && readChannel.getSecurityContext().equals("")) {
                            fromStart = tad.findTGConnectorStartingAt(tg.getTGConnectingPointAtIndex(1));
                            if (fromStart != null) {
                                channelInstances.add(tg);
                            }
                        }
                    }
                }
                for (TGComponent chI : channelInstances) {
                    TMLADReadChannel readChannel = (TMLADReadChannel) chI;
                    readChannel.setSecurityContext(ch.securityContext);
                    xpos = chI.getX();
                    ypos = chI.getY() + 10;
                    fromStart = tad.findTGConnectorStartingAt(chI.getTGConnectingPointAtIndex(1));
                    if (fromStart == null) {
                        fromStart = new TGConnectorTMLAD(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad, null, null, new Vector<Point>());
                        fromStart.setP1(chI.getTGConnectingPointAtIndex(1));
                        tad.addComponent(fromStart, xpos, ypos, false, true);
                    }
                    TGConnectingPoint point = fromStart.getTGConnectingPointP2();
                    //Add decryption operator
                    int yShift = 100;
                    TMLADDecrypt dec = new TMLADDecrypt(xpos, ypos + yShift, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                    dec.securityContext = ch.securityContext;
                    tad.addComponent(dec, xpos, ypos + yShift, false, true);


                    fromStart.setP2(dec.getTGConnectingPointAtIndex(0));
                    if (point != null) {
                        fromStart = new TGConnectorTMLAD(dec.getX(), dec.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(dec.getTGConnectingPointAtIndex(1));

                        //Direct the last TGConnector back to the next action

                        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 != dec) {
                            tg.setCd(tg.getX(), tg.getY() + yShift);
                        }
                    }
                    tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift);
                    tad.repaint();

                }
            }
            //Next find channels that send encrypted data, and add the encryption operator
            for (String chan : secChannels.keySet()) {
                channelInstances.clear();
                HSMChannel ch = secChannels.get(chan);
                for (TGComponent tg : tad.getComponentList()) {
                    if (tg instanceof TMLADWriteChannel) {
                        TMLADWriteChannel writeChannel = (TMLADWriteChannel) tg;
                        if (writeChannel.getChannelName().equals(chan) && writeChannel.getSecurityContext().equals("")) {
                            fromStart = tad.findTGConnectorEndingAt(tg.getTGConnectingPointAtIndex(0));
                            if (fromStart != null) {
                                channelInstances.add(tg);
                            }
                        }
                    }
                }
                for (TGComponent chI : channelInstances) {
                    TMLADWriteChannel writeChannel = (TMLADWriteChannel) chI;
                    writeChannel.setSecurityContext(ch.securityContext);
                    xpos = chI.getX();
                    ypos = chI.getY() - 10;
                    fromStart = tad.findTGConnectorEndingAt(chI.getTGConnectingPointAtIndex(0));
                    TGConnectingPoint point = fromStart.getTGConnectingPointP2();
                    //Add encryption operator
                    int yShift = 100;

                    TMLADEncrypt enc = new TMLADEncrypt(xpos, ypos, tad.getMinX(), tad.getMaxX(), tad.getMinY(), tad.getMaxY(), false, null, tad);
                    tad.addComponent(enc, xpos, ypos, false, true);
                    enc.securityContext = ch.securityContext;
                    enc.type = "Symmetric Encryption";
                    enc.message_overhead = overhead;
                    enc.encTime = encComp;
                    enc.decTime = decComp;
                    enc.size = overhead;


                    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.getY() >= ypos && tg != enc) {
                            tg.setCd(tg.getX(), tg.getY() + yShift);
                        }
                    }
                    tad.setMaxPanelSize(tad.getMaxX(), tad.getMaxY() + yShift);
                    tad.repaint();

                }
            }

        }
        for (String cpuName : selectedCpuTasks.keySet()) {
            //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() + 100, cpu.getY() + 100, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, null, archPanel);
            archPanel.addComponent(mem, cpu.getX() + 100, cpu.getY() + 100, false, true);
            mem.setName("HSMMemory_" + cpuName);
            //Add Hardware Accelerator

            TMLArchiHWANode hwa = new TMLArchiHWANode(cpu.getX() + 100, cpu.getY() + 100, 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() + 100, cpu.getY() + 100, archPanel.getMinX(), archPanel.getMaxX(), archPanel.getMinY(), archPanel.getMaxY(), true, hwa, archPanel);
            archPanel.addComponent(hsmArt, cpu.getX() + 100, cpu.getY() + 100, true, true);
            hsmArt.setFullName("HSM_" + cpuName, refTask);
            //Add bus connecting the cpu and HWA

            TMLArchiBUSNode bus = new TMLArchiBUSNode(cpu.getX() + 100, cpu.getY() + 100, 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, cpu.getY() + 100, 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);
            p1.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);
            p1.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);
            p1.setFree(false);
            connect.setP1(p2);
            archPanel.addComponent(connect, cpu.getX() + 100, cpu.getY() + 100, false, true);
        }
	}
	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;
        }

    }


}