sign_official_build: add AP RO signing

When signing AP RO images, in cases when signer_config.csv manifest
includes the brand code column add a futility invocation to sign the
RO_GSCVD section of the image. If the <path to unpacked>/keyset
directory is found, save the gscvd.<model> blob in that directory.

BRANCH=none
BUG=b:247652363
TEST=built ChromeOS test image for Nissa, then invoked
  $ scripts/image_signing/sign_official_build.sh \
   base \
   ~/trunk/src/build/images/nissa/latest/chromiumos_test_image.bin \
   tests/devkeys \
   /tmp/signed.bin

  and observed 'futility gscvd' invocation in the log.

Cq-Depend: 3954963
Cq-Depend: 4063101
Change-Id: I55cec75794560662ed2cfb2dac7f44d972a8571f
Signed-off-by: Vadim Bendebury <vbendeb@google.com>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/3935034
Commit-Queue: Vadim Bendebury <vbendeb@chromium.org>
Tested-by: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-by: Hung-Te Lin <hungte@chromium.org>
Auto-Submit: Vadim Bendebury <vbendeb@chromium.org>
Reviewed-by: Yu-Ping Wu <yupingso@chromium.org>
(cherry picked from commit befd35f018be4ff6465b15f7bc1bc64c8e65426d)
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/vboot_reference/+/4063103
Reviewed-by: Vadim Bendebury <vbendeb@chromium.org>
Tested-by: Knox Chiou <knoxchiou@chromium.org>
Commit-Queue: Knox Chiou <knoxchiou@chromium.org>
diff --git a/scripts/image_signing/sign_official_build.sh b/scripts/image_signing/sign_official_build.sh
index d1c95c9..49ac33b 100755
--- a/scripts/image_signing/sign_official_build.sh
+++ b/scripts/image_signing/sign_official_build.sh
@@ -456,7 +456,7 @@
     info "See go/cros-unibuild-signing for details"
     {
       read # Burn the first line (header line)
-      while IFS="," read -r output_name bios_image key_id ec_image
+      while IFS="," read -r output_name bios_image key_id ec_image brand_code
       do
         local key_suffix=''
         local extra_args=()
@@ -574,6 +574,34 @@
         echo "After setting GBB on ${bios_path}: md5 =" \
           $(md5sum ${bios_path} | awk '{print $1}')
 
+        if [[ -n ${brand_code} ]]; then
+          # Resign the RO_GSCVD FMAP area.
+          if [[ -z ${shellball_keyset_dir} ]]; then
+            extra_args=()
+          else
+            extra_args=( --gscvd_out
+                         "${shellball_keyset_dir}/gscvd.${output_name}" )
+          fi
+          echo "Setting RO_GSCVD with: ${FUTILITY} gscvd" \
+            --keyblock "${KEY_DIR}/arv_platform.keyblock" \
+            --platform_priv "${KEY_DIR}/arv_platform.vbprivk" \
+            --board_id "${brand_code}" \
+            --root_pub_key "${KEY_DIR}/arv_root.vbpubk" \
+            "${extra_args[@]}" \
+            "${bios_path}"
+          ${FUTILITY} gscvd \
+            --keyblock "${KEY_DIR}/arv_platform.keyblock" \
+            --platform_priv "${KEY_DIR}/arv_platform.vbprivk" \
+            --board_id "${brand_code}" \
+            --root_pub_key "${KEY_DIR}/arv_root.vbpubk" \
+            "${extra_args[@]}" \
+            "${bios_path}"
+
+          echo "After signing RO_GSCVD on ${bios_path}: md5 =" \
+               "$(md5sum "${bios_path}" | awk '{print $1}')"
+        else
+          warn "No brand code for ${bios_path} in signer_config.csv"
+        fi
         info "Signed firmware image output to ${bios_path}"
       done
       unset IFS