# Copyright 2018 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 import time from autotest_lib.client.common_lib import error from autotest_lib.server.cros.faft.cr50_test import Cr50Test class firmware_Cr50Unlock(Cr50Test): """Verify cr50 unlock.""" version = 1 def send_unlock_console_command(self, password=''): """Sent the unlock console command with the given password.""" time.sleep(self.cr50.CCD_PASSWORD_RATE_LIMIT) self.cr50.send_command('ccd unlock ' + password) def run_once(self): """Check cr50 can see dev mode open works correctly""" # Make sure testlab mode is enabled, so we can guarantee the password # can be cleared. if not self.faft_config.has_powerbutton: raise error.TestNAError('Can not run test without power button') return self.fast_ccd_open(enable_testlab=True) self.cr50.send_command('ccd reset') # Set the password self.set_ccd_password(self.CCD_PASSWORD) if self.cr50.password_is_reset(): raise error.TestFail('Failed to set password') # Test the ccd password rate limit. self.cr50.set_ccd_level('lock') # Wait long enough to ensure that the failed ccd unlock command starts # the rate limit. time.sleep(5) self.cr50.send_command('ccd unlock ' + self.CCD_PASSWORD.lower()) # Cr50 should reject the correct ccd unlock because of the rate limit. self.cr50.send_command_get_output('ccd unlock ' + self.CCD_PASSWORD, ['Busy']) if self.cr50.get_ccd_level() == 'unlock': raise error.TestFail('Rate limit did not prevent unlock.') logging.info('Verified password rate limit.') # Verify unlock from the cr50 console. self.cr50.set_ccd_level('lock') self.send_unlock_console_command(self.CCD_PASSWORD) if self.cr50.get_ccd_level() != 'unlock': raise error.TestFail('Could not unlock cr50 with the password') self.cr50.set_ccd_level('lock') # Try with the lowercase version of the passsword. Make sure it doesn't # work. self.send_unlock_console_command(self.CCD_PASSWORD.lower()) if self.cr50.get_ccd_level() != 'lock': raise error.TestFail('Unlocked cr50 from AP with incorrect ' 'password') # Verify unlock from the AP. self.ccd_unlock_from_ap(self.CCD_PASSWORD) if self.cr50.get_ccd_level() != 'unlock': raise error.TestFail('Could not unlock cr50 from the AP with the ' 'password.') self.cr50.set_ccd_level('lock') self.ccd_unlock_from_ap(self.CCD_PASSWORD.lower(), expect_error=True) if self.cr50.get_ccd_level() != 'lock': raise error.TestFail('Unlocked cr50 from AP with incorrect ' 'password') # CCD needs to be unlocked to clear the password. self.ccd_unlock_from_ap(self.CCD_PASSWORD) # Clear the password which has set at the beginning of this test. self.set_ccd_password('clear:' + self.CCD_PASSWORD) if not self.cr50.password_is_reset(): raise error.TestFail('Unable to clear password')