pushimage: add support for signing accessories images

'accessory_usbpd' and 'accessory_rwsig' are used to sign standalone
accesory MCU firmwares (right now, the former are all the USB type-C
accessories: e.g. Zinger power supply, DingDong and HoHo display
dongles, the latter is the Smaug wireless keyboard).

Signed-off-by: Vincent Palatin <vpalatin@chromium.org>

BUG=chrome-os-partner:46635
TEST=bin/pushimage --debug --test-sign premp --sign-types accessory_rwsig --board smaug gs://chromeos-image-archive/smaug-firmware/R45-7132.239.0
TEST=./scripts/pushimage_unittest

Change-Id: I6481c68061f50b9acc3656a1167d64ced79ec011
Reviewed-on: https://chromium-review.googlesource.com/308725
Commit-Ready: Vincent Palatin <vpalatin@chromium.org>
Tested-by: Vincent Palatin <vpalatin@chromium.org>
Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
diff --git a/cbuildbot/constants.py b/cbuildbot/constants.py
index 13b5e5d..0a64af3 100644
--- a/cbuildbot/constants.py
+++ b/cbuildbot/constants.py
@@ -760,7 +760,12 @@
 IMAGE_TYPE_RECOVERY = 'recovery'
 IMAGE_TYPE_FACTORY = 'factory'
 IMAGE_TYPE_FIRMWARE = 'firmware'
+# NVidia Tegra SoC resume firmware blob.
 IMAGE_TYPE_NV_LP0_FIRMWARE = 'nv_lp0_firmware'
+# USB PD accessory microcontroller firmware (e.g. power brick, display dongle).
+IMAGE_TYPE_ACCESSORY_USBPD = 'accessory_usbpd'
+# Standalone accessory microcontroller firmware (e.g. wireless keyboard).
+IMAGE_TYPE_ACCESSORY_RWSIG = 'accessory_rwsig'
 
 IMAGE_TYPE_TO_NAME = {
     IMAGE_TYPE_BASE: BASE_IMAGE_BIN,
diff --git a/scripts/pushimage.py b/scripts/pushimage.py
index 58c0ca2..7c56e34 100644
--- a/scripts/pushimage.py
+++ b/scripts/pushimage.py
@@ -49,6 +49,8 @@
     constants.IMAGE_TYPE_FACTORY,
     constants.IMAGE_TYPE_FIRMWARE,
     constants.IMAGE_TYPE_NV_LP0_FIRMWARE,
+    constants.IMAGE_TYPE_ACCESSORY_USBPD,
+    constants.IMAGE_TYPE_ACCESSORY_RWSIG,
     constants.IMAGE_TYPE_BASE,
 )
 
@@ -303,6 +305,8 @@
     firmware_basename = _ImageNameBase(constants.IMAGE_TYPE_FIRMWARE)
     nv_lp0_firmware_basename = _ImageNameBase(
         constants.IMAGE_TYPE_NV_LP0_FIRMWARE)
+    acc_usbpd_basename = _ImageNameBase(constants.IMAGE_TYPE_ACCESSORY_USBPD)
+    acc_rwsig_basename = _ImageNameBase(constants.IMAGE_TYPE_ACCESSORY_RWSIG)
     test_basename = _ImageNameBase(constants.IMAGE_TYPE_TEST)
     base_basename = _ImageNameBase(constants.IMAGE_TYPE_BASE)
     hwqual_tarball = 'chromeos-hwqual-%s-%s.tar.bz2' % (board, versionrev)
@@ -335,6 +339,12 @@
 
         ('firmware_from_source.tar.bz2', nv_lp0_firmware_basename, 'tar.bz2',
          constants.IMAGE_TYPE_NV_LP0_FIRMWARE),
+
+        ('firmware_from_source.tar.bz2', acc_usbpd_basename, 'tar.bz2',
+         constants.IMAGE_TYPE_ACCESSORY_USBPD),
+
+        ('firmware_from_source.tar.bz2', acc_rwsig_basename, 'tar.bz2',
+         constants.IMAGE_TYPE_ACCESSORY_RWSIG),
     )
 
     # The following build artifacts are copied and marked for signing, if
diff --git a/scripts/pushimage_unittest.py b/scripts/pushimage_unittest.py
index ae6f6c8..9f5dcf1 100644
--- a/scripts/pushimage_unittest.py
+++ b/scripts/pushimage_unittest.py
@@ -233,7 +233,7 @@
     with mock.patch.object(gs.GSContext, 'Exists', return_value=True):
       urls = pushimage.PushImage('/src', 'test.board', 'R34-5126.0.0',
                                  sign_types=['recovery'])
-    self.assertEqual(self.gs_mock.call_count, 22)
+    self.assertEqual(self.gs_mock.call_count, 26)
     self.assertTrue(self.mark_mock.called)
     self.assertEqual(urls, EXPECTED)
 
@@ -251,7 +251,7 @@
     with mock.patch.object(gs.GSContext, 'Exists', return_value=True):
       urls = pushimage.PushImage('/src', 'test.board', 'R34-5126.0.0',
                                  sign_types=['base'])
-    self.assertEqual(self.gs_mock.call_count, 24)
+    self.assertEqual(self.gs_mock.call_count, 28)
     self.assertTrue(self.mark_mock.called)
     self.assertEqual(urls, EXPECTED)
 
@@ -259,7 +259,7 @@
     """Verify nothing is signed when we request an unavailable type"""
     urls = pushimage.PushImage('/src', 'test.board', 'R34-5126.0.0',
                                sign_types=['nononononono'])
-    self.assertEqual(self.gs_mock.call_count, 20)
+    self.assertEqual(self.gs_mock.call_count, 24)
     self.assertFalse(self.mark_mock.called)
     self.assertEqual(urls, {})