From ea3e18b3f7bbd17969b5c7646c2cc6e9441b92d0 Mon Sep 17 00:00:00 2001
From: Alexey Min <alexey.min@gmail.com>
Date: Mon, 2 Mar 2020 06:01:46 +0300
Subject: [PATCH] Convert to python3

Partially generated by 2to3 tool, partially by hand.

Signed-off-by: Alexey Min <alexey.min@gmail.com>
---
 avbtool | 105 +++++++++++++++++++++++++++-----------------------------
 1 file changed, 50 insertions(+), 55 deletions(-)

diff --git a/avbtool b/avbtool
index 610cf19..a917810 100755
--- a/avbtool
+++ b/avbtool
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/python3
 
 # Copyright 2016, The Android Open Source Project
 #
@@ -407,10 +407,10 @@ def encode_rsa_key(key_path):
     raise AvbError('Only RSA keys with exponent 65537 are supported.')
   ret = bytearray()
   # Calculate n0inv = -1/n[0] (mod 2^32)
-  b = 2L**32
+  b = 2**32
   n0inv = b - modinv(key.modulus, b)
   # Calculate rr = r^2 (mod N), where r = 2^(# of key bits)
-  r = 2L**key.modulus.bit_length()
+  r = 2**key.modulus.bit_length()
   rrmodn = r * r % key.modulus
   ret.extend(struct.pack('!II', key.num_bits, n0inv))
   ret.extend(encode_long(key.num_bits, key.modulus))
@@ -741,7 +741,7 @@ class ImageHandler(object):
     # image.
     offset = 0
     output_offset = 0
-    for _ in xrange(1, self._num_total_chunks + 1):
+    for _ in range(1, self._num_total_chunks + 1):
       chunk_offset = self._image.tell()
 
       header_bin = self._image.read(struct.calcsize(ImageChunk.FORMAT))
@@ -1187,7 +1187,7 @@ class AvbPropertyDescriptor(AvbDescriptor):
       o: The object to write the output to.
     """
     if len(self.value) < 256:
-      o.write('    Prop: {} -> {}\n'.format(self.key, repr(str(self.value))))
+      o.write('    Prop: {} -> {}\n'.format(self.key.decode('utf-8'), repr(self.value.decode('utf-8'))))
     else:
       o.write('    Prop: {} -> ({} bytes)\n'.format(self.key, len(self.value)))
 
@@ -1290,17 +1290,17 @@ class AvbHashtreeDescriptor(AvbDescriptor):
         raise LookupError('Given data does not look like a hashtree '
                           'descriptor.')
       # Nuke NUL-bytes at the end.
-      self.hash_algorithm = self.hash_algorithm.split('\0', 1)[0]
+      self.hash_algorithm = self.hash_algorithm.split(b'\0', 1)[0]
       o = 0
-      self.partition_name = str(data[(self.SIZE + o):(self.SIZE + o +
+      self.partition_name = bytes(data[(self.SIZE + o):(self.SIZE + o +
                                                       partition_name_len)])
       # Validate UTF-8 - decode() raises UnicodeDecodeError if not valid UTF-8.
       self.partition_name.decode('utf-8')
       o += partition_name_len
-      self.salt = data[(self.SIZE + o):(self.SIZE + o + salt_len)]
+      self.salt = bytes(data[(self.SIZE + o):(self.SIZE + o + salt_len)])
       o += salt_len
       self.root_digest = data[(self.SIZE + o):(self.SIZE + o + root_digest_len)]
-      if root_digest_len != len(hashlib.new(name=self.hash_algorithm).digest()):
+      if root_digest_len != len(hashlib.new(name=self.hash_algorithm.decode('utf-8')).digest()):
         if root_digest_len != 0:
           raise LookupError('root_digest_len doesn\'t match hash algorithm')
 
@@ -1315,7 +1315,7 @@ class AvbHashtreeDescriptor(AvbDescriptor):
       self.fec_offset = 0
       self.fec_size = 0
       self.hash_algorithm = ''
-      self.partition_name = ''
+      self.partition_name = b''
       self.salt = bytearray()
       self.root_digest = bytearray()
       self.flags = 0
@@ -1338,12 +1338,10 @@ class AvbHashtreeDescriptor(AvbDescriptor):
     o.write('      FEC num roots:         {}\n'.format(self.fec_num_roots))
     o.write('      FEC offset:            {}\n'.format(self.fec_offset))
     o.write('      FEC size:              {} bytes\n'.format(self.fec_size))
-    o.write('      Hash Algorithm:        {}\n'.format(self.hash_algorithm))
-    o.write('      Partition Name:        {}\n'.format(self.partition_name))
-    o.write('      Salt:                  {}\n'.format(str(self.salt).encode(
-        'hex')))
-    o.write('      Root Digest:           {}\n'.format(str(
-        self.root_digest).encode('hex')))
+    o.write('      Hash Algorithm:        {}\n'.format(self.hash_algorithm.decode('utf-8')))
+    o.write('      Partition Name:        {}\n'.format(self.partition_name.decode('utf-8')))
+    o.write('      Salt:                  {}\n'.format(self.salt.hex()))
+    o.write('      Root Digest:           {}\n'.format(self.root_digest.hex()))
     o.write('      Flags:                 {}\n'.format(self.flags))
 
   def encode(self):
@@ -1414,7 +1412,7 @@ class AvbHashtreeDescriptor(AvbDescriptor):
     # correct but this a) currently requires the 'fec' binary; and b)
     # takes a long time; and c) is not strictly needed for
     # verification purposes as we've already verified the root hash.
-    print ('{}: Successfully verified {} hashtree of {} for image of {} bytes'
+    print('{}: Successfully verified {} hashtree of {} for image of {} bytes'
            .format(self.partition_name, self.hash_algorithm, image.filename,
                    self.image_size))
     return True
@@ -1468,17 +1466,17 @@ class AvbHashDescriptor(AvbDescriptor):
       if tag != self.TAG or num_bytes_following != expected_size:
         raise LookupError('Given data does not look like a hash ' 'descriptor.')
       # Nuke NUL-bytes at the end.
-      self.hash_algorithm = self.hash_algorithm.split('\0', 1)[0]
+      self.hash_algorithm = self.hash_algorithm.split(b'\0', 1)[0]
       o = 0
-      self.partition_name = str(data[(self.SIZE + o):(self.SIZE + o +
+      self.partition_name = bytes(data[(self.SIZE + o):(self.SIZE + o +
                                                       partition_name_len)])
       # Validate UTF-8 - decode() raises UnicodeDecodeError if not valid UTF-8.
       self.partition_name.decode('utf-8')
       o += partition_name_len
-      self.salt = data[(self.SIZE + o):(self.SIZE + o + salt_len)]
+      self.salt = bytes(data[(self.SIZE + o):(self.SIZE + o + salt_len)])
       o += salt_len
       self.digest = data[(self.SIZE + o):(self.SIZE + o + digest_len)]
-      if digest_len != len(hashlib.new(name=self.hash_algorithm).digest()):
+      if digest_len != len(hashlib.new(name=self.hash_algorithm.decode('utf-8')).digest()):
         if digest_len != 0:
           raise LookupError('digest_len doesn\'t match hash algorithm')
 
@@ -1498,12 +1496,10 @@ class AvbHashDescriptor(AvbDescriptor):
     """
     o.write('    Hash descriptor:\n')
     o.write('      Image Size:            {} bytes\n'.format(self.image_size))
-    o.write('      Hash Algorithm:        {}\n'.format(self.hash_algorithm))
-    o.write('      Partition Name:        {}\n'.format(self.partition_name))
-    o.write('      Salt:                  {}\n'.format(str(self.salt).encode(
-        'hex')))
-    o.write('      Digest:                {}\n'.format(str(self.digest).encode(
-        'hex')))
+    o.write('      Hash Algorithm:        {}\n'.format(self.hash_algorithm.decode('utf-8')))
+    o.write('      Partition Name:        {}\n'.format(self.partition_name.decode('utf-8')))
+    o.write('      Salt:                  {}\n'.format(self.salt.hex()))
+    o.write('      Digest:                {}\n'.format(self.digest.hex()))
     o.write('      Flags:                 {}\n'.format(self.flags))
 
   def encode(self):
@@ -1554,7 +1550,7 @@ class AvbHashDescriptor(AvbDescriptor):
       sys.stderr.write('{} digest of {} does not match digest in descriptor\n'.
                        format(self.hash_algorithm, image_filename))
       return False
-    print ('{}: Successfully verified {} hash of {} for image of {} bytes'
+    print('{}: Successfully verified {} hash of {} for image of {} bytes'
            .format(self.partition_name, self.hash_algorithm, image.filename,
                    self.image_size))
     return True
@@ -1600,13 +1596,13 @@ class AvbKernelCmdlineDescriptor(AvbDescriptor):
         raise LookupError('Given data does not look like a kernel cmdline '
                           'descriptor.')
       # Nuke NUL-bytes at the end.
-      self.kernel_cmdline = str(data[self.SIZE:(self.SIZE +
+      self.kernel_cmdline = bytes(data[self.SIZE:(self.SIZE +
                                                 kernel_cmdline_length)])
       # Validate UTF-8 - decode() raises UnicodeDecodeError if not valid UTF-8.
       self.kernel_cmdline.decode('utf-8')
     else:
       self.flags = 0
-      self.kernel_cmdline = ''
+      self.kernel_cmdline = b''
 
   def print_desc(self, o):
     """Print the descriptor.
@@ -1616,8 +1612,7 @@ class AvbKernelCmdlineDescriptor(AvbDescriptor):
     """
     o.write('    Kernel Cmdline descriptor:\n')
     o.write('      Flags:                 {}\n'.format(self.flags))
-    o.write('      Kernel Cmdline:        {}\n'.format(repr(
-        self.kernel_cmdline)))
+    o.write('      Kernel Cmdline:        {}\n'.format(self.kernel_cmdline.decode('utf-8')))
 
   def encode(self):
     """Serializes the descriptor.
@@ -1775,7 +1770,7 @@ class AvbChainPartitionDescriptor(AvbDescriptor):
                        format(self.partition_name))
       return False
 
-    print ('{}: Successfully verified chain partition descriptor matches '
+    print('{}: Successfully verified chain partition descriptor matches '
            'expected data'.format(self.partition_name))
 
     return True
@@ -1927,10 +1922,10 @@ class AvbVBMetaHeader(object):
        self.flags,
        self.release_string) = struct.unpack(self.FORMAT_STRING, data)
       # Nuke NUL-bytes at the end of the string.
-      if self.magic != 'AVB0':
+      if self.magic != b'AVB0':
         raise AvbError('Given image does not look like a vbmeta image.')
     else:
-      self.magic = 'AVB0'
+      self.magic = b'AVB0'
       # Start by just requiring version 1.0. Code that adds features
       # in a future version can use bump_required_libavb_version_minor() to
       # bump the minor.
@@ -1951,7 +1946,7 @@ class AvbVBMetaHeader(object):
       self.descriptors_size = 0
       self.rollback_index = 0
       self.flags = 0
-      self.release_string = get_release_string()
+      self.release_string = get_release_string().encode('utf-8')
 
   def bump_required_libavb_version_minor(self, minor):
     """Function to bump required_libavb_version_minor.
@@ -2209,7 +2204,7 @@ class Avb(object):
     o.write('Rollback Index:           {}\n'.format(header.rollback_index))
     o.write('Flags:                    {}\n'.format(header.flags))
     o.write('Release String:           \'{}\'\n'.format(
-        header.release_string.rstrip('\0')))
+        header.release_string.rstrip(b'\0').decode('utf-8')))
 
     # Print descriptors.
     num_printed = 0
@@ -2248,10 +2243,10 @@ class Avb(object):
 
     key_blob = None
     if key_path:
-      print 'Verifying image {} using key at {}'.format(image_filename, key_path)
+      print('Verifying image {} using key at {}'.format(image_filename, key_path))
       key_blob = encode_rsa_key(key_path)
     else:
-      print 'Verifying image {} using embedded public key'.format(image_filename)
+      print('Verifying image {} using embedded public key'.format(image_filename))
 
     image = ImageHandler(image_filename)
     (footer, header, descriptors, image_size) = self._parse_image(image)
@@ -2278,10 +2273,10 @@ class Avb(object):
         raise AvbError('Embedded public key does not match given key.')
 
     if footer:
-      print ('vbmeta: Successfully verified footer and {} vbmeta struct in {}'
+      print('vbmeta: Successfully verified footer and {} vbmeta struct in {}'
              .format(alg_name, image.filename))
     else:
-      print ('vbmeta: Successfully verified {} vbmeta struct in {}'
+      print('vbmeta: Successfully verified {} vbmeta struct in {}'
              .format(alg_name, image.filename))
 
     for desc in descriptors:
@@ -2290,7 +2285,7 @@ class Avb(object):
         # In this case we're processing a chain descriptor but don't have a
         # --expect_chain_partition ... however --follow_chain_partitions was
         # specified so we shouldn't error out in desc.verify().
-        print ('{}: Chained but ROLLBACK_SLOT (which is {}) and KEY (which has sha1 {}) not specified'
+        print('{}: Chained but ROLLBACK_SLOT (which is {}) and KEY (which has sha1 {}) not specified'
               .format(desc.partition_name, desc.rollback_index_location,
                       hashlib.sha1(desc.public_key).hexdigest()))
       else:
@@ -2298,7 +2293,7 @@ class Avb(object):
           raise AvbError('Error verifying descriptor.')
       # Honor --follow_chain_partitions - add '--' to make the output more readable.
       if isinstance(desc, AvbChainPartitionDescriptor) and follow_chain_partitions:
-        print '--'
+        print('--')
         chained_image_filename = os.path.join(image_dir, desc.partition_name + image_ext)
         self.verify_image(chained_image_filename, key_path, None, False)
 
@@ -2593,10 +2588,10 @@ class Avb(object):
           (_, image_header, _, _) = self._parse_image(ImageHandler(image.name))
           tmp_header.bump_required_libavb_version_minor(
               image_header.required_libavb_version_minor)
-        print '1.{}'.format(tmp_header.required_libavb_version_minor)
+        print('1.{}'.format(tmp_header.required_libavb_version_minor))
       else:
         # Descriptors aside, all vbmeta features are supported in 1.0.
-        print '1.0'
+        print('1.0')
       return
 
     if not output:
@@ -2619,7 +2614,7 @@ class Avb(object):
     if padding_size > 0:
       padded_size = round_to_multiple(len(vbmeta_blob), padding_size)
       padding_needed = padded_size - len(vbmeta_blob)
-      output.write('\0' * padding_needed)
+      output.write(b'\0' * padding_needed)
 
   def _generate_vbmeta_blob(self, algorithm_name, key_path,
                             public_key_metadata_path, descriptors,
@@ -2800,12 +2795,12 @@ class Avb(object):
             algorithm_name))
 
     # Override release string, if requested.
-    if isinstance(release_string, (str, unicode)):
-      h.release_string = release_string
+    if isinstance(release_string, str):
+      h.release_string = release_string.encode('utf-8')
 
     # Append to release string, if requested. Also insert a space before.
-    if isinstance(append_to_release_string, (str, unicode)):
-      h.release_string += ' ' + append_to_release_string
+    if isinstance(append_to_release_string, str):
+      h.release_string += ' ' + append_to_release_string.encode('utf-8')
 
     # For the Auxiliary data block, descriptors are stored at offset 0,
     # followed by the public key, followed by the public key metadata blob.
@@ -3017,7 +3012,7 @@ class Avb(object):
 
     # If we're asked to calculate minimum required libavb version, we're done.
     if print_required_libavb_version:
-      print '1.{}'.format(required_libavb_version_minor)
+      print('1.{}'.format(required_libavb_version_minor))
       return
 
     # First, calculate the maximum image size such that an image
@@ -3032,7 +3027,7 @@ class Avb(object):
 
     # If we're asked to only calculate the maximum image size, we're done.
     if calc_max_image_size:
-      print '{}'.format(max_image_size)
+      print('{}'.format(max_image_size))
       return
 
     image = ImageHandler(image_filename)
@@ -3226,7 +3221,7 @@ class Avb(object):
 
     # If we're asked to calculate minimum required libavb version, we're done.
     if print_required_libavb_version:
-      print '1.{}'.format(required_libavb_version_minor)
+      print('1.{}'.format(required_libavb_version_minor))
       return
 
     digest_size = len(hashlib.new(name=hash_algorithm).digest())
@@ -3251,7 +3246,7 @@ class Avb(object):
 
     # If we're asked to only calculate the maximum image size, we're done.
     if calc_max_image_size:
-      print '{}'.format(max_image_size)
+      print('{}'.format(max_image_size))
       return
 
     image = ImageHandler(image_filename)
@@ -4258,7 +4253,7 @@ class AvbTool(object):
 
   def version(self, _):
     """Implements the 'version' sub-command."""
-    print get_release_string()
+    print(get_release_string())
 
   def extract_public_key(self, args):
     """Implements the 'extract_public_key' sub-command."""
-- 
2.24.1