factory_install: Call chromeos-tpm-recovery to reset TPM.
Factory Reset shim has to clear (wipe/zero) TPM NV spaces so devices
with wrong antirollback records can be recovered. However, the script
becomes more complicated due to (1) vboot changes (2) TPM2.
vboot_reference has an utility 'chromeos-tpm-recovery' that was has
more complete support of TPM recovery, although it does more (try to
re-create or even redefine the space) than what we need. To prevent
duplicating code, we should just run chromeos-tpm-recovery instead of
introducing our own implementation.
BUG=chromium:664390
TEST=./build_image factory_install; boot as recovery mode on Link+TPM1,
enter menu, select item "r" (Reset) or "i" (Install). Also tried
on Reef+TPM2.
Change-Id: I7b618946c55e24e775dc6972a23b6d271455ff06
Reviewed-on: https://chromium-review.googlesource.com/410523
Commit-Ready: Hung-Te Lin <hungte@chromium.org>
Tested-by: Hung-Te Lin <hungte@chromium.org>
Reviewed-by: Julius Werner <jwerner@chromium.org>
diff --git a/factory_install.sh b/factory_install.sh
index 97f14d6..1be49a3 100644
--- a/factory_install.sh
+++ b/factory_install.sh
@@ -198,38 +198,6 @@
grep -q "write protect is enabled"
}
-clear_tpm() {
- log "Clearing TPM"
-
- # Reset TPM. tcsd needs to have not been run because it locks the TPM.
- tpmc ppon
- tpmc clear
- tpmc enable
- tpmc activate
-
- local firmware_index="0x1007"
- local firmware_struct_version="2"
- local firmware_flags="0"
- local firmware_fw_versions="1 0 1 0"
- local firmware_reserved="0 0 0"
- local firmware_checksum="0x4f"
-
- tpmc write ${firmware_index} ${firmware_struct_version} ${firmware_flags} \
- ${firmware_fw_versions} ${firmware_reserved} ${firmware_checksum}
-
- local kernel_index="0x1008"
- local kernel_struct_version="2"
- local kernel_uid="4c 57 52 47"
- local kernel_kernel_versions="1 0 1 0"
- local kernel_reserved="0 0 0"
- local kernel_checksum="0x55"
-
- tpmc write ${kernel_index} ${kernel_struct_version} ${kernel_uid} \
- ${kernel_kernel_versions} ${kernel_reserved} ${kernel_checksum}
-
- log "Done clearing TPM"
-}
-
set_time() {
log "Setting time from:"
# Extract only the server and port.
@@ -296,11 +264,22 @@
# release image won't start with unknown ownership.
crossystem clear_tpm_owner_request=1 || true
- log "Checking if TPM should be cleared (for version and owner)"
+ log "Checking if TPM should be recovered (for version and owner)"
# To clear TPM, we need it unlocked (only in recovery boot).
# Booting with USB in developer mode (Ctrl-U) does not work.
if crossystem "mainfw_type?recovery"; then
- clear_tpm
+ if ! chromeos-tpm-recovery; then
+ colorize yellow
+ log " - TPM recovery failed.
+
+ This is usually not a problem for devices on manufacturing line,
+ but if you are using factory shim to reset TPM (for antirollback issue),
+ there's something wrong.
+ "
+ sleep 3
+ else
+ log "TPM recovered."
+ fi
else
mainfw_type="$(crossystem mainfw_type)"
colorize yellow