From 280968ceae02dd2c403639c61b712bc0c60f4f4e Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Mon, 18 May 2020 19:11:27 +0200 Subject: [PATCH 01/26] Extracted required functionalities for testgenerator as separate methods Signed-off-by: Rakshit Krishnappa Ravi - all extracted methods are used by de.cognicrypt.testgenerator plugin - also changed some private methods to public for usage in testgenerator --- .../generator/CrySLBasedCodeGenerator.java | 390 ++++++++++-------- 1 file changed, 227 insertions(+), 163 deletions(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java index f1394f061..e9cda78b2 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java @@ -15,6 +15,7 @@ import java.net.MalformedURLException; import java.security.NoSuchAlgorithmException; import java.security.SecureRandom; +import java.util.AbstractMap; import java.util.AbstractMap.SimpleEntry; import java.util.ArrayList; import java.util.Arrays; @@ -117,6 +118,30 @@ public CrySLBasedCodeGenerator(IResource selectedFile) { super(selectedFile); } + public List getExceptions() { + return exceptions; + } + + public List getKills() { + return kills; + } + + public List>> getPredicateConnections() { + return predicateConnections; + } + + public void setPredicateConnections(List>> predicateConnections) { + this.predicateConnections = predicateConnections; + } + + public Entry> getToBeEnsuredPred() { + return toBeEnsuredPred; + } + + public void setToBeEnsuredPred(Entry> toBeEnsuredPred) { + this.toBeEnsuredPred = toBeEnsuredPred; + } + @Override public boolean generateCodeTemplates(Configuration chosenConfig, String pathToFolderWithAdditionalResources) { GeneratorClass ruleClass = null; @@ -171,33 +196,7 @@ public boolean generateCodeTemplates(Configuration chosenConfig, String pathToFo CryptSLRule curRule = rules.get(i); if (rdt.hasDirectPath(curRule, nextRule)) { - boolean now = false; - for (CryptSLPredicate ensPred : curRule.getPredicates()) { - String nextType = nextRule.getClassName(); - String predType = ((CryptSLObject) ensPred.getParameters().get(0)).getJavaType(); - if (Utils.isSubType(nextType, predType) || Utils.isSubType(predType, nextType)) { - predicateConnections.add(new SimpleEntry<>(ensPred, new SimpleEntry(curRule, nextRule))); - now = true; - } - for (CryptSLPredicate reqPred : nextRule.getRequiredPredicates()) { - if (reqPred.equals(ensPred) && Utils.isSubType(((CryptSLObject) reqPred.getParameters().get(0)).getJavaType(), predType)) { - Optional>> matchedPred = predicateConnections.stream() - .filter(e -> e.getKey().equals(ensPred)).findFirst(); - if (now && matchedPred.isPresent()) { - int newParNumber = getParameterNumber(curRule, (CryptSLObject) ensPred.getParameters().get(0)); - Entry> entry = matchedPred.get(); - int oldParNumber = getParameterNumber(curRule, (CryptSLObject) entry.getKey().getParameters().get(0)); - if (newParNumber < oldParNumber) { - predicateConnections.remove(entry); - predicateConnections.add(new SimpleEntry<>(ensPred, new SimpleEntry(curRule, nextRule))); - } - } else { - predicateConnections.add(new SimpleEntry<>(ensPred, new SimpleEntry(curRule, nextRule))); - now = true; - } - } - } - } + populatePredicateConnections(curRule, nextRule); } } } @@ -220,77 +219,9 @@ public boolean generateCodeTemplates(Configuration chosenConfig, String pathToFo boolean lastRule = rules.get(rules.size() - 1).equals(rule); // get state machine of cryptsl rule StateMachineGraph stateMachine = rule.getUsagePattern(); - Optional>> toBeEnsured = Optional.empty(); + Optional>> toBeEnsured = determineEnsurePredicates(rule, lastRule); - if (lastRule) { - CryptSLObject reqReturnObject = ((CodeGenCrySLRule) rule).getRequiredRetObj(); - toBeEnsuredPred = null; - List candidates = new ArrayList(); - for (CryptSLPredicate reqPred : rule.getPredicates()) { - if (!(reqPred instanceof CryptSLCondPredicate)) { - String parType = ((CryptSLObject) reqPred.getParameters().get(0)).getJavaType(); - if (Utils.isSubType(parType, reqReturnObject.getJavaType()) || Utils.isSubType(reqReturnObject.getJavaType(), parType)) { - candidates.add(reqPred); - } - } - } - if (candidates.size() == 1) { - toBeEnsuredPred = new SimpleEntry(candidates.get(0), new SimpleEntry(rule, null)); - } else if (candidates.size() > 1) { - Entry candHD = null; - for (CryptSLPredicate candidate : candidates) { - String retName = reqReturnObject.getVarName(); - String candName = ((CryptSLObject) candidate.getParameters().get(0)).getVarName(); - - if (candHD == null) { - candHD = new SimpleEntry(candidate, getHD(retName, candName)); - } - if (getHD(retName, candName) < candHD.getValue()) { - candHD = new SimpleEntry(candidate, getHD(retName, candName)); - } - } - toBeEnsuredPred = new SimpleEntry(candHD.getKey(), new SimpleEntry(rule, null)); - } - if (toBeEnsuredPred == null) { - for (CryptSLPredicate reqPred : rule.getPredicates()) { - CryptSLObject a = ((CodeGenCrySLRule) rule).getRequiredRetObj(); - Optional o = reqPred.getParameters().stream() - .filter(e -> Utils.isSubType(((CryptSLObject) e).getJavaType(), a.getJavaType())).findFirst(); - if (o.isPresent()) { - toBeEnsuredPred = new SimpleEntry(reqPred, new SimpleEntry(rule, null)); - break; - } - } - } - } else { - Stream>> filter = predicateConnections.stream().filter(e -> { - String ruleClassName = rule.getClassName(); - String keyClassName = e.getValue().getKey().getClassName(); - return Utils.isSubType(ruleClassName, keyClassName) || Utils.isSubType(keyClassName, ruleClassName); - }); - toBeEnsured = filter.findFirst(); - if (toBeEnsured.isPresent()) { - toBeEnsuredPred = toBeEnsured.get(); - } - } - - // analyse state machine - StateMachineGraphAnalyser stateMachineGraphAnalyser = new StateMachineGraphAnalyser(stateMachine); - ArrayList> transitionsList; - Iterator> transitions = null; - try { - transitionsList = stateMachineGraphAnalyser.getTransitions(); - transitionsList.sort(new Comparator>() { - - @Override - public int compare(List element1, List element2) { - return Integer.compare(element1.size(), element2.size()); - } - }); - transitions = transitionsList.iterator(); - } catch (Exception e) { - Activator.getDefault().logError(e); - } + Iterator> transitions = getTransitionsFromStateMachine(stateMachine); do { // Load one possible path through the state machine. @@ -302,12 +233,7 @@ public int compare(List element1, List element2) imports.addAll(Arrays.asList(Constants.xmlimportsarr)); ruleClass.addImports(imports); - Map> mayUsePreds = new HashMap<>(); - for (Entry> entry : predicateConnections) { - if (entry.getValue().getValue().getClassName().equals(usedClass)) { - mayUsePreds.put(entry.getKey(), entry.getValue()); - } - } + Map> mayUsePreds = determineMayUsePreds(usedClass); ArrayList methodInvocations = generateMethodInvocations(rule, method, currentTransitions, mayUsePreds, imports, lastRule); if (methodInvocations.isEmpty()) { @@ -380,6 +306,130 @@ public int compare(List element1, List element2) return generatedClasses != null; } + + public void populatePredicateConnections(CryptSLRule curRule, CryptSLRule nextRule) { + boolean now = false; + for (CryptSLPredicate ensPred : curRule.getPredicates()) { + String nextType = nextRule.getClassName(); + String predType = ((CryptSLObject) ensPred.getParameters().get(0)).getJavaType(); + if (Utils.isSubType(nextType, predType) || Utils.isSubType(predType, nextType)) { + predicateConnections.add(new SimpleEntry<>(ensPred, new SimpleEntry(curRule, nextRule))); + now = true; + } + for (CryptSLPredicate reqPred : nextRule.getRequiredPredicates()) { + if (reqPred.equals(ensPred) && Utils.isSubType(((CryptSLObject) reqPred.getParameters().get(0)).getJavaType(), predType)) { + Optional>> matchedPred = predicateConnections.stream() + .filter(e -> e.getKey().equals(ensPred)).findFirst(); + if (now && matchedPred.isPresent()) { + int newParNumber = getParameterNumber(curRule, (CryptSLObject) ensPred.getParameters().get(0)); + Entry> entry = matchedPred.get(); + int oldParNumber = getParameterNumber(curRule, (CryptSLObject) entry.getKey().getParameters().get(0)); + if (newParNumber < oldParNumber) { + predicateConnections.remove(entry); + predicateConnections.add(new SimpleEntry<>(ensPred, new SimpleEntry(curRule, nextRule))); + } + } else { + predicateConnections.add(new SimpleEntry<>(ensPred, new SimpleEntry(curRule, nextRule))); + now = true; + } + } + } + } + } + + public Optional>> determineEnsurePredicates(CryptSLRule rule, boolean lastRule) { + Optional>> toBeEnsured = Optional.empty(); + if (lastRule) { + CryptSLObject reqReturnObject = ((CodeGenCrySLRule) rule).getRequiredRetObj(); + toBeEnsuredPred = null; + List candidates = new ArrayList(); + for (CryptSLPredicate reqPred : rule.getPredicates()) { + if (!(reqPred instanceof CryptSLCondPredicate)) { + String parType = ((CryptSLObject) reqPred.getParameters().get(0)).getJavaType(); + if (Utils.isSubType(parType, reqReturnObject.getJavaType()) || Utils.isSubType(reqReturnObject.getJavaType(), parType)) { + candidates.add(reqPred); + } + } + } + if (candidates.size() == 1) { + toBeEnsuredPred = new SimpleEntry(candidates.get(0), new SimpleEntry(rule, null)); + } else if (candidates.size() > 1) { + Entry candHD = null; + for (CryptSLPredicate candidate : candidates) { + String retName = reqReturnObject.getVarName(); + String candName = ((CryptSLObject) candidate.getParameters().get(0)).getVarName(); + + if (candHD == null) { + candHD = new SimpleEntry(candidate, getHD(retName, candName)); + } + if (getHD(retName, candName) < candHD.getValue()) { + candHD = new SimpleEntry(candidate, getHD(retName, candName)); + } + } + toBeEnsuredPred = new SimpleEntry(candHD.getKey(), new SimpleEntry(rule, null)); + } + + if (toBeEnsuredPred == null) { + for (CryptSLPredicate reqPred : rule.getPredicates()) { + CryptSLObject a = ((CodeGenCrySLRule) rule).getRequiredRetObj(); + Optional o = reqPred.getParameters().stream() + .filter(e -> Utils.isSubType(((CryptSLObject) e).getJavaType(), a.getJavaType())).findFirst(); + if (o.isPresent()) { + toBeEnsuredPred = new SimpleEntry(reqPred, new SimpleEntry(rule, null)); + break; + } + } + } + } else { + toBeEnsured = determineEnsurePreds(rule); + } + return toBeEnsured; + } + + public Optional>> determineEnsurePreds(CryptSLRule rule) { + Optional>> toBeEnsured; + Stream>> filter = predicateConnections.stream().filter(e -> { + String ruleClassName = rule.getClassName(); + String keyClassName = e.getValue().getKey().getClassName(); + return Utils.isSubType(ruleClassName, keyClassName) || Utils.isSubType(keyClassName, ruleClassName); + }); + toBeEnsured = filter.findFirst(); + if (toBeEnsured.isPresent()) { + toBeEnsuredPred = toBeEnsured.get(); + } + return toBeEnsured; + } + + public Iterator> getTransitionsFromStateMachine(StateMachineGraph stateMachine) { + // analyse state machine + StateMachineGraphAnalyser stateMachineGraphAnalyser = new StateMachineGraphAnalyser(stateMachine); + ArrayList> transitionsList; + Iterator> transitions = null; + try { + transitionsList = stateMachineGraphAnalyser.getTransitions(); + transitionsList.sort(new Comparator>() { + + @Override + public int compare(List element1, List element2) { + return Integer.compare(element1.size(), element2.size()); + } + }); + transitions = transitionsList.iterator(); + } catch (Exception e) { + Activator.getDefault().logError(e); + } + return transitions; + } + + public Map> determineMayUsePreds(String usedClass) { + Map> mayUsePreds = new HashMap<>(); + for (Entry> entry : predicateConnections) { + if (entry.getValue().getValue().getClassName().equals(usedClass)) { + mayUsePreds.put(entry.getKey(), entry.getValue()); + } + } + return mayUsePreds; + } private Integer getHD(String left, String right) { int distance = 0; @@ -466,12 +516,8 @@ private int getParameterNumber(CryptSLRule curRule, CryptSLObject par) { * @param predicateConnections * @param imports */ - private ArrayList generateMethodInvocations(CodeGenCrySLRule rule, GeneratorMethod useMethod, List currentTransitions, Map> usablePreds, List imports, boolean lastRule) { - Set killStatements = rule.getPredicates().stream().filter(pred -> pred.isNegated() && pred instanceof CryptSLCondPredicate) - .map(e -> ((CryptSLCondPredicate) e).getConditionalMethods()).reduce(new HashSet<>(), (a, b) -> { - a.addAll(b); - return a; - }); + public ArrayList generateMethodInvocations(CodeGenCrySLRule rule, GeneratorMethod useMethod, List currentTransitions, Map> usablePreds, List imports, boolean lastRule) { + Set killStatements = extractKillStatements(rule); ArrayList methodInvocations = new ArrayList(); List localKillers = new ArrayList(); boolean ensures = false; @@ -479,7 +525,6 @@ private ArrayList generateMethodInvocations(CodeGenCrySLRule rule, Gener List> useMethodParameters = new ArrayList>(); Entry> pre = new SimpleEntry<>(toBeEnsuredPred.getKey(), toBeEnsuredPred.getValue()); for (TransitionEdge transition : currentTransitions) { - CryptSLMethod method = null; Set reqMethodNames = new HashSet<>(); rule.getRequiredPars().parallelStream().forEach(e -> reqMethodNames.add(e.getMethod())); List labels = transition.getLabel().stream().filter(e -> { @@ -502,57 +547,14 @@ private ArrayList generateMethodInvocations(CodeGenCrySLRule rule, Gener } return found.size() == objs.size(); }).collect(Collectors.toList()); - - for (CryptSLMethod meth : labels) { - if (method != null) { - break; - } else { - toBeEnsuredPred = pre; - } - - if (toBeEnsuredPred != null) { - //Predicate - method = fetchCorrespondingMethod(toBeEnsuredPred, meth, null); - if (method != null) { - ensures = true; - } - } - - for (Entry> usablePred : usablePreds.entrySet()) { - if (method == null) { - method = fetchCorrespondingMethod(usablePred, meth, null); - } else { - break; - } - } - - } - // Determine method name and signature - if (method == null) { - method = labels.get(0); - } + Entry entry = fetchEnsuringMethod(usablePreds, pre, labels, ensures); + CryptSLMethod method = entry.getKey(); + ensures = entry.getValue(); String methodName = method.getMethodName(); methodName = methodName.substring(methodName.lastIndexOf(".") + 1); - // Determine parameter of method. List> parameters = method.getParameters(); - Iterator> parametersIterator = parameters.iterator(); - - StringBuilder sourceLineGenerator = new StringBuilder(methodName); - sourceLineGenerator.append("("); - - do { - if (parametersIterator.hasNext()) { - sourceLineGenerator.append(parametersIterator.next().getKey()); - } - - if (parametersIterator.hasNext()) { - sourceLineGenerator.append(", "); - } - - } while (parametersIterator.hasNext()); - - sourceLineGenerator.append(");"); + StringBuilder sourceLineGenerator = constructMethodCall(methodName, parameters); Class[] methodParameter = collectParameterTypes(parameters); @@ -594,6 +596,48 @@ private ArrayList generateMethodInvocations(CodeGenCrySLRule rule, Gener } } + public Set extractKillStatements(CryptSLRule rule) { + Set killStatements = rule.getPredicates().stream().filter(pred -> pred.isNegated() && pred instanceof CryptSLCondPredicate) + .map(e -> ((CryptSLCondPredicate) e).getConditionalMethods()).reduce(new HashSet<>(), (a, b) -> { + a.addAll(b); + return a; + }); + return killStatements; + } + + public Entry fetchEnsuringMethod(Map> usablePreds, Entry> pre, List labels, boolean ensures) { + CryptSLMethod method = null; + for (CryptSLMethod meth : labels) { + if (method != null) { + break; + } else { + toBeEnsuredPred = pre; + } + + if (toBeEnsuredPred != null) { + //Predicate + method = fetchCorrespondingMethod(toBeEnsuredPred, meth, null); + if (method != null) { + ensures = true; + } + } + + for (Entry> usablePred : usablePreds.entrySet()) { + if (method == null) { + method = fetchCorrespondingMethod(usablePred, meth, null); + } else { + break; + } + } + + } + // Determine method name and signature + if (method == null) { + method = labels.get(0); + } + return new AbstractMap.SimpleEntry(method, ensures); + } + private CryptSLMethod fetchCorrespondingMethod(Entry> pred, CryptSLMethod meth, Set set) { CryptSLObject objectOfPred = (CryptSLObject) pred.getKey().getParameters().get(0); String predVarType = objectOfPred.getJavaType(); @@ -618,8 +662,28 @@ private CryptSLMethod fetchCorrespondingMethod(Entry> parameters) { + Iterator> parametersIterator = parameters.iterator(); + StringBuilder sourceLineGenerator = new StringBuilder(methodName); + sourceLineGenerator.append("("); + + do { + if (parametersIterator.hasNext()) { + sourceLineGenerator.append(parametersIterator.next().getKey()); + } + + if (parametersIterator.hasNext()) { + sourceLineGenerator.append(", "); + } + + } while (parametersIterator.hasNext()); + + sourceLineGenerator.append(");"); + return sourceLineGenerator; + } - private Class[] collectParameterTypes(List> parameters) { + public Class[] collectParameterTypes(List> parameters) { Class[] methodParameter = new Class[parameters.size()]; int i = 0; List primitiveTypes = Arrays.asList(new String[] { "int", "boolean", "short", "double", "float", "long", "byte", "int[]", "byte[]", "char[]" }); @@ -862,7 +926,7 @@ private Entry>> replaceParameterByValue(CodeG * List of constraints that are used for the analysis. * @return */ - private String analyseConstraints(Entry parameter, CodeGenCrySLRule rule, String methodName) { + public String analyseConstraints(Entry parameter, CodeGenCrySLRule rule, String methodName) { List constraints = rule.getConstraints().stream().filter(e -> e.getInvolvedVarNames().contains(parameter.getKey())).collect(Collectors.toList()); for (ISLConstraint constraint : constraints) { @@ -1085,7 +1149,7 @@ private CryptSLMethod getLastInvokedMethod(List transitions) { * * @return Name of the last method that is used by the currently analysed cryptsl API-rule. */ - private String getLastInvokedMethodName(List transitions) { + public String getLastInvokedMethodName(List transitions) { String lastInvokedMethodName = getLastInvokedMethod(transitions).toString(); lastInvokedMethodName = lastInvokedMethodName.substring(0, lastInvokedMethodName.lastIndexOf("(")); @@ -1105,7 +1169,7 @@ private String getLastInvokedMethodName(List transitions) { * @param transitions * All transitions that are used to describe the source code. */ - private Collection determineImports(List transitions) { + public Collection determineImports(List transitions) { Set imports = new HashSet(); for (TransitionEdge transition : transitions) { String completeMethodName = transition.getLabel().get(0).getMethodName(); @@ -1131,7 +1195,7 @@ private Collection determineImports(List transitions) { * @throws SecurityException * @throws ClassNotFoundException */ - private void determineThrownExceptions(String className, String methodName, Class[] methodParameters, List imports) throws NoSuchMethodException, SecurityException, ClassNotFoundException { + public void determineThrownExceptions(String className, String methodName, Class[] methodParameters, List imports) throws NoSuchMethodException, SecurityException, ClassNotFoundException { List> exceptionClasses = new ArrayList>(); Method[] methods = java.lang.Class.forName(className).getMethods(); for (Method meth : methods) { @@ -1166,7 +1230,7 @@ private boolean matchMethodParameters(Class[] methodParameters, Class[] cl return true; } - private void updateToBeEnsured(Entry entry) { + public void updateToBeEnsured(Entry entry) { if (toBeEnsuredPred != null) { CryptSLPredicate existing = toBeEnsuredPred.getKey(); CryptSLObject predicatePar = (CryptSLObject) existing.getParameters().get(0); From 30879b56cb8d55833e2e1c654a06bd9f5212ca55 Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Tue, 19 May 2020 22:42:40 +0200 Subject: [PATCH 02/26] Added condition to check if project is opened Signed-off-by: Rakshit Krishnappa Ravi - without this condition crysl.handler throws exception when testgenerator is triggered --- .../java/de/cognicrypt/crysl/handler/StartupHandler.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/de.cognicrypt.crysl.handler/src/main/java/de/cognicrypt/crysl/handler/StartupHandler.java b/plugins/de.cognicrypt.crysl.handler/src/main/java/de/cognicrypt/crysl/handler/StartupHandler.java index 9593f1353..76688d88c 100644 --- a/plugins/de.cognicrypt.crysl.handler/src/main/java/de/cognicrypt/crysl/handler/StartupHandler.java +++ b/plugins/de.cognicrypt.crysl.handler/src/main/java/de/cognicrypt/crysl/handler/StartupHandler.java @@ -98,8 +98,11 @@ public void resourceChanged(IResourceChangeEvent event) { && (delta.getKind() == IResourceDelta.ADDED || delta.getKind() == IResourceDelta.CHANGED)) { IProject project = (IProject) deltaResource; try { - if (!CrySLBuilderUtils.hasCrySLBuilder(project) && CrySLBuilderUtils.hasCrySLFiles(project)) { - CrySLBuilderUtils.addCrySLBuilderToProject(project); + if(project.isOpen()) + { + if (!CrySLBuilderUtils.hasCrySLBuilder(project) && CrySLBuilderUtils.hasCrySLFiles(project)) { + CrySLBuilderUtils.addCrySLBuilderToProject(project); + } } } catch (CoreException e) { From 293d82b8c2b7b606a6d545b775c1825d2c71d8dc Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Wed, 20 May 2020 23:08:13 +0200 Subject: [PATCH 03/26] Read latest JCA ruleset version downloaded during code generation Signed-off-by: Rakshit Krishnappa Ravi --- .../de.cognicrypt.core/src/de/cognicrypt/utils/CrySLUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/de.cognicrypt.core/src/de/cognicrypt/utils/CrySLUtils.java b/plugins/de.cognicrypt.core/src/de/cognicrypt/utils/CrySLUtils.java index cef5e637b..58f71e917 100644 --- a/plugins/de.cognicrypt.core/src/de/cognicrypt/utils/CrySLUtils.java +++ b/plugins/de.cognicrypt.core/src/de/cognicrypt/utils/CrySLUtils.java @@ -60,7 +60,7 @@ protected static List readCrySLRules(String rulesFolder) { public static List readCrySLRules() { return Stream.of(readCrySLRules(Utils.getResourceFromWithin(Constants.RELATIVE_RULES_DIR).getAbsolutePath()), - readCrySLRules(Constants.ECLIPSE_RULES_DIR + Constants.outerFileSeparator + "JavaCryptographicArchitecture")).flatMap(Collection::stream).collect(Collectors.toList()); + readCrySLRules(Constants.JCA_LATEST_ECLIPSE_RULES_DIR)).flatMap(Collection::stream).collect(Collectors.toList()); } /** From 91524197e431583fe5fd451db19b29b66583c87f Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Wed, 3 Jun 2020 13:35:20 +0200 Subject: [PATCH 04/26] Determine exceptions for constructor calls Signed-off-by: Rakshit Krishnappa Ravi --- .../generator/CrySLBasedCodeGenerator.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java index 79aaca110..e67b2164c 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java @@ -11,6 +11,7 @@ package de.cognicrypt.codegenerator.generator; import java.io.IOException; +import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.net.MalformedURLException; import java.security.NoSuchAlgorithmException; @@ -1207,6 +1208,17 @@ public void determineThrownExceptions(String className, String methodName, Class } } } + + Constructor[] constructors = java.lang.Class.forName(className).getConstructors(); + for (Constructor cons: constructors) { + String fullyQualifiedName = cons.getName(); + String consName = Utils.retrieveOnlyClassName(fullyQualifiedName); + if (consName.equals(methodName) && methodParameters.length == cons.getParameterCount()) { + if (matchMethodParameters(methodParameters, cons.getParameterTypes())) { + exceptionClasses.addAll((Collection>) Arrays.asList(cons.getExceptionTypes())); + } + } + } //.getMethod(methodName, methodParameters).getExceptionTypes(); for (Class exception : exceptionClasses) { From cd0c9def712c9d6d31e1b80d460f8a72c1eb6869 Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Wed, 3 Jun 2020 13:37:09 +0200 Subject: [PATCH 05/26] Added method for retrieving simple class name Signed-off-by: Rakshit Krishnappa Ravi --- .../de.cognicrypt.core/src/de/cognicrypt/utils/Utils.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/de.cognicrypt.core/src/de/cognicrypt/utils/Utils.java b/plugins/de.cognicrypt.core/src/de/cognicrypt/utils/Utils.java index 0e88ae6df..b0d83e2d7 100644 --- a/plugins/de.cognicrypt.core/src/de/cognicrypt/utils/Utils.java +++ b/plugins/de.cognicrypt.core/src/de/cognicrypt/utils/Utils.java @@ -299,4 +299,9 @@ public static boolean isSubType(String typeOne, String typeTwo) { } return subTypes; } + + public static String retrieveOnlyClassName(String className) { + String[] values = className.split("\\."); + return values[values.length-1]; + } } From ce64c5b536e6dd3120106ac7dfa83749b3d000c1 Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Wed, 3 Jun 2020 15:15:10 +0200 Subject: [PATCH 06/26] Bug fix Signed-off-by: Rakshit Krishnappa Ravi - fixes null in second primitive parameter of method call --- .../codegenerator/generator/CrySLBasedCodeGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java index e67b2164c..bd3df4017 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java @@ -726,7 +726,7 @@ public Class[] collectParameterTypes(List> parameters) primitiveType = int.class; } methodParameter[i] = primitiveType; - + i++; } else { try { methodParameter[i] = Class.forName(parameter.getValue()); From 63f550d777ca261b8c93fd8e17f64cbbbbcc11e0 Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Wed, 3 Jun 2020 15:15:10 +0200 Subject: [PATCH 07/26] Bug fix Signed-off-by: Rakshit Krishnappa Ravi - without this fix type is null for second primitive parameter of method call --- .../codegenerator/generator/CrySLBasedCodeGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java index e67b2164c..bd3df4017 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java @@ -726,7 +726,7 @@ public Class[] collectParameterTypes(List> parameters) primitiveType = int.class; } methodParameter[i] = primitiveType; - + i++; } else { try { methodParameter[i] = Class.forName(parameter.getValue()); From efce76455a18f938734dd3eb2a36683c2e26b3da Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Wed, 3 Jun 2020 15:23:57 +0200 Subject: [PATCH 08/26] Included getInstance in fetchEnsuringMethod Signed-off-by: Rakshit Krishnappa Ravi - this generates test cases with getInstance method calls --- .../codegenerator/generator/CrySLBasedCodeGenerator.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java index bd3df4017..d24ebaded 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java @@ -655,7 +655,8 @@ private CrySLMethod fetchCorrespondingMethod(Entry par : meth.getParameters()) { From 9be296dc9fe5db77631b1cedf8fbb37360678bd1 Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Wed, 3 Jun 2020 15:31:58 +0200 Subject: [PATCH 09/26] Added addVariablesToBody method Signed-off-by: Rakshit Krishnappa Ravi - used to generate test inputs that are passed as method parameters in generated test cases --- .../generator/GeneratorMethod.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java index 23a5a4085..79ceec50e 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java @@ -88,6 +88,22 @@ public void addStatementToBody(String statement) { } body.append("\n"); } + + public void addVariablesToBody(List> variables) { + for (Entry var : variables) { + String type = var.getValue(); + String name = var.getKey(); + try { + Class.forName(type); + addStatementToBody(type + " " + name + " = null;"); + } catch (ClassNotFoundException e) { + if(type.matches("\\w+\\[\\]")) + addStatementToBody(type + " " + name + " = null;"); + else + addStatementToBody(type + " " + name + " = 0;"); + } + } + } public String getModifier() { return modifier; @@ -190,5 +206,4 @@ public void addPostCGVars(Entry postCGVar) { public List> getPostCGVars() { return postCGVars; } - } From 2adc9dd5343ab66f2938e3a847a8c807726c844e Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Thu, 4 Jun 2020 15:34:47 +0200 Subject: [PATCH 10/26] Updated retrieveOnlyClassName to retrieve interface inside class Signed-off-by: Rakshit Krishnappa Ravi --- plugins/de.cognicrypt.core/src/de/cognicrypt/utils/Utils.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/plugins/de.cognicrypt.core/src/de/cognicrypt/utils/Utils.java b/plugins/de.cognicrypt.core/src/de/cognicrypt/utils/Utils.java index b0d83e2d7..a7e5c8ddb 100644 --- a/plugins/de.cognicrypt.core/src/de/cognicrypt/utils/Utils.java +++ b/plugins/de.cognicrypt.core/src/de/cognicrypt/utils/Utils.java @@ -302,6 +302,8 @@ public static boolean isSubType(String typeOne, String typeTwo) { public static String retrieveOnlyClassName(String className) { String[] values = className.split("\\."); - return values[values.length-1]; + String value = values[values.length-1]; + String[] names = value.split("\\$"); + return names[names.length-1]; } } From 3f8c2d513f3afa7477d5991582e7beaeaf676a05 Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Thu, 4 Jun 2020 15:37:46 +0200 Subject: [PATCH 11/26] Changed type of test inputs to simple Signed-off-by: Rakshit Krishnappa Ravi - such as InputStream instead of java.io.InputStream --- .../codegenerator/generator/GeneratorMethod.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java index 79ceec50e..759b190d5 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java @@ -18,6 +18,8 @@ import java.util.Map.Entry; import java.util.Set; +import de.cognicrypt.utils.Utils; + public class GeneratorMethod { private String modifier; @@ -95,12 +97,14 @@ public void addVariablesToBody(List> variables) { String name = var.getKey(); try { Class.forName(type); - addStatementToBody(type + " " + name + " = null;"); + String simpleType = Utils.retrieveOnlyClassName(type); + addStatementToBody(simpleType + " " + name + " = null;"); } catch (ClassNotFoundException e) { - if(type.matches("\\w+\\[\\]")) + if(type.matches("\\w+\\[\\]")) { addStatementToBody(type + " " + name + " = null;"); - else + } else { addStatementToBody(type + " " + name + " = 0;"); + } } } } From 6982488ec53b0c70e6066b0aababc207adc28139 Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Fri, 5 Jun 2020 10:53:21 +0200 Subject: [PATCH 12/26] Moved addVariablesToBody method to GeneratorTest class Signed-off-by: Rakshit Krishnappa Ravi --- .../generator/GeneratorMethod.java | 18 ------------------ 1 file changed, 18 deletions(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java index 759b190d5..d7848bc57 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java @@ -90,24 +90,6 @@ public void addStatementToBody(String statement) { } body.append("\n"); } - - public void addVariablesToBody(List> variables) { - for (Entry var : variables) { - String type = var.getValue(); - String name = var.getKey(); - try { - Class.forName(type); - String simpleType = Utils.retrieveOnlyClassName(type); - addStatementToBody(simpleType + " " + name + " = null;"); - } catch (ClassNotFoundException e) { - if(type.matches("\\w+\\[\\]")) { - addStatementToBody(type + " " + name + " = null;"); - } else { - addStatementToBody(type + " " + name + " = 0;"); - } - } - } - } public String getModifier() { return modifier; From 9c756486837f1ff046d035617ff743bfb367334e Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Thu, 11 Jun 2020 19:28:05 +0200 Subject: [PATCH 13/26] Changed scope of addAddtionalFile method Signed-off-by: Rakshit Krishnappa Ravi - required by addAdditionalFiles method of TestGenerator --- .../de/cognicrypt/codegenerator/generator/CodeGenerator.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CodeGenerator.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CodeGenerator.java index 56c8aba2b..01b8908fd 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CodeGenerator.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CodeGenerator.java @@ -294,7 +294,7 @@ protected boolean addAdditionalFiles(final String source) { * @throws IOException * @throws CoreException */ - protected boolean addAddtionalFile(final File fileToBeAdded) throws IOException, CoreException { + public boolean addAddtionalFile(final File fileToBeAdded) throws IOException, CoreException { final IFolder libFolder = this.project.getFolder(Constants.pathsForLibrariesInDevProject); if (!libFolder.exists()) { libFolder.create(true, true, null); From 4060058a1bbafff9e000f7e2966cfc13789710cc Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Thu, 11 Jun 2020 19:32:03 +0200 Subject: [PATCH 14/26] Changed the scope of body Signed-off-by: Rakshit Krishnappa Ravi - used in overridden addStatementToBody method of GeneratorTestMethod class --- .../de/cognicrypt/codegenerator/generator/GeneratorMethod.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java index d7848bc57..2cafbc4bf 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java @@ -27,7 +27,7 @@ public class GeneratorMethod { private String name; private List> parameters; private Set exceptions; - private StringBuilder body; + protected StringBuilder body; private List> variableDeclarations; private List> postCGVars; private StringBuilder killStatements; From 362cdfbc60419c63872f730a7ad167be4c5b9f13 Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Thu, 11 Jun 2020 19:35:53 +0200 Subject: [PATCH 15/26] Added return type to imports Signed-off-by: Rakshit Krishnappa Ravi --- .../codegenerator/generator/CrySLBasedCodeGenerator.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java index d24ebaded..b3ad40d14 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java @@ -1178,6 +1178,15 @@ public Collection determineImports(List transitions) { for (TransitionEdge transition : transitions) { String completeMethodName = transition.getLabel().get(0).getMethodName(); imports.add(completeMethodName.substring(0, completeMethodName.lastIndexOf("."))); + String retObjectType = transition.getLabel().get(0).getRetObject().getValue(); + if(retObjectType.contains("[")) + retObjectType = retObjectType.substring(0, retObjectType.indexOf('[')); + try { + java.lang.Class.forName(retObjectType); + imports.add(retObjectType); + } catch(ClassNotFoundException e) { + continue; + } } return imports; } From e84bbbf98fca830b08128bea43d37783f22ba864 Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Thu, 2 Jul 2020 18:32:04 +0200 Subject: [PATCH 16/26] Added getter for killStatements Signed-off-by: Rakshit Krishnappa Ravi --- .../cognicrypt/codegenerator/generator/GeneratorMethod.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java index 2cafbc4bf..40942cc63 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java @@ -192,4 +192,8 @@ public void addPostCGVars(Entry postCGVar) { public List> getPostCGVars() { return postCGVars; } + + public StringBuilder getKillStatements() { + return killStatements; + } } From 3660fa666feef18e0fe6503673a398b24643a080 Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Thu, 2 Jul 2020 18:34:31 +0200 Subject: [PATCH 17/26] Deleted empty.txt - this file isn't used anywhere in the code Signed-off-by: Rakshit Krishnappa Ravi --- plugins/de.cognicrypt.core/resources/CrySLRules/Custom/empty.txt | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 plugins/de.cognicrypt.core/resources/CrySLRules/Custom/empty.txt diff --git a/plugins/de.cognicrypt.core/resources/CrySLRules/Custom/empty.txt b/plugins/de.cognicrypt.core/resources/CrySLRules/Custom/empty.txt deleted file mode 100644 index e69de29bb..000000000 From 81938c3ecba459ccde4cb9caef87674ab7e72f9d Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Thu, 2 Jul 2020 21:33:08 +0200 Subject: [PATCH 18/26] Handle non primitive array type Signed-off-by: Rakshit Krishnappa Ravi - SSL rules have non primitive array objects like String[], javax.net.ssl.KeyManager[] and so on that weren't handled before --- .../codegenerator/generator/CrySLBasedCodeGenerator.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java index b3ad40d14..39fbd258e 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java @@ -730,7 +730,14 @@ public Class[] collectParameterTypes(List> parameters) i++; } else { try { - methodParameter[i] = Class.forName(parameter.getValue()); + if(parameter.getValue().contains("[")) { + String typeName = parameter.getValue().replaceAll("[\\[\\]]",""); + Class className = Class.forName(typeName); + methodParameter[i] = java.lang.reflect.Array.newInstance(className, 0).getClass(); + } + else { + methodParameter[i] = Class.forName(parameter.getValue()); + } i++; } catch (ClassNotFoundException e) { Activator.getDefault().logError(e, "No class found for type: " + parameter.getValue().toString()); From 6fd9d5e383da8c5ef20bada8cc01f505dc1fd109 Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Thu, 2 Jul 2020 23:15:59 +0200 Subject: [PATCH 19/26] Added support for string array constriants Signed-off-by: Rakshit Krishnappa Ravi - Used to generate constraints like protocols, ciphersuites in SSLParameters that are string arrays --- .../codegenerator/generator/CrySLBasedCodeGenerator.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java index 39fbd258e..8f0213aad 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java @@ -946,6 +946,8 @@ public String analyseConstraints(Entry parameter, CodeGenCrySLRu if (!name.isEmpty()) { if ("java.lang.String".equals(parameter.getValue())) { name = "\"" + name + "\""; + } else if ("java.lang.String[]".equals(parameter.getValue())) { + name = "new String[]{\"" + name + "\"}"; } else { ruleParameterCache.putIfAbsent(parameter.getKey(), name); } From b71f66a455d63bba92c523846e4f628e9c1fc63a Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Fri, 10 Jul 2020 16:50:47 +0200 Subject: [PATCH 20/26] Added support for parameters of type BigInteger Signed-off-by: Rakshit Krishnappa Ravi --- .../codegenerator/generator/CrySLBasedCodeGenerator.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java index 8f0213aad..82e0bd967 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java @@ -909,7 +909,7 @@ private Entry>> replaceParameterByValue(CodeG continue; } - String name = analyseConstraints(parameter, rule, methodNamdResultAssignment.substring(methodNamdResultAssignment.lastIndexOf(".") + 1)); + String name = analyseConstraints(parameter, rule, methodNamdResultAssignment.substring(methodNamdResultAssignment.lastIndexOf(".") + 1), imports); if (!name.isEmpty()) { methodParameter = methodParameter.replace(parameter.getKey(), name); continue; @@ -937,7 +937,7 @@ private Entry>> replaceParameterByValue(CodeG * List of constraints that are used for the analysis. * @return */ - public String analyseConstraints(Entry parameter, CodeGenCrySLRule rule, String methodName) { + public String analyseConstraints(Entry parameter, CodeGenCrySLRule rule, String methodName, List imports) { List constraints = rule.getConstraints().stream().filter(e -> e.getInvolvedVarNames().contains(parameter.getKey())).collect(Collectors.toList()); for (ISLConstraint constraint : constraints) { @@ -948,6 +948,9 @@ public String analyseConstraints(Entry parameter, CodeGenCrySLRu name = "\"" + name + "\""; } else if ("java.lang.String[]".equals(parameter.getValue())) { name = "new String[]{\"" + name + "\"}"; + } else if ("java.math.BigInteger".equals(parameter.getValue())) { + name = "BigInteger.valueOf(" + name + ")"; + imports.add("java.math.BigInteger"); } else { ruleParameterCache.putIfAbsent(parameter.getKey(), name); } From 696f2afbd9c96968ee6aa18426366f17f9944dcf Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Wed, 15 Jul 2020 23:20:00 +0200 Subject: [PATCH 21/26] Created getter for parameterCache Signed-off-by: Rakshit Krishnappa Ravi --- .../generator/CrySLBasedCodeGenerator.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java index 82e0bd967..71ab45ccc 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java @@ -91,7 +91,7 @@ public class CrySLBasedCodeGenerator extends CodeGenerator { private static HashMap parameterCache = new HashMap(); public static void clearParameterCache() { - parameterCache.clear(); + getParameterCache().clear(); } private static HashMap ruleParameterCache = new HashMap(); @@ -146,6 +146,10 @@ public void setToBeEnsuredPred(Entry this.toBeEnsuredPred = toBeEnsuredPred; } + public static HashMap getParameterCache() { + return parameterCache; + } + @Override public boolean generateCodeTemplates(Configuration chosenConfig, String pathToFolderWithAdditionalResources) { GeneratorClass ruleClass = null; @@ -904,8 +908,8 @@ private Entry>> replaceParameterByValue(CodeG continue; } - if (parameterCache.containsKey(parameter.getKey())) { - methodParameter = methodParameter.replace(parameter.getKey(), parameterCache.get(parameter.getKey())); + if (getParameterCache().containsKey(parameter.getKey())) { + methodParameter = methodParameter.replace(parameter.getKey(), getParameterCache().get(parameter.getKey())); continue; } @@ -1031,7 +1035,7 @@ private String resolveCrySLConstraint(Entry parameter, ISLConstr default: break; } - parameterCache.putIfAbsent(varName, secureInt); + getParameterCache().putIfAbsent(varName, secureInt); return secureInt; } } else if (constraint instanceof CrySLPredicate && "instanceOf".equals(((CrySLPredicate) constraint).getPredName())) { From 4f01a4b2841064919160222c5799f355eac1a00c Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Fri, 31 Jul 2020 14:30:12 +0200 Subject: [PATCH 22/26] Fix for requiredPars during test generation Signed-off-by: Rakshit Krishnappa Ravi --- .../codegenerator/generator/CrySLBasedCodeGenerator.java | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java index 71ab45ccc..d9760875a 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java @@ -1039,13 +1039,17 @@ private String resolveCrySLConstraint(Entry parameter, ISLConstr return secureInt; } } else if (constraint instanceof CrySLPredicate && "instanceOf".equals(((CrySLPredicate) constraint).getPredName())) { + List instanceOfPred = ((CrySLPredicate) constraint).getParameters(); + if(list != null) { for (CodeGenCrySLObject obj : list) { - List instanceOfPred = ((CrySLPredicate) constraint).getParameters(); if (((CrySLObject) instanceOfPred.get(1)).getVarName().equals(obj.getJavaType()) && obj.getMethod() .equals(findMethodForParameter((CrySLObject) instanceOfPred.get(0)))) { return ((CrySLObject) instanceOfPred.get(0)).getVarName(); } } + } else { + return ((CrySLObject) instanceOfPred.get(0)).getVarName(); + } } else if (constraint instanceof CrySLConstraint) { CrySLConstraint crySLConstraint = (CrySLConstraint) constraint; From 5629ee3e7708a5da024cad2f1a66824efae4c61f Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Wed, 19 Aug 2020 12:44:04 +0200 Subject: [PATCH 23/26] Changed some access modifiers Signed-off-by: Rakshit Krishnappa Ravi - these are used by sub classes in test generator plugin --- .../generator/CrySLBasedCodeGenerator.java | 2 +- .../codegenerator/generator/GeneratorClass.java | 11 +++++------ .../codegenerator/generator/GeneratorMethod.java | 10 +++++----- 3 files changed, 11 insertions(+), 12 deletions(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java index d9760875a..7805a44ee 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/CrySLBasedCodeGenerator.java @@ -96,7 +96,7 @@ public static void clearParameterCache() { private static HashMap ruleParameterCache = new HashMap(); - private static void clearRuleParameterCache() { + public static void clearRuleParameterCache() { ruleParameterCache.clear(); } diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorClass.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorClass.java index 400f3f116..a016c45ce 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorClass.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorClass.java @@ -19,11 +19,11 @@ public class GeneratorClass { - private String packageName; - private Set imports; - private String modifier; - private String className; - private List methods; + protected String packageName; + protected Set imports; + protected String modifier; + protected String className; + protected List methods; private File associatedFile; public GeneratorClass() { @@ -122,5 +122,4 @@ public String toString() { classContent.append("}"); return classContent.toString(); } - } diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java index 40942cc63..b90639d23 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/GeneratorMethod.java @@ -22,13 +22,13 @@ public class GeneratorMethod { - private String modifier; - private String returnType; - private String name; + protected String modifier; + protected String returnType; + protected String name; private List> parameters; - private Set exceptions; + protected Set exceptions; protected StringBuilder body; - private List> variableDeclarations; + protected List> variableDeclarations; private List> postCGVars; private StringBuilder killStatements; private int templateVariables; From 6980b979c1031935bd967cc9594e3fe6c7762f42 Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Wed, 19 Aug 2020 12:46:52 +0200 Subject: [PATCH 24/26] Exporting common.base & collect packages for test generator Signed-off-by: Rakshit Krishnappa Ravi --- plugins/de.cognicrypt.core/META-INF/MANIFEST.MF | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/de.cognicrypt.core/META-INF/MANIFEST.MF b/plugins/de.cognicrypt.core/META-INF/MANIFEST.MF index 627b52f22..cbdfb4690 100644 --- a/plugins/de.cognicrypt.core/META-INF/MANIFEST.MF +++ b/plugins/de.cognicrypt.core/META-INF/MANIFEST.MF @@ -134,6 +134,8 @@ Export-Package: boomerang; com.google.common.collect, sync.pds.solver, wpds.impl", + com.google.common.base, + com.google.common.collect, crypto; uses:="ideal, crypto.rules, From e178cb81645685439715769bb66c7fa4ad584a17 Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Wed, 2 Sep 2020 15:30:01 +0200 Subject: [PATCH 25/26] Changed getTransitions method to handle multiple initial transitions Signed-off-by: Rakshit Krishnappa Ravi - required for SSLParameters crysl rule --- .../generator/StateMachineGraphAnalyser.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/StateMachineGraphAnalyser.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/StateMachineGraphAnalyser.java index f20815ec3..d90770704 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/StateMachineGraphAnalyser.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/StateMachineGraphAnalyser.java @@ -14,7 +14,6 @@ import java.util.List; import crypto.rules.StateMachineGraph; -import crypto.rules.StateNode; import crypto.rules.TransitionEdge; import de.cognicrypt.utils.CrySLUtils; @@ -49,16 +48,13 @@ public ArrayList> getTransitions() throws Exception { List edges = stateMachine.getEdges(); //Collection acceptingNodes = stateMachine.getAcceptingStates(); - TransitionEdge initialTransition = stateMachine.getInitialTransition(); - StateNode initialState = initialTransition.getLeft(); + List initialTransitions = stateMachine.getInitialTransitions(); + for (TransitionEdge initialTransition : initialTransitions) { - if (!initialState.getInit()) { - throw new Exception("No initial state found for state machine!"); - } - - List transitions = new ArrayList(); + List transitions = new ArrayList(); - visitNode(edges, initialTransition, transitions); + visitNode(edges, initialTransition, transitions); + } return allTransitions; } From 63c2c74b92075ccfa958cacca1432aee29d9bfff Mon Sep 17 00:00:00 2001 From: Rakshit Krishnappa Ravi Date: Sun, 20 Sep 2020 14:39:02 +0200 Subject: [PATCH 26/26] Changed some modifiers Signed-off-by: Rakshit Krishnappa Ravi - required by its subclass in testgenerator plugin --- .../generator/StateMachineGraphAnalyser.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/StateMachineGraphAnalyser.java b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/StateMachineGraphAnalyser.java index d90770704..b425b9cd5 100644 --- a/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/StateMachineGraphAnalyser.java +++ b/plugins/de.cognicrypt.codegenerator/src/main/java/de/cognicrypt/codegenerator/generator/StateMachineGraphAnalyser.java @@ -29,9 +29,9 @@ */ public class StateMachineGraphAnalyser { - private StateMachineGraph stateMachine; - private ArrayList usedTransitions = new ArrayList(); - private ArrayList> allTransitions; + protected StateMachineGraph stateMachine; + protected ArrayList usedTransitions = new ArrayList(); + protected ArrayList> allTransitions; public StateMachineGraphAnalyser(StateMachineGraph stateMachine) { this.stateMachine = stateMachine; @@ -41,7 +41,7 @@ public StateMachineGraphAnalyser(StateMachineGraph stateMachine) { // Current solution: Take every loop once. // This solution does not distinguish between the two operates // + and * of the crysl language - public ArrayList> getTransitions() throws Exception { + public ArrayList> getTransitions() { allTransitions = new ArrayList>(); //Collection nodes = stateMachine.getNodes();