Skip to content

Commit f71e275

Browse files
sritejakvrakshitkr
andcommitted
- Automatic download of the rulesets from the nexus server based on the
url. - Update the rulesets on every eclipse restart. - Integrated with preference page UI and the analysis. Signed-off-by: Sriteja Kummita <sriteja.ku@gmail.com> Co-authored-by: Rakshit Krishnappa Ravi <rakshitkrishnapparavi@gmail.com>
1 parent 6f0a64f commit f71e275

15 files changed

Lines changed: 986 additions & 73 deletions

File tree

plugins/de.cognicrypt.core/META-INF/MANIFEST.MF

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,13 @@ Bundle-RequiredExecutionEnvironment: JavaSE-1.8
1818
Bundle-ActivationPolicy: lazy
1919
Automatic-Module-Name: de.cognicrypt.core
2020
Bundle-ClassPath: .,
21+
lib/aether-api.jar,
22+
lib/aether-connector-basic.jar,
23+
lib/aether-impl.jar,
24+
lib/aether-spi.jar,
25+
lib/aether-transport-file.jar,
26+
lib/aether-transport-http.jar,
27+
lib/aether-util.jar,
2128
lib/animal-sniffer-annotations.jar,
2229
lib/antlr-runtime.jar,
2330
lib/asm-analysis.jar,
@@ -31,6 +38,7 @@ Bundle-ClassPath: .,
3138
lib/commons-cli.jar,
3239
lib/commons-io.jar,
3340
lib/commons-lang3.jar,
41+
lib/commons-logging.jar,
3442
lib/CryptoAnalysis.jar,
3543
lib/dexlib2.jar,
3644
lib/de.darmstadt.tu.crossing.CryptSL.jar,
@@ -40,7 +48,10 @@ Bundle-ClassPath: .,
4048
lib/guava.jar,
4149
lib/hamcrest-core.jar,
4250
lib/heros.jar,
51+
lib/httpclient.jar,
52+
lib/httpcore.jar,
4353
lib/idealPDS.jar,
54+
lib/ini4j.jar,
4455
lib/j2objc-annotations.jar,
4556
lib/jasmin.jar,
4657
lib/java_cup.jar,
@@ -66,7 +77,8 @@ Bundle-ClassPath: .,
6677
lib/synchronizedPDS.jar,
6778
lib/testCore.jar,
6879
lib/WPDS.jar,
69-
lib/xmlpull.jar
80+
lib/xmlpull.jar,
81+
lib/zip4j.jar
7082
Export-Package: boomerang,
7183
boomerang.callgraph,
7284
boomerang.jimple,
@@ -87,6 +99,14 @@ Export-Package: boomerang,
8799
org.eclipse.swt.widgets,
88100
org.eclipse.core.resources,
89101
org.eclipse.jdt.core.search",
102+
net.lingala.zip4j,
103+
net.lingala.zip4j.exception,
104+
org.apache.commons.io,
105+
org.apache.http.client,
106+
org.eclipse.aether,
107+
org.eclipse.aether.transport.file,
108+
org.eclipse.aether.transport.http,
109+
org.ini4j,
90110
soot,
91111
soot.jimple,
92112
soot.jimple.internal,

plugins/de.cognicrypt.core/build.properties

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,16 @@ bin.includes = META-INF/,\
44
.,\
55
resources/,\
66
plugin.xml,\
7+
configuration.ini,\
78
src/,\
89
icons/,\
10+
lib/aether-api.jar,\
11+
lib/aether-connector-basic.jar,\
12+
lib/aether-impl.jar,\
13+
lib/aether-spi.jar,\
14+
lib/aether-transport-file.jar,\
15+
lib/aether-transport-http.jar,\
16+
lib/aether-util.jar,\
917
lib/animal-sniffer-annotations.jar,\
1018
lib/antlr-runtime.jar,\
1119
lib/asm-analysis.jar,\
@@ -19,6 +27,7 @@ bin.includes = META-INF/,\
1927
lib/commons-cli.jar,\
2028
lib/commons-io.jar,\
2129
lib/commons-lang3.jar,\
30+
lib/commons-logging.jar,\
2231
lib/CryptoAnalysis.jar,\
2332
lib/dexlib2.jar,\
2433
lib/de.darmstadt.tu.crossing.CryptSL.jar,\
@@ -28,7 +37,10 @@ bin.includes = META-INF/,\
2837
lib/guava.jar,\
2938
lib/hamcrest-core.jar,\
3039
lib/heros.jar,\
40+
lib/httpclient.jar,\
41+
lib/httpcore.jar,\
3142
lib/idealPDS.jar,\
43+
lib/ini4j.jar,\
3244
lib/j2objc-annotations.jar,\
3345
lib/jasmin.jar,\
3446
lib/java_cup.jar,\
@@ -54,4 +66,5 @@ bin.includes = META-INF/,\
5466
lib/synchronizedPDS.jar,\
5567
lib/testCore.jar,\
5668
lib/WPDS.jar,\
57-
lib/xmlpull.jar
69+
lib/xmlpull.jar,\
70+
lib/zip4j.jar
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[URLS]
2+
NEXUS_SOOT_RELEASE=https://soot-build.cs.uni-paderborn.de/nexus/repository/soot-release
3+
JCA_NEXUS=https://soot-build.cs.uni-paderborn.de/nexus/repository/soot-release/de/darmstadt/tu/crossing/JavaCryptographicArchitecture
4+
BC_NEXUS=https://soot-build.cs.uni-paderborn.de/nexus/repository/soot-release/de/fraunhofer/iem/BouncyCastle
5+
TINK_NEXUS=https://soot-build.cs.uni-paderborn.de/nexus/repository/soot-release/de/darmstadt/tu/crossing/Tink

plugins/de.cognicrypt.core/pom.xml

Lines changed: 60 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -12,13 +12,73 @@
1212
<version>1.0.0-SNAPSHOT</version>
1313
<relativePath>../../pom.xml</relativePath>
1414
</parent>
15+
16+
<properties>
17+
<aetherVersion>1.1.0</aetherVersion>
18+
<mavenVersion>3.3.3</mavenVersion>
19+
</properties>
1520

1621
<dependencies>
1722
<dependency>
1823
<groupId>de.fraunhofer.iem</groupId>
1924
<artifactId>CryptoAnalysis</artifactId>
2025
<version>2.6-SNAPSHOT</version>
2126
</dependency>
27+
<dependency>
28+
<groupId>org.eclipse.aether</groupId>
29+
<artifactId>aether-api</artifactId>
30+
<version>1.1.0</version>
31+
</dependency>
32+
<dependency>
33+
<groupId>org.eclipse.aether</groupId>
34+
<artifactId>aether-spi</artifactId>
35+
<version>${aetherVersion}</version>
36+
</dependency>
37+
<dependency>
38+
<groupId>org.eclipse.aether</groupId>
39+
<artifactId>aether-impl</artifactId>
40+
<version>${aetherVersion}</version>
41+
</dependency>
42+
<dependency>
43+
<groupId>org.eclipse.aether</groupId>
44+
<artifactId>aether-connector-basic</artifactId>
45+
<version>${aetherVersion}</version>
46+
</dependency>
47+
<dependency>
48+
<groupId>org.eclipse.aether</groupId>
49+
<artifactId>aether-transport-file</artifactId>
50+
<version>${aetherVersion}</version>
51+
</dependency>
52+
<dependency>
53+
<groupId>org.eclipse.aether</groupId>
54+
<artifactId>aether-transport-http</artifactId>
55+
<version>${aetherVersion}</version>
56+
</dependency>
57+
<dependency>
58+
<groupId>org.apache.maven</groupId>
59+
<artifactId>maven-aether-provider</artifactId>
60+
<version>${mavenVersion}</version>
61+
</dependency>
62+
<dependency>
63+
<groupId>net.lingala.zip4j</groupId>
64+
<artifactId>zip4j</artifactId>
65+
<version>2.1.1</version>
66+
</dependency>
67+
<dependency>
68+
<groupId>org.apache.httpcomponents</groupId>
69+
<artifactId>httpclient</artifactId>
70+
<version>4.5.9</version>
71+
</dependency>
72+
<dependency>
73+
<groupId>commons-logging</groupId>
74+
<artifactId>commons-logging</artifactId>
75+
<version>1.1.1</version>
76+
</dependency>
77+
<dependency>
78+
<groupId>org.ini4j</groupId>
79+
<artifactId>ini4j</artifactId>
80+
<version>0.5.1</version>
81+
</dependency>
2282
</dependencies>
2383
<build>
2484
<plugins>
@@ -39,47 +99,6 @@
3999
<stripVersion>true</stripVersion>
40100
</configuration>
41101
</execution>
42-
<execution>
43-
<id>unpack</id>
44-
<phase>compile</phase>
45-
<goals>
46-
<goal>unpack</goal>
47-
</goals>
48-
<configuration>
49-
<artifactItems>
50-
<artifactItem>
51-
<groupId>de.darmstadt.tu.crossing</groupId>
52-
<artifactId>JavaCryptographicArchitecture</artifactId>
53-
<version>1.1</version>
54-
<classifier>ruleset</classifier>
55-
<type>zip</type>
56-
<overWrite>true</overWrite>
57-
<outputDirectory>resources/CrySLRules</outputDirectory>
58-
<includes>**</includes>
59-
</artifactItem>
60-
<artifactItem>
61-
<groupId>de.fraunhofer.iem</groupId>
62-
<artifactId>BouncyCastle</artifactId>
63-
<version>0.6</version>
64-
<classifier>ruleset</classifier>
65-
<type>zip</type>
66-
<overWrite>true</overWrite>
67-
<outputDirectory>resources/CrySLRules</outputDirectory>
68-
<includes>**</includes>
69-
</artifactItem>
70-
<artifactItem>
71-
<groupId>de.darmstadt.tu.crossing</groupId>
72-
<artifactId>Tink</artifactId>
73-
<version>0.2</version>
74-
<classifier>ruleset</classifier>
75-
<type>zip</type>
76-
<overWrite>true</overWrite>
77-
<outputDirectory>resources/CrySLRules</outputDirectory>
78-
<includes>**</includes>
79-
</artifactItem>
80-
</artifactItems>
81-
</configuration>
82-
</execution>
83102
</executions>
84103
</plugin>
85104
<plugin>

plugins/de.cognicrypt.core/src/de/cognicrypt/core/Constants.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -522,6 +522,7 @@ public String toString() {
522522
public static final String AUTOMATED_ANALYSIS = "de.cognicrypt.staticanalyzer.automaticAnalysis";
523523
public static final String SHOW_SECURE_OBJECTS = "de.cognicrypt.staticanalyzer.secureObjects";
524524
public static final String CALL_GRAPH_SELECTION = "de.cognicrypt.staticanalyzer.callgraphSelection";
525+
public static final String SELECT_CUSTOM_RULES = "de.cognicrypt.staticanalyzer.selectCustomRules";
525526

526527
public static final String ANALYSE_DEPENDENCIES = "de.cognicrypt.staticanalyzer.dependencyAnalysis";
527528

@@ -563,14 +564,38 @@ public String toString() {
563564

564565
// define a correct ID (get range of possible ones)
565566
public static final int JDT_PROBLEM_ID = 10000000;
566-
public final static String RELATIVE_RULES_DIR = "resources/CrySLRules";
567+
public final static String ECLIPSE_RULES_DIR = System.getProperty("user.dir");
567568
public static final String cryslFileEnding = ".cryptsl";
568569
public static final String cryslEditorID = "de.darmstadt.tu.crossing.CryptSL";
569570
public static final String HEALTHY = "Secure";
570571
public static final String UNHEALTHY = "Insecure";
571572

572573
// define the max java version before which plugin works.
573574
public static final String CC_JAVA_VERSION = "1.8";
575+
576+
public static final String RELATIVE_CUSTOM_RULES_DIR = "resources/CrySLRules/Custom";
577+
578+
//Preference page rules table Constants
579+
public static final String TABLE_HEADER_RULES = "Rules";
580+
public static final String TABLE_HEADER_VERSION = "Version";
581+
public static final String TABLE_HEADER_URL = "URL";
582+
583+
public static final String JCA_TABLE_ITEM = "Java Cryptographic Architecture";
584+
public static final String BC_TABLE_ITEM = "Bouncy Castle";
585+
public static final String TINK_TABLE_ITEM = "Tink";
586+
587+
public static final Double MIN_JCA_RULE_VERSION = 1.1;
588+
public static final Double MIN_BC_RULE_VERSION = 0.6;
589+
public static final Double MIN_TINK_RULE_VERSION = 0.2;
590+
591+
//Configuration.ini keys
592+
public static final String INI_URL_HEADER = "URLS";
593+
public static final String INI_NEXUS_SOOT_RELEASE = "NEXUS_SOOT_RELEASE";
594+
public static final String INI_JCA_NEXUS = "JCA_NEXUS";
595+
public static final String INI_BC_NEXUS = "BC_NEXUS";
596+
public static final String INI_TINK_NEXUS = "TINK_NEXUS";
597+
598+
public final static String CONFIG_FILE_PATH = "configuration.ini";
574599

575600
// path to icons
576601
public final static String COGNICRYPT_ICON_DIR = "icons/cognicrypt-analysis.png";

plugins/de.cognicrypt.core/src/de/cognicrypt/utils/Utils.java

Lines changed: 57 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,13 @@
1212
import java.net.URL;
1313
import java.util.ArrayList;
1414
import java.util.Collection;
15+
import java.util.Comparator;
1516
import java.util.List;
1617
import java.util.OptionalInt;
18+
import java.util.regex.Matcher;
1719
import java.util.stream.Collectors;
1820
import java.util.stream.Stream;
21+
1922
import org.eclipse.core.resources.IContainer;
2023
import org.eclipse.core.resources.IFile;
2124
import org.eclipse.core.resources.IProject;
@@ -49,8 +52,13 @@
4952
import org.eclipse.ui.IWorkbenchWindow;
5053
import org.eclipse.ui.PlatformUI;
5154
import org.eclipse.ui.part.FileEditorInput;
55+
import org.ini4j.InvalidFileFormatException;
56+
import org.ini4j.Wini;
5257
import org.osgi.framework.Bundle;
58+
5359
import com.google.common.base.CharMatcher;
60+
61+
import crypto.analysis.CrySLRulesetSelector.RuleFormat;
5462
import crypto.cryptslhandler.CrySLModelReader;
5563
import crypto.rules.CryptSLRule;
5664
import crypto.rules.CryptSLRuleReader;
@@ -62,7 +70,6 @@
6270
public class Utils {
6371

6472
private static IWorkbenchWindow window = null;
65-
private static String defaultRulesPath = "resources/CrySLRules/JavaCryptographicArchitecture";
6673

6774
/**
6875
* This method checks if a project passed as parameter is a Java project or not.
@@ -325,6 +332,51 @@ public static File getResourceFromWithin(final String inputPath, final String pl
325332

326333
return null;
327334
}
335+
336+
/***
337+
* Returns parsed objects of resources/configuration.ini file.
338+
* @return Wini object
339+
*/
340+
public static Wini getConfig() {
341+
Wini ini = null;
342+
try {
343+
ini = new Wini(getResourceFromWithin(Constants.CONFIG_FILE_PATH));
344+
} catch (InvalidFileFormatException e) {
345+
Activator.getDefault().logError("Could not read the configuration file due to: " + e.getMessage());
346+
} catch (IOException e) {
347+
Activator.getDefault().logError("Failed identifying configuration file due to: " + e.getMessage());
348+
}
349+
return ini;
350+
}
351+
352+
/***
353+
* This method returns all sub-directories in a directory of the first level.
354+
* @param ruleSet JavaCryptographicArchitecture, BouncyCastle, Tink
355+
* @return array of version numbers
356+
*/
357+
public static String[] getRuleVersions(String ruleSet){
358+
List<String> versions = new ArrayList<String>();
359+
File path = new File(System.getProperty("user.dir") + File.separator + ruleSet);
360+
File[] innerDirs = path.listFiles();
361+
for (File f: innerDirs) {
362+
if (f.isDirectory()) {
363+
String[] versionNumber = f.getPath().split(Matcher.quoteReplacement(System.getProperty("file.separator")));
364+
versions.add(versionNumber[versionNumber.length - 1]);
365+
}
366+
}
367+
368+
versions.sort(new Comparator<String>() {
369+
@Override
370+
public int compare(String o1, String o2) {
371+
Double one = Double.valueOf(o1);
372+
Double two = Double.valueOf(o2);
373+
return one.compareTo(two);
374+
}
375+
});
376+
377+
// https://shipilev.net/blog/2016/arrays-wisdom-ancients/
378+
return versions.toArray(new String[0]);
379+
}
328380

329381
protected static void setWindow(final IWorkbenchWindow activeWorkbenchWindow) {
330382
Utils.window = activeWorkbenchWindow;
@@ -351,16 +403,16 @@ public static int getFirstIndexofUCL(final String searchString) {
351403
* @throws MalformedURLException
352404
*/
353405
public static CryptSLRule getCryptSLRule(String cryptslRule) throws MalformedURLException {
354-
File ruleRes = Utils.getResourceFromWithin(Constants.RELATIVE_RULES_DIR + "/" + cryptslRule + ".cryptsl", de.cognicrypt.core.Activator.PLUGIN_ID);
406+
File ruleRes = Utils.getResourceFromWithin(Constants.RELATIVE_CUSTOM_RULES_DIR + "/" + cryptslRule + RuleFormat.SOURCE.toString(), de.cognicrypt.core.Activator.PLUGIN_ID);
355407
if (ruleRes == null || !ruleRes.exists() || !ruleRes.canRead()) {
356-
ruleRes = Utils.getResourceFromWithin(defaultRulesPath + "/" + cryptslRule + ".cryptsl", de.cognicrypt.core.Activator.PLUGIN_ID);
408+
ruleRes = Utils.getResourceFromWithin(Constants.RELATIVE_CUSTOM_RULES_DIR + "/" + cryptslRule + RuleFormat.SOURCE.toString(), de.cognicrypt.core.Activator.PLUGIN_ID);
357409
}
358410
return (new CrySLModelReader()).readRule(ruleRes);
359411
}
360412

361413
public static List<CryptSLRule> readCrySLRules() {
362-
return Stream.of(readCrySLRules(Utils.getResourceFromWithin(Constants.RELATIVE_RULES_DIR).getAbsolutePath()),
363-
readCrySLRules(Utils.getResourceFromWithin(defaultRulesPath).getAbsolutePath())).flatMap(Collection::stream).collect(Collectors.toList());
414+
return Stream.of(readCrySLRules(Utils.getResourceFromWithin(Constants.RELATIVE_CUSTOM_RULES_DIR).getAbsolutePath()),
415+
readCrySLRules(Utils.getResourceFromWithin(Constants.RELATIVE_CUSTOM_RULES_DIR).getAbsolutePath())).flatMap(Collection::stream).collect(Collectors.toList());
364416
}
365417

366418
protected static List<CryptSLRule> readCrySLRules(String rulesFolder) {

0 commit comments

Comments
 (0)