| *** 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 |
| |
| |
| *** 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 External IPMI Raw 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 |