paygen_payload_lib: use binary mode in more places

There's a few APIs in here that read binary data, so make sure we
use mode='b' for them.  This is also enough to get the tests passing
under Python 3, so add it to the list.

BUG=chromium:997354
TEST=`./run_tests` passes

Change-Id: Ib27fe0586a261b5d2a8ed011803241c92f42d4ff
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/chromite/+/1851185
Reviewed-by: Amin Hassani <ahassani@chromium.org>
Tested-by: Mike Frysinger <vapier@chromium.org>
Commit-Queue: Mike Frysinger <vapier@chromium.org>
diff --git a/lib/paygen/paygen_payload_lib.py b/lib/paygen/paygen_payload_lib.py
index 4fe9367..07b0414 100644
--- a/lib/paygen/paygen_payload_lib.py
+++ b/lib/paygen/paygen_payload_lib.py
@@ -554,8 +554,8 @@
 
     self._RunGeneratorCmd(cmd)
 
-    return (osutils.ReadFile(self.payload_hash_file),
-            osutils.ReadFile(self.metadata_hash_file))
+    return (osutils.ReadFile(self.payload_hash_file, mode='rb'),
+            osutils.ReadFile(self.metadata_hash_file, mode='rb'))
 
   def _GenerateSignerResultsError(self, format_str, *args):
     """Helper for reporting errors with signer results."""
@@ -673,7 +673,7 @@
 
     encoded_signature = base64.b64encode(signatures[0])
 
-    with open(self.metadata_signature_file, 'w+') as f:
+    with open(self.metadata_signature_file, 'w+b') as f:
       f.write(encoded_signature)
 
   def GetPayloadPropertiesMap(self, payload_path):
@@ -726,7 +726,7 @@
     # Add the public key if it exists.
     if self._public_key:
       props_map['public_key'] = base64.b64encode(
-          osutils.ReadFile(self._public_key))
+          osutils.ReadFile(self._public_key, mode='rb')).decode('utf-8')
 
     # We need the metadata size later for payload verification. Just grab it
     # from the properties file.
diff --git a/lib/paygen/paygen_payload_lib_unittest.py b/lib/paygen/paygen_payload_lib_unittest.py
index 31451a3..0357ef8 100644
--- a/lib/paygen/paygen_payload_lib_unittest.py
+++ b/lib/paygen/paygen_payload_lib_unittest.py
@@ -523,10 +523,11 @@
     # Stub out the required functions.
     run_mock = self.PatchObject(paygen_payload_lib.PaygenPayload,
                                 '_RunGeneratorCmd')
-    read_mock = self.PatchObject(osutils, 'ReadFile', return_value='')
+    osutils.WriteFile(gen.payload_hash_file, 'payload')
+    osutils.WriteFile(gen.metadata_hash_file, 'hash')
 
     # Run the test.
-    self.assertEqual(gen._GenerateHashes(), ('', ''))
+    self.assertEqual(gen._GenerateHashes(), (b'payload', b'hash'))
 
     # Check the expected function calls.
     cmd = ['delta_generator',
@@ -534,13 +535,11 @@
            '--signature_size=256',
            partial_mock.HasString('--out_hash_file='),
            partial_mock.HasString('--out_metadata_hash_file=')]
-    read_mock.assert_any_call(gen.payload_hash_file)
-    read_mock.assert_any_call(gen.metadata_hash_file)
     run_mock.assert_called_once_with(cmd)
 
   def testSignHashes(self):
     """Test _SignHashes."""
-    hashes = ('foo', 'bar')
+    hashes = (b'foo', b'bar')
     signatures = (('0' * 256,), ('1' * 256,))
 
     gen = self._GetStdGenerator(work_dir='/work')
@@ -595,7 +594,7 @@
   def testStoreMetadataSignatures(self):
     """Test how we store metadata signatures."""
     gen = self._GetStdGenerator(payload=self.delta_payload)
-    metadata_signatures = ('1' * 256,)
+    metadata_signatures = (b'1' * 256,)
     encoded_metadata_signature = (
         'MTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMT'
         'ExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTEx'
@@ -606,8 +605,8 @@
 
     gen._StoreMetadataSignatures(metadata_signatures)
 
-    with open(gen.metadata_signature_file, 'rb') as f:
-      self.assertEqual(f.read(), encoded_metadata_signature)
+    self.assertEqual(osutils.ReadFile(gen.metadata_signature_file),
+                     encoded_metadata_signature)
 
   def testVerifyPayloadDelta(self):
     """Test _VerifyPayload with delta payload."""
diff --git a/scripts/run_tests.py b/scripts/run_tests.py
index ed4e2d1..0f266ae 100644
--- a/scripts/run_tests.py
+++ b/scripts/run_tests.py
@@ -205,6 +205,7 @@
     'lib/path_util_unittest',
     'lib/paygen/gslock_unittest',
     'lib/paygen/partition_lib_unittest',
+    'lib/paygen/paygen_payload_lib_unittest',
     'lib/paygen/paygen_stateful_payload_lib_unittest',
     'lib/paygen/urilib_unittest',
     'lib/paygen/utils_unittest',