content: package fuzion24.device.vulnerability.vulnerabilities;
  
  
  import android.content.Context;
  import android.util.Log;
  
  import java.util.ArrayList;
  import java.util.List;
  
  import fuzion24.device.vulnerability.util.CPUArch;
  import fuzion24.device.vulnerability.vulnerabilities.framework.graphics.GraphicBufferTest;
  import fuzion24.device.vulnerability.vulnerabilities.framework.media.CVE_2015_6602;
  import fuzion24.device.vulnerability.vulnerabilities.framework.media.CVE_2015_6608;
  import fuzion24.device.vulnerability.vulnerabilities.framework.media.CVE_2015_6616;
  import fuzion24.device.vulnerability.vulnerabilities.framework.media.StageFright;
  import fuzion24.device.vulnerability.vulnerabilities.framework.serialization.OpenSSLTransientBug;
  import fuzion24.device.vulnerability.vulnerabilities.framework.zip.ZipBug8219321;
  import fuzion24.device.vulnerability.vulnerabilities.framework.zip.ZipBug9695860;
  import fuzion24.device.vulnerability.vulnerabilities.framework.zip.ZipBug9950697;
  import fuzion24.device.vulnerability.vulnerabilities.helper.SystemUtils;
  import fuzion24.device.vulnerability.vulnerabilities.kernel.CVE_2011_1149;
  import fuzion24.device.vulnerability.vulnerabilities.kernel.CVE_2013_6282;
  import fuzion24.device.vulnerability.vulnerabilities.kernel.CVE_2014_3153;
  import fuzion24.device.vulnerability.vulnerabilities.kernel.CVE_2014_4943;
  import fuzion24.device.vulnerability.vulnerabilities.kernel.CVE_2015_3636;
  import fuzion24.device.vulnerability.vulnerabilities.system.CVE20151528;
  import fuzion24.device.vulnerability.vulnerabilities.system.CVE20153860;
  import fuzion24.device.vulnerability.vulnerabilities.system.CVE_2016_0807;
  import fuzion24.device.vulnerability.vulnerabilities.system.SamsungCREDzip;
  import fuzion24.device.vulnerability.vulnerabilities.system.WeakSauce;
  
  public class VulnerabilityOrganizer {
  
      private static final String TAG = "VulnerabilityOrganizer";
  
      private VulnerabilityOrganizer() {
      }
  
      //TODO: Maybe add dates to each of these and sort chronologically
      public static List<VulnerabilityTest> getTests(Context ctx){
          List<VulnerabilityTest> allTests = new ArrayList<>();
          allTests.add(new ZipBug9950697());
          allTests.add(new ZipBug8219321());
          allTests.add(new ZipBug9695860());
         // allTests.add(new JarBug13678484());
          allTests.add(new CVE_2013_6282());
          allTests.add(new CVE_2011_1149());
          allTests.add(new CVE_2014_3153());
          allTests.add(new CVE_2014_4943());
          //tests.add(new StumpRoot());
          allTests.add(new WeakSauce());
          allTests.add(new GraphicBufferTest());
          allTests.addAll(StageFright.getTests(ctx));
          allTests.add(new CVE_2015_6602());
          allTests.add(new OpenSSLTransientBug());
          allTests.add(new CVE_2015_3636());
          //tests.add(new ZergRush()); // Hide super old bugs?
          allTests.add(new SamsungCREDzip());
          allTests.add(new CVE_2015_6608());
          allTests.add(new CVE20151528());
          allTests.add(new CVE_2015_6616());
          allTests.add(new CVE20153860());
          allTests.add(new CVE_2016_0807());
  
          List<VulnerabilityTest> filteredTest = new ArrayList<>();
          String cpuArch1 = SystemUtils.propertyGet(ctx, "ro.product.cpu.abi");
          String cpuArch2 = SystemUtils.propertyGet(ctx, "ro.product.cpu.abi2");
  
  
          /*
              The logic here is:
                The test must support every architecture that the device lists
           */
          for(VulnerabilityTest vt : allTests){
  
              if(vt.getSupportedArchitectures() == null) {
                  Log.d(TAG, "architectures is null for : " + vt.getCVEorID());
              }
  
              if(vt.getSupportedArchitectures().contains(CPUArch.ALL)){
                  filteredTest.add(vt);
              } else {
                  if(isArchitectureSupported(vt, cpuArch1) &&
                     isArchitectureSupported(vt, cpuArch2)){
                      filteredTest.add(vt);
                  }
              }
          }
          return filteredTest;
      }
  
      private static boolean isArchitectureSupported(VulnerabilityTest vt, String architecture){
          if(architecture == null || architecture.equals("")) return true;
  
          for(CPUArch arch : vt.getSupportedArchitectures()){
              if(arch.getArch().equals(architecture)){
                  return true;
              }
          }
  
          return false;
      }
  
  }
  