| *** Settings *** |
| Documentation Secure boot related test cases. |
| |
| # Test Parameters: |
| # SEL to PEL conversion: |
| # https://github.com/openbmc/openbmc-test-automation/blob/master/docs/ |
| # openbmc_test_tools.md#converting-sels-to-readable-format |
| # |
| # Definition of each partition acronyms |
| # HBB: Hostboot Base |
| # HBI: Hostboot Extended Image |
| # HBRT: Hostboot Runtime |
| # HBD: Hostboot Data |
| # HBBL: Bostboot Base loader |
| # SBE: Self Boot Engine |
| # OCC: On Chip Controller |
| # PAYLOAD : OPAL Partition |
| # HCODE : Hardware Code |
| # BOOTKERNEL : OPAL Boot Kernel |
| # WOFDATA : Workload Optimized Frequency Data |
| # MEMD : Memory VPD |
| |
| Resource ../../lib/resource.robot |
| Resource ../../lib/utils.robot |
| Resource ../../lib/state_manager.robot |
| Resource ../../lib/boot_utils.robot |
| Resource ../../lib/secureboot/secureboot.robot |
| Resource ../../lib/open_power_utils.robot |
| Resource ../../lib/logging_utils.robot |
| Resource ../../lib/openbmc_ffdc_methods.robot |
| Resource ../../lib/openbmc_ffdc.robot |
| Resource ../../lib/openbmc_ffdc_utils.robot |
| |
| Library ../../lib/gen_misc.py |
| Library ../../lib/secureboot/secureboot.py |
| |
| Suite Setup Suite Setup Execution |
| Test Setup Test Setup Execution |
| Test Teardown Test Teardown Execution |
| |
| *** Variables *** |
| |
| ${security_access_bit_mask} ${0xC000000000000000} |
| ${pnor_corruption_rc} 1E07 |
| ${bootkernel_corruption_rc} log=0xffffffffffff8160 |
| ${bmc_image_dir_path} /usr/local/share/pnor |
| ${bmc_guard_part_path} /var/lib/phosphor-software-manager/pnor/prsv/GUARD |
| ${HB_PART_LIST} [HBB, HBD, HBI, HBRT, HBBL] |
| ${NON_HB_PART_LIST} [SBE, OCC, HCODE, WOFDATA, MEMD, PAYLOAD] |
| ${MIXED_PART_LIST} [SBE, HBD, OCC, HBRT, HBBL, HCODE, WOFDATA, MEMD, PAYLOAD] |
| |
| *** Test Cases *** |
| |
| # All the test cases requires by default jumpers to be positioned |
| # between 1 & 2. If this is not met test cases would fail |
| Validate Secure Cold Boot With TPM Policy Disabled |
| [Documentation] Validate secure cold boot with TPM policy disabled. |
| [Tags] Validate_Secure_Cold_Boot_With_TPM_Policy_Disabled |
| |
| Validate Secure Boot With TPM Policy Enabled Or Disabled ${0} |
| |
| |
| Validate Secure Cold Boot With TPM Policy Enabled |
| [Documentation] Validate secure cold boot with TPM policy enabled. |
| [Tags] Validate_Secure_Cold_Boot_With_TPM_Policy_Enabled |
| |
| Validate Secure Boot With TPM Policy Enabled Or Disabled ${1} |
| |
| |
| Secure Boot Violation Using Corrupt SBE Image On Cold Boot |
| [Documentation] Secure boot violation using corrupt SBE image on cold boot. |
| [Tags] Secure_Boot_Violation_Using_Corrupt_SBE_Image_On_Cold_Boot |
| |
| Violate Secure Boot Using Corrupt Image |
| ... SBE ${pnor_corruption_rc} ${bmc_image_dir_path} |
| |
| |
| Secure Boot Violation Using Corrupt HBD Image On Cold Boot |
| [Documentation] Secure boot violation using corrupt HBD image on cold boot. |
| [Tags] Secure_Boot_Violation_Using_Corrupt_HBD_Image_On_Cold_Boot |
| |
| Violate Secure Boot Using Corrupt Image |
| ... HBD ${pnor_corruption_rc} ${bmc_image_dir_path} |
| |
| Secure Boot Violation Using Corrupt HBB Image On Cold Boot |
| [Documentation] Secure boot violation using corrupt HBB image on cold boot. |
| [Tags] Secure_Boot_Violation_Using_Corrupt_HBB_Image_On_Cold_Boot |
| |
| Violate Secure Boot Using Corrupt Image |
| ... HBB ${pnor_corruption_rc} ${bmc_image_dir_path} |
| |
| |
| Secure Boot Violation Using Corrupt HBBL Image On Cold Boot |
| [Documentation] Secure boot violation using corrupt HBBL image on cold boot. |
| [Tags] Secure_Boot_Violation_Using_Corrupt_HBBL_Image_On_Cold_Boot |
| |
| Violate Secure Boot Using Corrupt Image |
| ... HBBL ${pnor_corruption_rc} ${bmc_image_dir_path} |
| |
| |
| Secure Boot Violation Using Corrupt HBI Image On Cold Boot |
| [Documentation] Secure boot violation using corrupt HBI image on cold boot. |
| [Tags] Secure_Boot_Violation_Using_Corrupt_HBI_Image_On_Cold_Boot |
| |
| Violate Secure Boot Using Corrupt Image |
| ... HBI ${pnor_corruption_rc} ${bmc_image_dir_path} |
| |
| |
| Secure Boot Violation Using Corrupt HBRT Image On Cold Boot |
| [Documentation] Secure boot violation using corrupt HBRT image on cold boot. |
| [Tags] Secure_Boot_Violation_Using_Corrupt_HBRT_Image_On_Cold_Boot |
| |
| Violate Secure Boot Using Corrupt Image |
| ... HBRT ${pnor_corruption_rc} ${bmc_image_dir_path} |
| |
| |
| Secure Boot Violation Using Corrupt OCC Image On Cold Boot |
| [Documentation] Secure boot violation using corrupt OCC image on cold boot. |
| [Tags] Secure_Boot_Violation_Using_Corrupt_OCC_Image_On_Cold_Boot |
| |
| Violate Secure Boot Using Corrupt Image |
| ... OCC ${pnor_corruption_rc} ${bmc_image_dir_path} |
| |
| |
| Secure Boot Violation Using Corrupt HCODE Image On Cold Boot |
| [Documentation] Secure boot violation using corrupt HCODE image on cold boot. |
| [Tags] Secure_Boot_Violation_Using_Corrupt_HCODE_Image_On_Cold_Boot |
| |
| Violate Secure Boot Using Corrupt Image |
| ... HCODE ${pnor_corruption_rc} ${bmc_image_dir_path} |
| |
| |
| Secure Boot Violation Using Corrupt WOFDATA Image On Cold Boot |
| [Documentation] Secure boot violation using corrupt HCODE image on cold boot. |
| [Tags] Secure_Boot_Violation_Using_Corrupt_WOFDATA_Image_On_Cold_Boot |
| |
| Violate Secure Boot Using Corrupt Image |
| ... WOFDATA ${pnor_corruption_rc} ${bmc_image_dir_path} |
| |
| |
| Secure Boot Violation Using Corrupt BOOTKERNEL Image On Cold Boot |
| [Documentation] Secure boot violation using corrupt BOOTKERNEL image on cold boot. |
| [Tags] Secure_Boot_Violation_Using_Corrupt_BOOTKERNEL_Image_On_Cold_Boot |
| |
| Violate Secure Boot Using Corrupt Image |
| ... BOOTKERNEL ${bootkernel_corruption_rc} ${bmc_image_dir_path} |
| |
| |
| Secure Boot Violation Using Corrupt MEMD Image On Cold Boot |
| [Documentation] Secure boot violation using corrupt MEMD image on cold boot. |
| [Tags] Secure_Boot_Violation_Using_Corrupt_MEMD_Image_On_Cold_Boot |
| |
| Violate Secure Boot Using Corrupt Image |
| ... MEMD ${pnor_corruption_rc} ${bmc_image_dir_path} |
| |
| |
| Secure Boot Violation Using Corrupt PAYLOAD Image On Cold Boot |
| [Documentation] Secure boot violation using corrupt PAYLOAD image on cold boot. |
| [Tags] Secure_Boot_Violation_Using_Corrupt_PAYLOAD_Image_On_Cold_Boot |
| |
| Violate Secure Boot Using Corrupt Image |
| ... PAYLOAD ${pnor_corruption_rc} ${bmc_image_dir_path} |
| |
| |
| *** Keywords *** |
| |
| Validate Secure Boot Setup |
| [Documentation] Validates setup to make sure it's secureboot run capable. |
| |
| # Check the jumper position and Security settings before moving ahead. |
| ${num_procs} ${secureboot_state} ${jumper_state}= Get Secure Boot Info |
| |
| Rprint Vars secureboot_state jumper_state |
| |
| Should Be True ${secureboot_state} == True and ${jumper_state} == False |
| ... msg=Jumper is on while secureboot is disabled. Put the jumpers between pins 2 and 3. |
| |
| Violate Secure Boot Using Corrupt Image |
| [Documentation] Cause secure boot violation during cold boot |
| ... with corrupted image. |
| [Arguments] ${partition} ${error_rc} ${bmc_image_dir_path} |
| |
| # Description of argument(s): |
| # partition The partition which is to be corrupted |
| # (e.g. "SBE", "HBI", "HBB", "HBRT", "HBBL", "OCC"). |
| # error_rc The RC that is expected as a |
| # result of the secure boot violation |
| # (e.g. "SECUREBOOT::RC_ROM_VERIFY"). |
| # bmc_image_dir_path BMC image path. |
| |
| Set And Verify TPM Policy ${1} |
| |
| # Descipiton: |
| # Cause a secure boot violation by copying an BMC image file to the |
| # target BMC and then starting a power on. |
| # This action should result in: |
| # 1) an error log entry |
| # 2) the system going to "Quiesced" state. |
| |
| # Load corrupted image to /usr/local/share/pnor. |
| Open Connection For SCP |
| |
| # Some times it is observed that bigger size files doesn't get copied. |
| # Our intention here is to test bad image. Even if it is truncated/partial, |
| # that should be fine |
| Run Keyword And Ignore Error scp.Put File |
| ... ${ENV_SB_CORRUPTED_BIN_PATH}/${partition} ${bmc_image_dir_path} |
| |
| ${error_log_path}= Catenate ${SB_LOG_DIR_PATH} |
| Create Directory ${error_log_path} |
| |
| Set Global Variable ${error_log_path} |
| Log ${error_log_path} |
| |
| # Starting a power on. |
| BMC Execute Command /usr/bin/obmcutil poweron |
| Wait Until Keyword Succeeds 15 min 15 sec Error Logs Should Exist |
| |
| # Check for eSEL. |
| # Expected behavior is that the error occurs early in the boot process, |
| # therefore, no entry in the error log and nothing to decode. |
| # The 1E07 error is written to PNOR & then goes into Quiesced state. |
| # On the next valid boot, the error log will be sent to BMC & |
| # seen on SOL console. |
| # We won't see any ESEL's for HBB, HBD, HBI or BOOTKERNEL because |
| # Hostboot has no mechanism to send an eSEL when it is dying. |
| Run Keyword If '${partition}' not in ['HBB', 'HBD', 'HBI', 'BOOTKERNEL'] |
| ... Wait Until Keyword Succeeds 5 min 5 sec |
| ... Collect Error Logs and Verify SRC ${error_rc} ${error_log_path} |
| |
| # Remove the file from /usr/local/share/pnor/. |
| BMC Execute Command rm -rf ${bmc_image_dir_path}* |
| |
| # Check if system reaches quiesce state. |
| # Default system state will be power off at the end of the verification. |
| Run Keywords |
| ... Wait Until Keyword Succeeds 3 min 5 sec Is Host Quiesced AND |
| ... Recover Quiesced Host |
| |
| # We will retry boot with corrupted partition removed |
| # SOL console should show previous boot fail message (1E07) on current boot |
| # HBB, HBD or HBI corruption will never get far enough to log into PNOR. |
| # so, it should be removed from consideration for this check |
| Run Keyword If '${partition}' in ['HBB', 'HBD', 'HBI'] |
| ... Log To Console No more action on ${partition} corruption required. |
| ... ELSE IF '${partition}' in ['HBRT'] |
| ... Run Keywords |
| ... REST Power On stack_mode=skip quiet=1 AND |
| ... Wait Until Keyword Succeeds 5 min 5 sec Error Logs Should Exist AND |
| ... Get And Verify Partition Corruption ${partition} ${sol_log_file_path} AND |
| ... REST Power Off stack_mode=skip quiet=1 |
| |
| Collect Error Logs and Verify SRC |
| [Documentation] Verify error log entry & signature description. |
| [Arguments] ${error_rc} ${log_prefix} |
| |
| # Description of argument(s): |
| # error_rc Error log signature description. |
| # log_prefix Log path prefix. |
| |
| Error Logs Should Exist |
| |
| Collect eSEL Log ${log_prefix} |
| ${error_log_file_path}= Catenate ${log_prefix}esel.txt |
| ${rc} ${output}= Run and Return RC and Output |
| ... grep -i ${error_rc} ${error_log_file_path} |
| Should Be Equal ${rc} ${0} |
| Should Not Be Empty ${output} |
| |
| Get And Verify Security Access Bit |
| [Documentation] Get and verify security access bit. |
| [Arguments] ${sol_log_file_path} |
| |
| # Description of argument(s): |
| # sol_log_file_path The path to the file containing SOL data |
| # which was collected during a REST Power On. |
| |
| # Sample output: |
| # 19.68481|SECURE|Security Access Bit> 0xC000000000000000 |
| |
| ${cmd}= Catenate |
| ... grep "Security Access Bit" ${sol_log_file_path} | awk '{ print $4 }' |
| ${rc} ${security_access_bit_str}= Run and Return RC and Output ${cmd} |
| Should Be Equal ${rc} ${0} |
| ... msg=Return code from ${cmd} not zero. |
| |
| # Verify the value of "Security Access Bit". |
| # If fails, probable issue is Jumper position. |
| |
| ${security_access_bit}= Convert to Integer ${security_access_bit_str} |
| ${result}= Evaluate ${security_access_bit_mask} & ${security_access_bit} |
| Should Be Equal ${result} ${security_access_bit_mask} |
| ... msg=System is not booted in secure mode. values=False |
| |
| Get And Verify Partition Corruption |
| [Documentation] Get and verify partition corruption. |
| [Arguments] ${partition} ${sol_log_file_path} |
| |
| # Description of argument(s): |
| # partition The partition which is to be corrupted |
| # (e.g. "SBE", "HBI", "HBB", "HBRT", "HBBL", "OCC"). |
| # sol_log_file_path The path to the file containing SOL data |
| # which was collected during a REST Power On. |
| |
| # Sample output: |
| # 44.47498|secure|Secureboot Failure plid = 0x90000007, rc = 0x1E07 |
| # OR |
| # 14.94315|Error reported by secure (0x1E00) PLID 0x90000002 |
| # 14.99659| ROM_verify() Call Failed |
| # 14.99659| ModuleId 0x03 SECUREBOOT::MOD_SECURE_ROM_VERIFY |
| # 14.99660| ReasonCode 0x1e07 SECUREBOOT::RC_ROM_VERIFY |
| # OR |
| # 113.150162849,0] STB: BOOTKERNEL verification FAILED. log=0xffffffffffff8160 |
| # |
| |
| ${cmd}= Run Keyword If '${partition}' in '${MIXED_PART_LIST}' |
| ... Catenate |
| ... grep -i "Secureboot Failure" ${sol_log_file_path} | awk '{ print $8 }' |
| ... ELSE IF '${partition}' == 'HBI' |
| ... Catenate |
| ... grep -i "ReasonCode" ${sol_log_file_path} | awk '{ print $3 }' |
| ... ELSE IF '{$partition}' == 'BOOTKERNEL' |
| ... Catenate |
| ... grep -i "STB: BOOTKERNEL verification FAILED" ${sol_log_file_path} | awk '{ print $7}' |
| |
| ${rc} ${corruption_rc_str}= Run and Return RC and Output ${cmd} |
| Should Be Equal ${rc} ${0} |
| ... msg=Return code from ${cmd} not zero. |
| |
| # Verify the RC 0x1E07 from sol output". |
| Should Be Equal As Strings |
| ... ${corruption_rc_str} 0x${pnor_corruption_rc} ignore_case=True |
| ... msg=SB violation due to PNOR partition corruption not reported. values=False |
| |
| |
| Validate Secure Boot With TPM Policy Enabled Or Disabled |
| [Documentation] Validate secure boot with TPM policy enabled or disabled. |
| [Arguments] ${tpm_policy} |
| |
| # Description of argument(s): |
| # tpm_policy Enable-0 or Disable-1. |
| |
| Set And Verify TPM Policy ${tpm_policy} |
| REST Power On quiet=1 |
| Validate Secure Boot ${sol_log_file_path} |
| |
| |
| Validate Secure Boot |
| [Documentation] Validate secure boot. |
| [Arguments] ${sol_log_file_path} |
| |
| # Description of argument(s): |
| # sol_log_file_path The path to the file containing SOL data |
| # which was collected during a REST Power On. |
| |
| Get And Verify Security Access Bit ${sol_log_file_path} |
| Error Logs Should Not Exist |
| REST Verify No Gard Records |
| |
| |
| Suite Setup Execution |
| [Documentation] Suite Setup Execution. |
| |
| ${bmc_image_dir_path}= Add Trailing Slash ${bmc_image_dir_path} |
| |
| ${SB_LOG_DIR_PATH}= Catenate ${EXECDIR}/SB_logs/ |
| Set Suite Variable ${SB_LOG_DIR_PATH} |
| |
| Create Directory ${SB_LOG_DIR_PATH} |
| Empty Directory ${SB_LOG_DIR_PATH} |
| |
| Set Global Variable ${bmc_image_dir_path} |
| Log ${bmc_image_dir_path} |
| BMC Execute Command rm -rf ${bmc_image_dir_path}* |
| |
| Set Global Variable ${bmc_guard_part_path} |
| Log ${bmc_guard_part_path} |
| BMC Execute Command rm -rf ${bmc_guard_part_path} |
| |
| # All the corrupted binaries will go in here |
| # Run this as input param |
| Valid Path ENV_SB_CORRUPTED_BIN_PATH |
| Valid Path ESEL_BIN_PATH |
| Set Environment Variable PATH %{PATH}:${ENV_SB_CORRUPTED_BIN_PATH}:${ESEL_BIN_PATH} |
| |
| |
| Test Setup Execution |
| [Documentation] Test setup execution. |
| |
| ${timestamp}= Get Current Date result_format=%Y%m%d%H%M%S |
| ${sol_log_file_path}= Catenate ${EXECDIR}/Secure_SOL${timestamp} |
| Start SOL Console Logging ${sol_log_file_path} |
| Set Suite Variable ${sol_log_file_path} |
| |
| REST Power On stack_mode=skip quiet=1 |
| |
| # Validate the secureboot setup. If not met with required state then, fail. |
| Validate Secure Boot Setup |
| |
| REST Power Off stack_mode=skip quiet=1 |
| Delete Error Logs And Verify |
| |
| |
| Test Teardown Execution |
| [Documentation] Test teardown execution. |
| |
| Stop SOL Console Logging |
| Run rm -rf ${sol_log_file_path} |
| |
| # Collect FFDC on failure |
| FFDC On Test Case Fail |
| |
| # Removing the corrupted file from BMC. |
| BMC Execute Command rm -rf ${bmc_image_dir_path}* |