122 lines
3.8 KiB
Python
122 lines
3.8 KiB
Python
# 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)
|