diff --git a/CoreLibs/ivy.xml b/CoreLibs/ivy.xml
index bfd9112f9e..24634d90f1 100755
--- a/CoreLibs/ivy.xml
+++ b/CoreLibs/ivy.xml
@@ -16,7 +16,7 @@
-
+
diff --git a/CoreLibs/nbproject/project.properties b/CoreLibs/nbproject/project.properties
index 13a62b62ee..da8749c100 100755
--- a/CoreLibs/nbproject/project.properties
+++ b/CoreLibs/nbproject/project.properties
@@ -24,7 +24,7 @@ file.reference.dom4j-1.6.1.jar=release/modules/ext/dom4j-1.6.1.jar
file.reference.geronimo-jms_1.1_spec-1.0.jar=release/modules/ext/geronimo-jms_1.1_spec-1.0.jar
file.reference.gson-1.4.jar=release/modules/ext/gson-1.4.jar
file.reference.gstreamer-java-1.5.jar=release/modules/ext/gstreamer-java-1.5.jar
-file.reference.guava-19.0.jar=release/modules/ext/guava-19.0.jar
+file.reference.guava-21.0.jar=release/modules/ext/guava-21.0.jar
file.reference.imageio-bmp-3.2.jar=release/modules/ext/imageio-bmp-3.2.jar
file.reference.imageio-core-3.2.jar=release/modules/ext/imageio-core-3.2.jar
file.reference.imageio-icns-3.2.jar=release/modules/ext/imageio-icns-3.2.jar
@@ -78,7 +78,6 @@ javadoc.reference.commons-csv-1.4.jar=release/modules/ext/commons-csv-1.4-javado
javadoc.reference.commons-io-2.5.jar=release/modules/ext/commons-io-2.5-javadoc.jar
javadoc.reference.compiler-0.9.1.jar=release/modules/ext/compiler-0.9.1-javadoc.jar
javadoc.reference.controlsfx-8.40.11.jar=release/modules/ext/controlsfx-8.40.11-javadoc.jar
-javadoc.reference.guava-19.0.jar=release/modules/ext/guava-19.0-javadoc.jar
javadoc.reference.jfxtras-common-8.0-r4.jar=release/modules/ext/jfxtras-common-8.0-r4-javadoc.jar
javadoc.reference.jfxtras-controls-8.0-r4.jar=release/modules/ext/jfxtras-controls-8.0-r4-javadoc.jar
javadoc.reference.jfxtras-fxml-8.0-r4.jar=release/modules/ext/jfxtras-fxml-8.0-r4-javadoc.jar
@@ -87,7 +86,6 @@ source.reference.commons-csv-1.4.jar=release/modules/ext/commons-csv-1.4-sources
source.reference.commons-io-2.5.jar=release/modules/ext/commons-io-2.5-sources.jar
source.reference.compiler-0.9.1.jar=release/modules/ext/compiler-0.9.1-sources.jar
source.reference.controlsfx-8.40.11.jar=release/modules/ext/controlsfx-8.40.11-sources.jar
-source.reference.guava-19.0.jar=release/modules/ext/guava-19.0-sources.jar
source.reference.jfxtras-common-8.0-r4.jar=release/modules/ext/jfxtras-common-8.0-r4-sources.jar
source.reference.jfxtras-controls-8.0-r4.jar=release/modules/ext/jfxtras-controls-8.0-r4-sources.jar
source.reference.jfxtras-fxml-8.0-r4.jar=release/modules/ext/jfxtras-fxml-8.0-r4-sources.jar
diff --git a/CoreLibs/nbproject/project.xml b/CoreLibs/nbproject/project.xml
index 6fcef46ccd..f3c852d11c 100755
--- a/CoreLibs/nbproject/project.xml
+++ b/CoreLibs/nbproject/project.xml
@@ -848,8 +848,8 @@
release/modules/ext/slf4j-simple-1.6.1.jar
- ext/guava-19.0.jar
- release/modules/ext/guava-19.0.jar
+ ext/guava-21.0.jar
+ release/modules/ext/guava-21.0.jar
ext/commons-io-2.5.jar
diff --git a/KeywordSearch/ivy.xml b/KeywordSearch/ivy.xml
index 3ceb4e6378..6f810feddc 100755
--- a/KeywordSearch/ivy.xml
+++ b/KeywordSearch/ivy.xml
@@ -14,6 +14,8 @@
+
+
diff --git a/KeywordSearch/nbproject/project.properties b/KeywordSearch/nbproject/project.properties
index 5aa1b716e0..07273eea69 100755
--- a/KeywordSearch/nbproject/project.properties
+++ b/KeywordSearch/nbproject/project.properties
@@ -42,7 +42,7 @@ file.reference.fontbox-2.0.3.jar=release/modules/ext/fontbox-2.0.3.jar
file.reference.geoapi-3.0.0.jar=release/modules/ext/geoapi-3.0.0.jar
file.reference.grib-4.5.5.jar=release/modules/ext/grib-4.5.5.jar
file.reference.gson-2.2.4.jar=release/modules/ext/gson-2.2.4.jar
-file.reference.guava-17.0.jar=release/modules/ext/guava-17.0.jar
+file.reference.guava-21.0.jar=release/modules/ext/guava-21.0.jar
file.reference.hamcrest-core-1.3.jar=release/modules/ext/hamcrest-core-1.3.jar
file.reference.httpclient-4.3.1.jar=release/modules/ext/httpclient-4.3.1.jar
file.reference.httpcore-4.3.jar=release/modules/ext/httpcore-4.3.jar
diff --git a/KeywordSearch/nbproject/project.xml b/KeywordSearch/nbproject/project.xml
index d375e76868..8a5e7213e0 100755
--- a/KeywordSearch/nbproject/project.xml
+++ b/KeywordSearch/nbproject/project.xml
@@ -213,10 +213,6 @@
ext/slf4j-api-1.7.12.jar
release/modules/ext/slf4j-api-1.7.12.jar
-
- ext/guava-17.0.jar
- release/modules/ext/guava-17.0.jar
-
ext/opennlp-maxent-3.0.3.jar
release/modules/ext/opennlp-maxent-3.0.3.jar
@@ -677,6 +673,10 @@
ext/sis-storage-0.6.jar
release/modules/ext/sis-storage-0.6.jar
+
+ ext/guava-21.0.jar
+ ext/guava-21.0.jar
+
ext/jcip-annotations-1.0.jar
release/modules/ext/jcip-annotations-1.0.jar
diff --git a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/CreditCardValidator.java b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/CreditCardValidator.java
index baa8c17c44..2b49e7ff9d 100644
--- a/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/CreditCardValidator.java
+++ b/KeywordSearch/src/org/sleuthkit/autopsy/keywordsearch/CreditCardValidator.java
@@ -19,6 +19,11 @@
package org.sleuthkit.autopsy.keywordsearch;
import com.google.common.base.CharMatcher;
+import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Range;
+import com.google.common.collect.RangeMap;
+import com.google.common.collect.TreeRangeMap;
+import java.util.Set;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.validator.routines.checkdigit.LuhnCheckDigit;
@@ -42,6 +47,73 @@ final class CreditCardValidator {
private static final LuhnCheckDigit CREDIT_CARD_NUM_LUHN_CHECK = new LuhnCheckDigit();
+ /**
+ * map from ccn IIN to allowed lengths
+ */
+ static private final RangeMap> allowedLengths = TreeRangeMap.create();
+ private static final ImmutableSet Set12to19 = ImmutableSet.of(12, 13, 14, 15, 16, 17, 18, 19);
+ private static final ImmutableSet Set14to19 = ImmutableSet.of(14, 15, 16, 17, 18, 19);
+ private static final ImmutableSet Set16to19 = ImmutableSet.of(16, 17, 18, 29);
+
+ static {
+ //amex
+ allowedLengths.put(Range.closedOpen(34000000, 35000000), ImmutableSet.of(15));
+ allowedLengths.put(Range.closedOpen(37000000, 38000000), ImmutableSet.of(15));
+
+ //visa
+ allowedLengths.put(Range.closedOpen(40000000, 50000000), Set12to19);
+
+ //visa electron
+ allowedLengths.put(Range.closedOpen(40260000, 40270000), ImmutableSet.of(16));
+ allowedLengths.put(Range.closedOpen(41750000, 41750100), ImmutableSet.of(16));
+ allowedLengths.put(Range.closedOpen(44050000, 44060000), ImmutableSet.of(16));
+ allowedLengths.put(Range.closedOpen(45080000, 45090000), ImmutableSet.of(16));
+ allowedLengths.put(Range.closedOpen(48440000, 48450000), ImmutableSet.of(16));
+ allowedLengths.put(Range.closedOpen(49130000, 49140000), ImmutableSet.of(16));
+ allowedLengths.put(Range.closedOpen(49170000, 49180000), ImmutableSet.of(16));
+
+ //China UnionPay
+ allowedLengths.put(Range.closedOpen(62000000, 63000000), Set16to19);
+
+ //MasterCard
+ allowedLengths.put(Range.closedOpen(51000000, 56000000), ImmutableSet.of(16));
+ allowedLengths.put(Range.closedOpen(22210000, 27210000), ImmutableSet.of(16));
+
+ //Verve, these over lap with discover
+ allowedLengths.put(Range.closedOpen(50609900, 50619900), ImmutableSet.of(16, 19));
+ allowedLengths.put(Range.closedOpen(65000200, 65002700), ImmutableSet.of(16, 19));
+
+ //Maestro
+ allowedLengths.put(Range.closedOpen(50000000, 50100000), Set12to19);
+ allowedLengths.put(Range.closedOpen(56000000, 59000000), Set12to19);
+ allowedLengths.put(Range.closedOpen(60000000, 70000000), Set12to19);
+ allowedLengths.put(Range.closedOpen(63900000, 63910000), Set12to19);
+ allowedLengths.put(Range.closedOpen(67000000, 68000000), Set12to19);
+
+ //Diners Club International (processed by discover
+ allowedLengths.put(Range.closedOpen(30000000, 30600000), Set16to19);
+ allowedLengths.put(Range.closedOpen(30950000, 30960000), Set16to19);
+ allowedLengths.put(Range.closedOpen(36000000, 37000000), Set14to19);
+ allowedLengths.put(Range.closedOpen(38000000, 40000000), Set16to19);
+
+ //Diners Club USA & Canada (MasterCard co brand)
+ allowedLengths.put(Range.closedOpen(54000000, 56000000), Set14to19);
+
+ //Discover
+ allowedLengths.put(Range.closedOpen(60110000, 60120000), Set16to19);
+ allowedLengths.put(Range.closedOpen(62212600, 62292600), Set16to19);
+ allowedLengths.put(Range.closedOpen(64400000, 66000000), Set16to19);
+
+ //JCB //process by discover
+ allowedLengths.put(Range.closedOpen(35280000, 35900000), Set16to19);
+
+ //Dankort
+ allowedLengths.put(Range.closedOpen(50190000, 50200000), Set16to19);
+
+ //InterPayment
+ allowedLengths.put(Range.closedOpen(63600000, 63700000), Set16to19);
+ }
+
/**
* Does the given string represent a valid credit card number? It must have
* no separators, or only '-', or only ' '. Checks digit grouping for
@@ -79,6 +151,10 @@ final class CreditCardValidator {
splitCCN = new String[]{cannonicalCCN};
}
+ if (false == lengthMatchesBin(cannonicalCCN)) {
+ return false;
+ }
+
// validate digit grouping for 15, 16, and 19 digit cards
switch (cannonicalCCN.length()) {
case 15:
@@ -105,6 +181,12 @@ final class CreditCardValidator {
return CREDIT_CARD_NUM_LUHN_CHECK.isValid(cannonicalCCN);
}
+ private boolean lengthMatchesBin(String cannonicalCCN) {
+ String BIN = cannonicalCCN.substring(0, 8);
+ final Set lengthsForBIN = allowedLengths.get(Integer.valueOf(BIN));
+ return null == lengthsForBIN || lengthsForBIN.contains(cannonicalCCN.length());
+ }
+
static private boolean isValidOtherDigitGrouping(String[] splitCCN) {
if (splitCCN.length == 1) {
return true;
diff --git a/KeywordSearch/test/unit/src/org/sleuthkit/autopsy/keywordsearch/CreditCardValidatorTest.java b/KeywordSearch/test/unit/src/org/sleuthkit/autopsy/keywordsearch/CreditCardValidatorTest.java
index 637be8b3ae..fd7a56c39b 100644
--- a/KeywordSearch/test/unit/src/org/sleuthkit/autopsy/keywordsearch/CreditCardValidatorTest.java
+++ b/KeywordSearch/test/unit/src/org/sleuthkit/autopsy/keywordsearch/CreditCardValidatorTest.java
@@ -46,6 +46,18 @@ public class CreditCardValidatorTest {
public void tearDown() {
}
+ @Test
+ public void testLengthMatchesBin(){
+ System.out.println("lengthMatchesBin");
+ CreditCardValidator validator = new CreditCardValidator();
+
+ //amex must be 15
+ assertEquals(true, validator.isValidCCN("3431 136294 58529"));
+ assertEquals(false, validator.isValidCCN("3431-136294-5850"));
+ assertEquals(false, validator.isValidCCN("34311362945850"));
+ assertEquals(false, validator.isValidCCN("3431 1362 9458 5034"));
+ }
+
/**
* Test of isValidCCN method, of class CreditCardValidator.
*/
@@ -187,4 +199,6 @@ public class CreditCardValidatorTest {
assertEquals(false, CreditCardValidator.isValidCCN("123 456789031")); //grouping
assertEquals(false, CreditCardValidator.isValidCCN("1234-56789 031")); //separators
}
+
+
}