blob: 4021e08229707676cd7303e5630fdea63df44c93 [file] [log] [blame]
# Lint as: python2, python3
# Copyright 2014 The Chromium OS Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.
import logging, os
import time
from autotest_lib.client.common_lib import error
from autotest_lib.client.cros import constants
_RM_FILES = ['/home/chronos/.oobe_completed',
'/home/chronos/Local\ State',
'/var/cache/shill/default.profile']
# TODO(b/187793661) Delete /var/lib/whitelist once migration is finished.
_RM_DIRS = [
'/home/.shadow/*',
os.path.join(constants.DEVICESETTINGS_DIR, '*'),
'/var/lib/whitelist/*',
'/var/cache/app_pack',
'/var/lib/tpm',
]
class NoTPMPasswordException(Exception):
"""No TPM Password could be found."""
pass
def TPMStatus(client):
"""Returns a dictionary with TPM status.
@param client: client object to run commands on.
"""
out = client.run('tpm_manager_client status --nonsensitive').stdout.strip()
lines = out.split('\n')[1:-1]
status = {}
for item in lines:
item = item.split(':')
if not item[0]:
continue
if len(item) == 1:
item.append('')
item = [x.strip() for x in item]
item[1] = True if item[1] == 'true' else item[1]
item[1] = False if item[1] == 'false' else item[1]
status[item[0]] = item[1]
return status
def ClearTPMServer(client, out_dir):
"""Clears the TPM and reboots from a server-side autotest.
@param client: client object to run commands on.
@param out_dir: temporary directory.
"""
client.run('stop ui')
ClearTPMOwnerRequest(client)
def ClearTPMOwnerRequest(client, wait_for_ready=False, timeout=60):
"""Clears the TPM using crossystem command.
@param client: client object to run commands on.
@param wait_for_ready: wait until the TPM status is ready
@param timeout: number of seconds to wait for the TPM to become ready.
"""
ownership_id = client.run('hwsec-ownership-id id')
if not ownership_id.exit_status == 0:
raise error.TestFail('Unable to get ownership ID.')
ownership_id = ownership_id.stdout.strip()
logging.info('Sending Clear TPM owner request')
client.run('crossystem clear_tpm_owner_request=1')
CleanupAndReboot(client)
if wait_for_ready:
status = 1
end_time = time.time() + timeout
# Wait for the ownership ID changed.
while status != 0 and time.time() < end_time:
status = client.run('hwsec-ownership-id diff id=' + ownership_id,
ignore_status=True).exit_status
time.sleep(1)
if status != 0:
raise error.TestFail('Failed to clear TPM.')
def ClearTPMIfOwned(client):
"""Clear the TPM only if device is already owned.
@param client: client object to run commands on."""
tpm_status = TPMStatus(client)
logging.info('TPM status: %s', tpm_status)
if tpm_status['is_owned']:
logging.info('Clearing TPM because this device is owned.')
ClearTPMOwnerRequest(client)
def CleanupAndReboot(client):
"""Cleanup and reboot the device.
@param client: client object to run commands on.
"""
full_rm = 'sudo rm -rf ' + ' '.join(_RM_FILES + _RM_DIRS)
client.run(full_rm, ignore_status=True)
client.run('sync', ignore_status=True)
client.reboot()
def FwmpIsAllZero(get_fwmp_output):
"""Check if firmware management parameters are all zero.
@param get_fwmp_output: output from the command
'cryptohome --action=get_firmware_management_parameters'.
"""
return ('flags=0x00000000' in get_fwmp_output and
'hash=0000000000000000000000000000000000000000000000000000000000000000'
in get_fwmp_output)