hwid: Temporary hack for R26 AU checksum check.

This should be removed after R27.

BUG=None
TEST=make lint test

Change-Id: I825821bac3bfd13d3ab86dee5e5e1670fa9097ec
Reviewed-on: https://gerrit.chromium.org/gerrit/44725
Reviewed-by: Shuo-Peng Liao <deanliao@chromium.org>
Commit-Queue: Ricky Liang <jcliang@chromium.org>
Tested-by: Ricky Liang <jcliang@chromium.org>
diff --git a/py/hwid/__init__.py b/py/hwid/__init__.py
index 439f942..bd298a1 100644
--- a/py/hwid/__init__.py
+++ b/py/hwid/__init__.py
@@ -250,7 +250,10 @@
           ...
         ]
   """
-  _HWID_FORMAT = re.compile(r'^([A-Z0-9]+) ((?:[A-Z2-7]{4}-)*[A-Z2-7]{1,4})$')
+  # TODO(jcliang): Change back in R27.
+  #_HWID_FORMAT = re.compile(r'^([A-Z0-9]+) ((?:[A-Z2-7]{4}-)*[A-Z2-7]{1,4})$')
+  _HWID_FORMAT = re.compile(
+      r'^([A-Z0-9]+) ((?:[A-Z2-7]{4}-)*[A-Z2-7]{1,4}) ([0-9]+)$')
 
   def __init__(self, board, encoding_patterns, image_id, pattern,
                encoded_fields, probeable_components, components,
@@ -491,7 +494,10 @@
       HWIDException if verification fails.
     """
     try:
-      board, bom_checksum = Database._HWID_FORMAT.findall(encoded_string)[0]
+      # TODO(jcliang): Change back in R27.
+      #board, bom_checksum = Database._HWID_FORMAT.findall(encoded_string)[0]
+      board, bom_checksum, dummy_checksum = (
+          Database._HWID_FORMAT.findall(encoded_string)[0])
     except IndexError:
       raise HWIDException('Invalid HWID string format: %r' % encoded_string)
     if len(bom_checksum) < 2:
@@ -502,6 +508,9 @@
       raise HWIDException('Invalid board name: %r' % board)
     # Verify the checksum
     stripped = encoded_string.replace('-', '')
+    # TODO(jcliang): Change back in R27.
+    # Remove dummy checksum.
+    stripped = stripped[:-5]
     hwid = stripped[:-2]
     checksum = stripped[-2:]
     if not checksum == Base32.Checksum(hwid):
diff --git a/py/hwid/__init___unittest.py b/py/hwid/__init___unittest.py
index 1aca44c..b04bebd 100755
--- a/py/hwid/__init___unittest.py
+++ b/py/hwid/__init___unittest.py
@@ -54,7 +54,9 @@
     hwid.binary_string = original_value
 
     original_value = hwid.encoded_string
-    hwid.encoded_string = 'ASDF QWER-TY'
+    # TODO(jcliang): Change back in R27.
+    #hwid.encoded_string = 'ASDF QWER-TY'
+    hwid.encoded_string = 'ASDF QWER-TY 1111'
     self.assertRaisesRegexp(
         HWIDException, r'Invalid board name', hwid.VerifySelf)
     hwid.encoded_string = original_value
@@ -256,19 +258,27 @@
 
   def testVerifyEncodedString(self):
     self.assertEquals(
-        None, self.database.VerifyEncodedString('CHROMEBOOK AW3L-M7I7-V'))
+        # TODO(jcliang): Change back in R27.
+        #None, self.database.VerifyEncodedString('CHROMEBOOK AW3L-M7I7-V'))
+        None, self.database.VerifyEncodedString('CHROMEBOOK AW3L-M7I7-V 1111'))
     self.assertRaisesRegexp(
         HWIDException, r'Invalid HWID string format',
         self.database.VerifyEncodedString, 'AW3L-M7I5-4')
     self.assertRaisesRegexp(
         HWIDException, r'Length of encoded string .* is less than 2 characters',
-        self.database.VerifyEncodedString, 'FOO A')
+        # TODO(jcliang): Change back in R27.
+        #self.database.VerifyEncodedString, 'FOO A')
+        self.database.VerifyEncodedString, 'FOO A 1111')
     self.assertRaisesRegexp(
         HWIDException, r'Invalid board name', self.database.VerifyEncodedString,
-        'FOO AW3L-M7IK-W')
+        # TODO(jcliang): Change back in R27.
+        #'FOO AW3L-M7IK-W')
+        'FOO AW3L-M7IK-W 1111')
     self.assertRaisesRegexp(
         HWIDException, r'Checksum of .* mismatch',
-        self.database.VerifyEncodedString, 'CHROMEBOOK AW3L-M7IA-B')
+        # TODO(jcliang): Change back in R27.
+        #self.database.VerifyEncodedString, 'CHROMEBOOK AW3L-M7IA-B')
+        self.database.VerifyEncodedString, 'CHROMEBOOK AW3L-M7IA-B 1111')
 
   def testVerifyBOM(self):
     result = open(os.path.join(_TEST_DATA_PATH,
diff --git a/py/hwid/decoder.py b/py/hwid/decoder.py
index c408dca..754496a 100644
--- a/py/hwid/decoder.py
+++ b/py/hwid/decoder.py
@@ -70,7 +70,9 @@
     A binary string.
   """
   database.VerifyEncodedString(encoded_string)
-  _, hwid_string = encoded_string.split(' ')
+  # TODO(jcliang): Change back in R27.
+  #_, hwid_string = encoded_string.split(' ')
+  _, hwid_string, _ = encoded_string.split(' ')
   hwid_string = hwid_string.replace('-', '')
   # Remove the 10-bit checksum at tail
   hwid_string = hwid_string[0:-2]
diff --git a/py/hwid/decoder_unittest.py b/py/hwid/decoder_unittest.py
index 000d50e..5487156 100755
--- a/py/hwid/decoder_unittest.py
+++ b/py/hwid/decoder_unittest.py
@@ -60,7 +60,9 @@
   def testEncodedStringToBinaryString(self):
     self.assertEquals('00000111010000010100',
                       EncodedStringToBinaryString(
-                          self.database, 'CHROMEBOOK A5AU-LU'))
+                          # TODO(jcliang): Change back in R27.
+                          #self.database, 'CHROMEBOOK A5AU-LU'))
+                          self.database, 'CHROMEBOOK A5AU-LU 3324'))
 
   def testBinaryStringToBOM(self):
     result = open(os.path.join(_TEST_DATA_PATH,
@@ -78,9 +80,13 @@
     result = open(os.path.join(_TEST_DATA_PATH,
                                'test_probe_result.yaml'), 'r').read()
     reference_bom = self.database.ProbeResultToBOM(result)
-    hwid = Decode(self.database, 'CHROMEBOOK A5AU-LU')
+    # TODO(jcliang): Change back in R27.
+    #hwid = Decode(self.database, 'CHROMEBOOK A5AU-LU')
+    hwid = Decode(self.database, 'CHROMEBOOK A5AU-LU 3324')
     self.assertEquals('00000111010000010100', hwid.binary_string)
-    self.assertEquals('CHROMEBOOK A5AU-LU', hwid.encoded_string)
+    # TODO(jcliang): Change back in R27.
+    #self.assertEquals('CHROMEBOOK A5AU-LU', hwid.encoded_string)
+    self.assertEquals('CHROMEBOOK A5AU-LU 3324', hwid.encoded_string)
     self.assertEquals(reference_bom.board, hwid.bom.board)
     self.assertEquals(reference_bom.encoding_pattern_index,
                       hwid.bom.encoding_pattern_index)
diff --git a/py/hwid/encoder.py b/py/hwid/encoder.py
index 266a10e..0558504 100644
--- a/py/hwid/encoder.py
+++ b/py/hwid/encoder.py
@@ -6,7 +6,7 @@
 # found in the LICENSE file.
 
 """Implementation of HWID v3 encoder."""
-
+from zlib import crc32
 import factory_common # pylint: disable=W0611
 
 from cros.factory.hwid import HWID
@@ -60,7 +60,11 @@
   # Insert dashes to increase readibility
   b32_string = (
       '-'.join([b32_string[i:i + 4] for i in xrange(0, len(b32_string), 4)]))
-  return database.board.upper() + ' ' + b32_string
+  # TODO(jcliang): Change back into R27.
+  def DummyChecksum(text):
+    return ('%04u' % (crc32(text) & 0xffffffffL))[-4:]
+  result = database.board.upper() + ' ' + b32_string
+  return result + ' ' + DummyChecksum(result)
 
 
 def Encode(database, bom):
diff --git a/py/hwid/encoder_unittest.py b/py/hwid/encoder_unittest.py
index 28e4948..1a6e2f5 100755
--- a/py/hwid/encoder_unittest.py
+++ b/py/hwid/encoder_unittest.py
@@ -29,7 +29,9 @@
         '00000111010000010100', BOMToBinaryString(self.database, bom))
 
   def testBinaryStringToEncodedString(self):
-    self.assertEquals('CHROMEBOOK A5AU-LU',
+    # TODO(jcliang): Change back in R27.
+    #self.assertEquals('CHROMEBOOK A5AU-LU',
+    self.assertEquals('CHROMEBOOK A5AU-LU 3324',
                       BinaryStringToEncodedString(
                           self.database, '00000111010000010100'))
 
@@ -39,7 +41,9 @@
     bom = self.database.ProbeResultToBOM(result)
     hwid = Encode(self.database, bom)
     self.assertEquals('00000111010000010100', hwid.binary_string)
-    self.assertEquals('CHROMEBOOK A5AU-LU', hwid.encoded_string)
+    # TODO(jcliang): Change back in R27.
+    #self.assertEquals('CHROMEBOOK A5AU-LU', hwid.encoded_string)
+    self.assertEquals('CHROMEBOOK A5AU-LU 3324', hwid.encoded_string)
 
 
 if __name__ == '__main__':