| #!/bin/bash |
| |
| # Copyright 2019 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. |
| |
| set -e |
| |
| # shellcheck source=./common.sh |
| . "$(dirname "$(readlink -f "${0}")")/common.sh" |
| |
| test_read_from_flash_in_bootloader_mode_without_modifying_RDP_level() { |
| local file_read_from_flash="test.bin" |
| |
| # Given: |
| # * Hardware write protect is disabled |
| # (so we can use bootloader to read and change RDP level) |
| # * Software write protect is enabled |
| # * RDP is at level 1 |
| # |
| # Then: |
| # * Reading from flash without changing the RDP level should fail |
| # (and we should not have read any bytes from flash). |
| # * The firmware should still be functional because mass erase is NOT |
| # triggered since we are NOT changing the RDP level. |
| echo "Reading firmware without modifying RDP level" |
| # This should fail and the file should be empty |
| if read_from_flash_in_bootloader_mode_without_modifying_RDP_level \ |
| "${file_read_from_flash}"; then |
| echo "Should not be able to read from flash" |
| exit 1 |
| fi |
| |
| check_file_size_equals_zero "${file_read_from_flash}" |
| |
| echo "Checking that firmware is still functional" |
| check_firmware_is_functional |
| |
| rm -rf "${file_read_from_flash}" |
| } |
| |
| test_read_from_flash_in_bootloader_mode_while_setting_RDP_to_level_0() { |
| local file_read_from_flash="test.bin" |
| local original_fw_file="$1" |
| local file_expected_byte_size="$(get_file_size ${original_fw_file})" |
| |
| # Given: |
| # * Hardware write protect is disabled |
| # (so we can use bootloader to read and change RDP level) |
| # * Software write protect is enabled |
| # * RDP is at level 1 |
| # |
| # Then: |
| # * Setting the RDP level to 0 (after being at level 1) should trigger |
| # a mass erase. |
| # * A mass erase sets all flash bytes to 0xFF, so all bytes read from flash |
| # should have that value. |
| # * Since the flash was mass erased, the firmware should no longer function. |
| echo "Reading firmware after setting RDP to level 0" |
| # This command partially fails (and returns an error) because it causes the |
| # flash to be mass erased, but we should still have a file with the contents |
| # that we can compare against. |
| read_from_flash_in_bootloader_mode_while_setting_RDP_to_level_0 \ |
| "${file_read_from_flash}" || true |
| |
| echo "Checking that value read is made up entirely of OxFF bytes" |
| check_file_contains_all_0xFF_bytes \ |
| "${file_read_from_flash}" "${file_expected_byte_size}" |
| |
| # Make sure the flash was really erased |
| echo "Checking that firmware is non-functional" |
| check_firmware_is_not_functional |
| |
| rm -rf "${file_read_from_flash}" |
| } |
| |
| echo "Running test to validate RDP level 1" |
| |
| readonly ORIGINAL_FW_FILE="$1" |
| |
| check_file_exists "${ORIGINAL_FW_FILE}" |
| |
| echo "Making sure hardware write protect is DISABLED and software write \ |
| protect is ENABLED" |
| check_hw_write_protect_disabled_and_sw_write_protect_enabled |
| |
| echo "Validating initial state" |
| check_has_mp_rw_firmware |
| check_has_mp_ro_firmware |
| check_running_rw_firmware |
| check_is_rollback_set_to_initial_val |
| |
| echo "Checking that firmware is functional" |
| check_firmware_is_functional |
| |
| test_read_from_flash_in_bootloader_mode_without_modifying_RDP_level |
| |
| test_read_from_flash_in_bootloader_mode_while_setting_RDP_to_level_0 \ |
| "${ORIGINAL_FW_FILE}" |