blob: d035efe68159eb2f416719f703f928f7420720e1 [file] [log] [blame]
*** Settings ***
Documentation Module to test IPMI chipher functionality.
Resource ../lib/ipmi_client.robot
Resource ../lib/openbmc_ffdc.robot
Resource ../lib/bmc_network_utils.robot
Library ../lib/ipmi_utils.py
Library ../lib/var_funcs.py
Variables ../data/ipmi_raw_cmd_table.py
Library String
Suite Setup IPMI Cipher Suite Setup
Test Setup Printn
Test Teardown FFDC On Test Case Fail
Force Tags IPMI_Cipher
*** Variables ***
${cipher_suite} standard
&{payload_type} ipmi=0 sol=1
@{list_index_value} 0x80 0x00
*** Test Cases ***
Verify Supported Ciphers
[Documentation] Execute all supported ciphers and verify.
[Tags] Verify_Supported_Ciphers
FOR ${cipher} IN @{valid_ciphers}
Run External IPMI Standard Command power status C=${cipher}
END
Verify Unsupported Ciphers
[Documentation] Execute all unsupported ciphers and verify error.
[Tags] Verify_Unsupported_Ciphers
FOR ${cipher} IN @{unsupported_ciphers}
Run Keyword And Expect Error *invalid * algorithm*
... Run External IPMI Standard Command power status C=${cipher}
END
Verify Supported Ciphers Via Lan Print
[Documentation] Verify supported ciphers via IPMI lan print command.
[Tags] Verify_Supported_Ciphers_Via_Lan_Print
${lan_print}= Get Lan Print Dict
# Example 'RMCP+ Cipher Suites' entry: 3,17
${ciphers}= Split String ${lan_print['RMCP+ Cipher Suites']} ,
Rprint Vars ciphers
Valid List ciphers valid_values=${valid_ciphers}
Verify Supported Cipher Via Getciphers
[Documentation] Verify supported cihpers via IPMI getciphers command.
[Tags] Verify_Supported_Cipher_Via_Getciphers
# Example output from 'Channel Getciphers IPMI':
# ipmi_channel_ciphers:
# [0]:
# [id]: 3
# [iana]: N/A
# [auth_alg]: hmac_sha1
# [integrity_alg]: hmac_sha1_96
# [confidentiality_alg]: aes_cbc_128
# [1]:
# [id]: 17
# [iana]: N/A
# [auth_alg]: hmac_sha256
# [integrity_alg]: sha256_128
# [confidentiality_alg]: aes_cbc_128
${ipmi_channel_ciphers}= Channel Getciphers IPMI
# Example cipher entry: 3 17
Rprint Vars ipmi_channel_ciphers
${ipmi_channel_cipher_ids}= Nested Get id ${ipmi_channel_ciphers}
Rpvars ipmi_channel_cipher_ids
Valid List ipmi_channel_cipher_ids valid_values=${valid_ciphers}
Verify Cipher Suite And Supported Algorithms Via IPMI Raw Command
[Documentation] Verify cipher ID and Supported Algorithms for all Available Channels.
[Tags] Verify_Cipher_Suite_And_Supported_Algorithms_Via_IPMI_Raw_Command
[Template] Verify Cipher ID and Supported Algorithm For Channel
FOR ${channel} IN @{active_channel_list}
FOR ${name} ${type} IN &{payload_type}
FOR ${index_value} IN @{list_index_value}
# Input Channel Payload type Index value 0x80 or 0x00
${channel} ${type} ${index_value}
END
END
END
Verify Get Cipher Suite Command For Invalid Channels
[Documentation] Verify Get Cipher Suite Command For all Invalid Channels.
[Tags] Verify_Get_Cipher_Suite_Command_For_Invalid_Channels
[Template] Verify Cipher Suite For Invalid Channel
FOR ${channel} IN @{inactive_channel_list}
# Input Channel
${channel}
END
Verify Get Cipher Suite Raw Command With Invalid Data Length
[Documentation] Verify Get Cipher Suite Raw Command With One Extra and Less Byte.
[Tags] Verify_Get_Cipher_Suite_Raw_Command_With_Invalid_Data_Length
[Template] Verify Cipher Suite Command for Invalid Request Data
# Byte
less
extra
*** Keywords ***
IPMI Cipher Suite Setup
[Documentation] Get active and inactive/invalid channels from channel_config.json file
... in list type and set it as suite variable.
# Get active channel list and set as a suite variable.
@{active_channel_list}= Get Active Ethernet Channel List current_channel=1
Set Suite Variable @{active_channel_list}
# Get Inactive/Invalid channel list and set as a suite variable.
@{inactive_channel_list}= Get Invalid Channel Number List
Set Suite Variable @{inactive_channel_list}
Verify Standard Cipher Suite For Channel
[Documentation] Get the supported algorithms from data/ipmi_raw_cmd_table.py and
... split into list and compare it with the given data list.
[Arguments] ${data_list} ${channel_number}
# Description of argument(s):
# data_list cipher suite records in list
# e.g [01, c0, 11, 03, 44, 81]
${supported_algorithms}= Split String ${IPMI_RAW_CMD['Cipher Suite']['get'][1]}
${cipher_suite_id}= Convert To Integer ${data_list}[2] base=16
Should Be Equal ${data_list}[0] ${channel_number}
Should Be Equal ${data_list}[1] c0
Should Be Equal As Integers ${cipher_suite_id} ${valid_ciphers}[0]
List Should Contain Value ${supported_algorithms} ${data_list}[3]
List Should Contain Value ${supported_algorithms} ${data_list}[4]
List Should Contain Value ${supported_algorithms} ${data_list}[5]
Verify Algorithm by Cipher Suite For Channel
[Documentation] Spilt the given response data, store it in a list.
[Arguments] ${response_data} ${channel_number}
# Description of argument(s):
# response_data response data of get channel cipher suite ipmi raw command
# e.g 01 c0 11 03 44 81 ---> list of algorithms by cipher suite (0x80 in request data 3rd byte)
# ${channel_number} Interface channel number
@{expected_data_list}= Split String ${response_data}
Run Keyword If '${cipher_suite}' == 'standard'
... Verify Standard Cipher Suite For Channel ${expected_data_list} ${channel_number}
Verify Supported Algorithm For Channel
[Documentation] Compare the supported algorithms got from ipmi_raw_cmd_table with
... given response.
[Arguments] ${response_data} ${channel_number}
# Description of argument(s):
# response_data response data of get channel cipher suite ipmi raw command.
# channel_number Interface Channel Number.
# expected data will be like " 01 03 44 81 ".
${expected_data}= Catenate ${channel_number} ${IPMI_RAW_CMD['Cipher Suite']['get'][1]}
Should Be Equal ${expected_data} ${response_data}
Verify Cipher ID and Supported Algorithm For Channel
[Documentation] Verify Cipher ID and Supported Algorithm on given channel.
[Arguments] ${channel_num} ${payload_type} ${index_value}
# Description of argument(s):
# channel_num Interface channel number.
# payload_type IPMI(0x00) or Sol(0x01).
# index_value 0x80 for list algorithm by cipher suite.
# 0x00 for supported algorithms.
${cmd}= Catenate ${IPMI_RAW_CMD['Cipher Suite']['get'][0]}
... ${channel_num} ${payload_type} ${index_value}
${resp}= Run IPMI Command ${cmd}
${resp}= Strip String ${resp}
# channel 14 represents current channel in which we send request.
${channel_num}= Run Keyword If '${channel_num}' == '14'
... Convert To Hex ${CHANNEL_NUMBER} length=2
... ELSE
... Convert To Hex ${channel_num} length=2
Run Keyword If '${index_value}' == '0x80'
... Verify Algorithm by Cipher Suite For Channel ${resp} ${channel_num}
... ELSE
... Verify Supported Algorithm For Channel ${resp} ${channel_num}
Verify Cipher Suite For Invalid Channel
[Documentation] Execute cipher suite ipmi cmd for invalid channel and verify Error code.
[Arguments] ${channel_number}
# Description of argument(s):
# channel_number Interface channel number.
${cmd}= Catenate ${IPMI_RAW_CMD['Cipher Suite']['get'][0]} ${channel_number} 00 00
Verify Invalid IPMI Command ${cmd} 0xcc
Verify Cipher Suite Command for Invalid Request Data
[Documentation] Verify Cipher Suite Command with Invalid data Length.
[Arguments] ${byte_length}
# Description of argument(s):
# byte_length extra or less.
${req_cmd}= Run Keyword If '${byte_length}' == 'less'
... Catenate ${IPMI_RAW_CMD['Cipher Suite']['get'][0]} ${CHANNEL_NUMBER} 00
... ELSE
... Catenate ${IPMI_RAW_CMD['Cipher Suite']['get'][0]} ${CHANNEL_NUMBER} 00 00 01
Verify Invalid IPMI Command ${req_cmd} 0xc7