diff options
author | dzhioev@google.com <dzhioev@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-16 16:31:17 +0000 |
---|---|---|
committer | dzhioev@google.com <dzhioev@google.com@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-07-16 16:31:17 +0000 |
commit | 80869ec2bb99cc9e99368ae2f281a96c7ebc5a87 (patch) | |
tree | 65dfb11a7b1a920aa680d4f3fc3a59299620f94a | |
parent | a00b3f957a3fe4e2a41aed94635add523aa8cc2d (diff) | |
download | chromium_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.cc | 36 | ||||
-rw-r--r-- | chrome/browser/chromeos/login/hwid_checker_unittest.cc | 98 |
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, ¬_checksum, &checksum)) + return false; + RemoveChars(not_checksum, "-", ¬_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) { |