summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordzhioev@google.com <dzhioev@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-16 16:31:17 +0000
committerdzhioev@google.com <dzhioev@google.com@0039d316-1c4b-4281-b951-d872f2087c98>2013-07-16 16:31:17 +0000
commit80869ec2bb99cc9e99368ae2f281a96c7ebc5a87 (patch)
tree65dfb11a7b1a920aa680d4f3fc3a59299620f94a
parenta00b3f957a3fe4e2a41aed94635add523aa8cc2d (diff)
downloadchromium_src-80869ec2bb99cc9e99368ae2f281a96c7ebc5a87.zip
chromium_src-80869ec2bb99cc9e99368ae2f281a96c7ebc5a87.tar.gz
chromium_src-80869ec2bb99cc9e99368ae2f281a96c7ebc5a87.tar.bz2
Merge 210597 "Added support of new format of HWID v3."
> Added support of new format of HWID v3. > > BUG=174689 > TEST='unit_tests --gtest_filter=HWIDCheckerTest*' > > Review URL: https://chromiumcodereview.appspot.com/18690007 TBR=dzhioev@chromium.org Review URL: https://codereview.chromium.org/19394002 git-svn-id: svn://svn.chromium.org/chrome/branches/1500/src@211800 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--chrome/browser/chromeos/login/hwid_checker.cc36
-rw-r--r--chrome/browser/chromeos/login/hwid_checker_unittest.cc98
2 files changed, 107 insertions, 27 deletions
diff --git a/chrome/browser/chromeos/login/hwid_checker.cc b/chrome/browser/chromeos/login/hwid_checker.cc
index 3552891..89621bd 100644
--- a/chrome/browser/chromeos/login/hwid_checker.cc
+++ b/chrome/browser/chromeos/login/hwid_checker.cc
@@ -42,7 +42,11 @@ bool IsCorrectHWIDv2(const std::string& hwid) {
return CalculateHWIDv2Checksum(body) == checksum;
}
-std::string CalculateHWIDv3Checksum(const std::string& data) {
+bool IsExceptionalHWID(const std::string& hwid) {
+ return RE2::PartialMatch(hwid, "^(SPRING [A-D])|(FALCO A)");
+}
+
+std::string CalculateExceptionalHWIDChecksum(const std::string& data) {
static const char base32_alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
unsigned crc32 = CalculateCRC32(data);
// We take 10 least significant bits of CRC-32 and encode them in 2 characters
@@ -53,7 +57,9 @@ std::string CalculateHWIDv3Checksum(const std::string& data) {
return checksum;
}
-bool IsCorrectHWIDv3(const std::string& hwid) {
+bool IsCorrectExceptionalHWID(const std::string& hwid) {
+ if (!IsExceptionalHWID(hwid))
+ return false;
std::string bom;
if (!RE2::FullMatch(hwid, "[A-Z0-9]+ ((?:[A-Z2-7]{4}-)*[A-Z2-7]{1,4})", &bom))
return false;
@@ -66,6 +72,29 @@ bool IsCorrectHWIDv3(const std::string& hwid) {
hwid_without_dashes.substr(0, hwid_without_dashes.length() - 2);
std::string checksum =
hwid_without_dashes.substr(hwid_without_dashes.length() - 2);
+ return CalculateExceptionalHWIDChecksum(not_checksum) == checksum;
+}
+
+std::string CalculateHWIDv3Checksum(const std::string& data) {
+ static const char base8_alphabet[] = "23456789";
+ static const char base32_alphabet[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ234567";
+ unsigned crc32 = CalculateCRC32(data);
+ // We take 8 least significant bits of CRC-32 and encode them in 2 characters.
+ std::string checksum;
+ checksum += base8_alphabet[(crc32 >> 5) & 0x7];
+ checksum += base32_alphabet[crc32 & 0x1f];
+ return checksum;
+}
+
+bool IsCorrectHWIDv3(const std::string& hwid) {
+ if (IsExceptionalHWID(hwid))
+ return false;
+ std::string regex =
+ "([A-Z0-9]+ (?:[A-Z2-7][2-9][A-Z2-7]-)*[A-Z2-7])([2-9][A-Z2-7])";
+ std::string not_checksum, checksum;
+ if (!RE2::FullMatch(hwid, regex, &not_checksum, &checksum))
+ return false;
+ RemoveChars(not_checksum, "-", &not_checksum);
return CalculateHWIDv3Checksum(not_checksum) == checksum;
}
@@ -74,7 +103,8 @@ bool IsCorrectHWIDv3(const std::string& hwid) {
namespace chromeos {
bool IsHWIDCorrect(const std::string& hwid) {
- return IsCorrectHWIDv2(hwid) || IsCorrectHWIDv3(hwid);
+ return IsCorrectHWIDv2(hwid) || IsCorrectExceptionalHWID(hwid) ||
+ IsCorrectHWIDv3(hwid);
}
bool IsMachineHWIDCorrect() {
diff --git a/chrome/browser/chromeos/login/hwid_checker_unittest.cc b/chrome/browser/chromeos/login/hwid_checker_unittest.cc
index b7491b5..9de664b 100644
--- a/chrome/browser/chromeos/login/hwid_checker_unittest.cc
+++ b/chrome/browser/chromeos/login/hwid_checker_unittest.cc
@@ -21,45 +21,95 @@ TEST(HWIDCheckerTest, HWIDv2) {
EXPECT_FALSE(IsHWIDCorrect("SOME DATA7861"));
}
-TEST(HWIDCheckerTest, HWIDv3) {
- EXPECT_TRUE(IsHWIDCorrect("SPRING 3A7N-BJKZ-F"));
- EXPECT_TRUE(IsHWIDCorrect("SPRING 3A7N-BJKK-HB"));
- EXPECT_TRUE(IsHWIDCorrect("SPRING 3A7N-BJKK-EHU"));
- EXPECT_TRUE(IsHWIDCorrect("SPRING 3A7N-BJKK-MGG"));
- EXPECT_TRUE(IsHWIDCorrect("SPRING 3A7N-BJKK-M4RF"));
+TEST(HWIDCheckerTest, ExceptionalHWID) {
+ EXPECT_TRUE(IsHWIDCorrect("SPRING A7N3-BJKQ-E"));
+ EXPECT_TRUE(IsHWIDCorrect("SPRING A7N3-BJKK-3K"));
+ EXPECT_TRUE(IsHWIDCorrect("SPRING A7N3-BJKK-2GI"));
+ EXPECT_TRUE(IsHWIDCorrect("SPRING A7N3-BJKK-2MRO"));
+ EXPECT_TRUE(IsHWIDCorrect("SPRING A7N3-BJKK-2MDG-V"));
+ EXPECT_TRUE(IsHWIDCorrect("SPRING DAKB-NM"));
+ EXPECT_TRUE(IsHWIDCorrect("FALCO APOM-3"));
+
+ // Not exceptions.
+ EXPECT_FALSE(IsHWIDCorrect("SPRING 3A7N-BJKZ-F"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING LA7N-BJK7-H"));
+ EXPECT_FALSE(IsHWIDCorrect("FALCO BPO6-C"));
// Degenerate cases.
EXPECT_FALSE(IsHWIDCorrect("SPRING"));
EXPECT_FALSE(IsHWIDCorrect("SPRING "));
EXPECT_FALSE(IsHWIDCorrect("SPRING KD"));
- EXPECT_TRUE(IsHWIDCorrect("SPRING T7"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING T7"));
+
+ // No board name.
+ EXPECT_FALSE(IsHWIDCorrect(" CA7N-BJKV-T"));
+ EXPECT_FALSE(IsHWIDCorrect("CA7N-BJKH-S"));
+
+ // Excess fields.
+ EXPECT_FALSE(IsHWIDCorrect("SPRING WINTER CA7N-BJK7-T"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING CA7N-BJKN-D WINTER"));
+
+ // Incorrect BOM format.
+ EXPECT_FALSE(IsHWIDCorrect("SPRING CA7-NBJK-YO"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING CA-7NBJ-KYO"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING -CA7N-BJKY-O"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING CA7N-BJKK-FS-UN"));
+
+ // Incorrect characters.
+ EXPECT_FALSE(IsHWIDCorrect("SPRING CA9N-BJKL-P"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING CA7N-B0KT-S"));
+ EXPECT_FALSE(IsHWIDCorrect("SPrING CA7N-BJKH-W"));
+
+ // Random changes.
+ EXPECT_FALSE(IsHWIDCorrect("SPRUNG CA7N-BJKY-O"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING CA7N-8JKY-O"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING CA7N-BJSY-O"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRINGS CA7N-BJKY-O"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING CA7N-BJKM-L"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRINGXCA7N-BJKZ-F"));
+}
+
+TEST(HWIDCheckerTest, HWIDv3) {
+ EXPECT_TRUE(IsHWIDCorrect("SPRING E2B-C3D-E8X"));
+ EXPECT_TRUE(IsHWIDCorrect("SPRING E2B-C3D-E8X-D8J"));
+ EXPECT_TRUE(IsHWIDCorrect("FALCO B67-36Y"));
+
+ // Exceptions.
+ EXPECT_FALSE(IsHWIDCorrect("SPRING D2B-C3D-E5D"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING A2B-C3D-E8X-D7T"));
+ EXPECT_FALSE(IsHWIDCorrect("FALCO A67-35W"));
+
+ // Degenerate cases.
+ EXPECT_FALSE(IsHWIDCorrect("SPRING"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING "));
+ EXPECT_TRUE(IsHWIDCorrect("SPRING Z34"));
// No board name.
- EXPECT_FALSE(IsHWIDCorrect(" 3A7N-BJKU-Y"));
- EXPECT_FALSE(IsHWIDCorrect("3A7N-BJKG-Z"));
+ EXPECT_FALSE(IsHWIDCorrect(" C7N-J3V-T4J"));
+ EXPECT_FALSE(IsHWIDCorrect("C7N-J3V-T2I"));
// Excess fields.
- EXPECT_FALSE(IsHWIDCorrect("SPRING WINTER 3A7N-BJK6-Y"));
- EXPECT_FALSE(IsHWIDCorrect("SPRING 3A7N-BJKX-G WINTER"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING WINTER E2B-C3D-E3K"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING E2B-C3D-E72 WINTER"));
// Incorrect BOM format.
- EXPECT_FALSE(IsHWIDCorrect("SPRING 3A7-NBJK-ZF"));
- EXPECT_FALSE(IsHWIDCorrect("SPRING 3A-7NBJ-KZF"));
- EXPECT_FALSE(IsHWIDCorrect("SPRING -3A7N-BJKZ-F"));
- EXPECT_FALSE(IsHWIDCorrect("SPRING 3A7N-BJKK-FSYV-"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING E2BC3D-E8X"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING E2-B-C3D-E8X"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING E2B-C3D-E8X-"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING E2B-C3D-E85-Y"));
// Incorrect characters.
- EXPECT_FALSE(IsHWIDCorrect("SPRING 3A9N-BJKK-E"));
- EXPECT_FALSE(IsHWIDCorrect("SPRING 3A7N-B0KS-Z"));
- EXPECT_FALSE(IsHWIDCorrect("SPrING 3A7N-BJKG-5"));
+ EXPECT_FALSE(IsHWIDCorrect("SPrING E2B-C3D-E3P"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING EAB-C3D-E7Y"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING E2B-C1D-E3W"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING E28-C3D-E7Z"));
// Random changes.
- EXPECT_FALSE(IsHWIDCorrect("SPRUNG 3A7N-BJKZ-F"));
- EXPECT_FALSE(IsHWIDCorrect("SPRING 3A7N-8JKZ-F"));
- EXPECT_FALSE(IsHWIDCorrect("SPRING 3A7N-BJSZ-F"));
- EXPECT_FALSE(IsHWIDCorrect("SPRINGS 3A7N-BJKZ-F"));
- EXPECT_FALSE(IsHWIDCorrect("SPRING 3A7N-BJKK-L"));
- EXPECT_FALSE(IsHWIDCorrect("SPRINGX3A7N-BJKZ-F"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING E2L-C3D-E8X"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING E2B-C3D-X8X"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRINGZE2B-C3D-E8X"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRMNG E2B-C3D-E8X"));
+ EXPECT_FALSE(IsHWIDCorrect("SPRING E2B-C3D-EIX"));
}
TEST(HWIDCheckerTest, KnownHWIDs) {