def __init__(self, **keys): if len(keys) == 1: self.rsAddr = PayloadIPMIv15.extract_rsAddr(keys['data']) self.netFn, self.rsLUN = PayloadIPMIv15.extract_netFn_rsLUN( keys['data']) self.checksum1 = PayloadIPMIv15.extract_checksum1(keys['data']) self.rqAddr = PayloadIPMIv15.extract_rqAddr(keys['data']) self.rqSeq, self.rqLUN = PayloadIPMIv15.extract_rqSeq_rqLUN( keys['data']) self.command = PayloadIPMIv15.extract_command(keys['data']) self.request_data = PayloadIPMIv15.extract_request_data( keys['data']) self.checksum2 = PayloadIPMIv15.extract_checksum2(keys['data']) elif len(keys) == 8: self.rsAddr = keys['rsAddr'] self.netFn = keys['netFn'] self.rsLUN = keys['rsLUN'] self.checksum1 = IPMIHelper.two_complement_checksum(keys['rsAddr'] \ + self.hex_netFN_rsLUN()) self.rqAddr = keys['rqAddr'] self.rqSeq = keys['rqSeq'] self.rqLUN = keys['rqLUN'] self.command = keys['command'] self.request_data = keys['request_data'] self.checksum2 = IPMIHelper.two_complement_checksum(keys['rqAddr'] \ + self.hex_rqSeq_rqLUN() \ + keys['command'] \ + keys['request_data']) else: raise AttributeError( "Only 1 and 8 arguments constructor exists for PayloadIPMIv15 class." )
def __init__(self, **keys): if len(keys) == 1: self.message_tag = PayloadRAKPMessage1.extract_message_tag( keys['data']) self.reserved = PayloadRAKPMessage1.extract_reserved(keys['data']) self.managed_system_session_id = PayloadRAKPMessage1.extract_managed_system_session_id( keys['data']) self.remote_console_random_number = PayloadRAKPMessage1.extract_remote_console_random_number( keys['data']) self.requested_max_privilege = PayloadRAKPMessage1.extract_requested_max_privilege( keys['data']) self.reserved2 = PayloadRAKPMessage1.extract_reserved2( keys['data']) self.user_name_length = PayloadRAKPMessage1.extract_user_name_length( keys['data']) self.user_name = PayloadRAKPMessage1.extract_user_name( keys['data']) elif len(keys) == 4: self.message_tag = '00' self.reserved = '000000' self.managed_system_session_id = PayloadRAKPMessage1.extract_managed_system_session_id( keys['rcmp_open_session_response_managed_system_session_id']) self.remote_console_random_number = IPMIHelper.generate_rakp_remote_console_random_number( ) self.requested_max_privilege = PayloadRAKPMessage1.extract_requested_max_privilege( keys['requested_max_privilege']) self.reserved2 = '0000' self.user_name_length = PayloadRAKPMessage1.extract_user_name_length( keys['user_name_length']) self.user_name = PayloadRAKPMessage1.extract_user_name( keys['user_name'])
def extract_checksum1(data): checksum = data[4:6] calculated_checksum = IPMIHelper.two_complement_checksum(data[0:4]) if checksum == calculated_checksum: return checksum else: raise AttributeError( "Extracted checksum1 vs calculated checksum mismatch.")
def extract_checksum2(data): checksum = data[len(data) - 2:] calculated_checksum = IPMIHelper.two_complement_checksum( data[6:len(data) - 2]) if checksum == calculated_checksum: return checksum else: raise AttributeError( "Extracted checksum2 vs calculated checksum mismatch.")
def __init__(self, **keys): if len(keys) == 2: self.iv = PayloadIPMIMessage.extract_iv(keys['data']) self.SIK = keys['SIK'] self.decrypted_payload = self.decrypt_payload() self.rsAddr = PayloadIPMIMessage.extract_rsAddr( self.decrypted_payload) self.netFn, self.rsLUN = PayloadIPMIMessage.extract_netFn_rsLUN( self.decrypted_payload) self.checksum1 = PayloadIPMIMessage.extract_checksum1( self.decrypted_payload) self.rqAddr = PayloadIPMIMessage.extract_rqAddr( self.decrypted_payload) self.rqSeq, self.rqLUN = PayloadIPMIMessage.extract_rqSeq_rqLUN( self.decrypted_payload) self.command = PayloadIPMIMessage.extract_command( self.decrypted_payload) self.request_data = PayloadIPMIMessage.extract_request_data( self.decrypted_payload) self.checksum2 = PayloadIPMIMessage.extract_checksum2( self.decrypted_payload) elif len(keys) == 8: self.iv = PayloadIPMIMessage.generate_iv() self.SIK = keys['SIK'] self.rsAddr = keys['rsAddr'] self.netFn = keys['netFn'] self.rsLUN = keys['rsLUN'] self.checksum1 = IPMIHelper.two_complement_checksum(keys['rsAddr'] \ + self.hex_netFN_rsLUN()) self.rqAddr = keys['rqAddr'] self.rqSeq = keys['rqSeq'] self.rqLUN = keys['rqLUN'] self.command = keys['command'] self.request_data = keys['request_data'] self.checksum2 = IPMIHelper.two_complement_checksum(keys['rqAddr'] \ + self.hex_rqSeq_rqLUN() \ + keys['command'] \ + keys['request_data']) else: raise AttributeError( "Only 1 and 8 arguments constructor exists for PayloadIPMIv15 class." )
def __repr__(self): return "------- IPMILanRequestMessage -------" \ + "\nciphered_msg : " + self.ciphered_msg \ + "\nipmi_sik : " + self.ipmi_sik \ + "\nRCMP_auth_algorithm : " + self.RCMP_auth_algorithm \ + "\nipmi_k2_key : " + self.ipmi_k2_key \ + "\nipmi_k2_short_key : " + self.ipmi_k2_short_key \ + "\niv : " + self.iv\ + "\nrsAddr : " + self.rsAddr \ + "\nnetFn_rslun : " + self.netFn_rslun \ + "\n netFn : " + self.extract_netFn() + " human readable : " + IPMIHelper.get_netFn_definition(self.extract_netFn())\ + "\n rslun : " + self.extract_rsLun() \ + "\nchecksum_rsAdd_netFn_lun : " + self.checksum_rsAdd_netFn_lun \ + "\nrqAddr : " + self.rqAddr \ + "\nrqSeq_rqLun : " + self.rqSeq_rqLun \ + "\n rqSeq : " + self.extract_rqSeq() \ + "\n rqLun : " + self.extract_rqLun() \ + "\ncommand : " + self.command \ + "\ncommand_data : " + self.command_data \ + "\nchecksum_two : " + self.checksum_two \
def extract_ipmi_payload_authentication(data): payload_type_byte = data[2:4] return IPMIHelper.get_payload_authentication(payload_type_byte)
def extract_ipmi_auth_type(data): auth_type = data[0:2] return IPMIHelper.get_auth_type(auth_type_byte = auth_type)
def extract_rqSeq_rqLUN(data): rqSeq_rqLUN = data[8:10] bits_rqSeq_rqLUN = IPMIHelper.get_bits(rqSeq_rqLUN) return "".join(bits_rqSeq_rqLUN[2:]), "".join(bits_rqSeq_rqLUN[0:2])
def get_confidentiality_payload_integrity_algo(self): byte_hex = self.confidentiality_payload[8:10] bits = IPMIHelper.get_bits(byte_hex) auth_algorithm = bits[0:5] return "".join(auth_algorithm[::-1])
def extract_ipmi_session_seq(data): session_sequence_number = data[12:20] return IPMIHelper.invert_hex(session_sequence_number)
def hex_netFN_rsLUN(self): return IPMIHelper.hexify_binary_string(self.netFn[::-1], self.rsLUN[::-1])
def get_requested_max_privilege_level(self): max_privilege_level = self.requested_max_privilege bits = IPMIHelper.get_bits(max_privilege_level) max_privilege_level_bits = bits[0:3] return "".join(max_privilege_level_bits[::-1])
def get_requested_max_privilege_type(self): max_privilege_type = self.requested_max_privilege bits = IPMIHelper.get_bits(max_privilege_type) max_privilege_type_bit = bits[4] return max_privilege_type_bit
def extract_ipmi_payload_type(data): payload_type_byte = data[2:4] return IPMIHelper.get_payload_type(payload_type_byte)
def hex_rqSeq_rqLUN(self): return IPMIHelper.hexify_binary_string(self.rqSeq[::-1], self.rqLUN[::-1])
def extract_ipmi_session_id(data): session_id = data[4:12] return IPMIHelper.invert_hex(session_id)
def extract_netFn_rsLUN(data): netFn_LUN = data[2:4] bits_netFn_LUN = IPMIHelper.get_bits(netFn_LUN) return "".join(bits_netFn_LUN[2:]), "".join(bits_netFn_LUN[0:2])
def extract_message_length(data): message_length = data[20:24] message_length = IPMIHelper.invert_hex(message_length) return int(message_length, 16)
def get_auth_payload_auth_algo(self): byte_hex = self.auth_payload[8:10] bits = IPMIHelper.get_bits(byte_hex) auth_algorithm = bits[0:5] return "".join(auth_algorithm[::-1])