Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 60dd04ec authored by Tao Bao's avatar Tao Bao Committed by Android (Google) Code Review
Browse files

Merge "Add post-install verification for BBOTAs" into mnc-dev

parents a9dd74c3 5fcaaeff
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -74,7 +74,7 @@ class Image(object):
  def ReadRangeSet(self, ranges):
    raise NotImplementedError

  def TotalSha1(self):
  def TotalSha1(self, include_clobbered_blocks=False):
    raise NotImplementedError


@@ -87,7 +87,10 @@ class EmptyImage(Image):
  file_map = {}
  def ReadRangeSet(self, ranges):
    return ()
  def TotalSha1(self):
  def TotalSha1(self, include_clobbered_blocks=False):
    # EmptyImage always carries empty clobbered_blocks, so
    # include_clobbered_blocks can be ignored.
    assert self.clobbered_blocks.size() == 0
    return sha1().hexdigest()


@@ -136,8 +139,9 @@ class DataImage(Image):
  def ReadRangeSet(self, ranges):
    return [self.data[s*self.blocksize:e*self.blocksize] for (s, e) in ranges]

  def TotalSha1(self):
    # DataImage always carries empty clobbered_blocks.
  def TotalSha1(self, include_clobbered_blocks=False):
    # DataImage always carries empty clobbered_blocks, so
    # include_clobbered_blocks can be ignored.
    assert self.clobbered_blocks.size() == 0
    return sha1(self.data).hexdigest()

@@ -201,7 +205,8 @@ class Transfer(object):
#
#    TotalSha1(): a function that returns (as a hex string) the SHA-1
#      hash of all the data in the image (ie, all the blocks in the
#      care_map minus clobbered_blocks).
#      care_map minus clobbered_blocks, or including the clobbered
#      blocks if include_clobbered_blocks is True).
#
# When creating a BlockImageDiff, the src image may be None, in which
# case the list of transfers produced will never read from the
+16 −0
Original line number Diff line number Diff line
@@ -1183,6 +1183,7 @@ class BlockDifference(object):
    if progress:
      script.ShowProgress(progress, 0)
    self._WriteUpdate(script, output_zip)
    self._WritePostInstallVerifyScript(script)

  def WriteVerifyScript(self, script):
    partition = self.partition
@@ -1221,6 +1222,21 @@ class BlockDifference(object):
      script.AppendExtra(('abort("%s partition has unexpected contents");\n'
                          'endif;') % (partition,))

  def _WritePostInstallVerifyScript(self, script):
    partition = self.partition
    script.Print('Verifying the updated %s image...' % (partition,))
    # Unlike pre-install verification, clobbered_blocks should not be ignored.
    ranges = self.tgt.care_map
    ranges_str = ranges.to_string_raw()
    script.AppendExtra('if range_sha1("%s", "%s") == "%s" then' % (
                       self.device, ranges_str,
                       self.tgt.TotalSha1(include_clobbered_blocks=True)))
    script.Print('Verified the updated %s image.' % (partition,))
    script.AppendExtra(
        'else\n'
        '  abort("%s partition has unexpected contents after OTA update");\n'
        'endif;' % (partition,))

  def _WriteUpdate(self, script, output_zip):
    ZipWrite(output_zip,
             '{}.transfer.list'.format(self.path),
+9 −4
Original line number Diff line number Diff line
@@ -118,11 +118,16 @@ class SparseImage(object):
  def ReadRangeSet(self, ranges):
    return [d for d in self._GetRangeData(ranges)]

  def TotalSha1(self):
    """Return the SHA-1 hash of all data in the 'care' regions but not in
    clobbered_blocks of this image."""
  def TotalSha1(self, include_clobbered_blocks=False):
    """Return the SHA-1 hash of all data in the 'care' regions.

    If include_clobbered_blocks is True, it returns the hash including the
    clobbered_blocks."""
    ranges = self.care_map
    if not include_clobbered_blocks:
      ranges.subtract(self.clobbered_blocks)
    h = sha1()
    for d in self._GetRangeData(self.care_map.subtract(self.clobbered_blocks)):
    for d in self._GetRangeData(ranges):
      h.update(d)
    return h.hexdigest()