
module Rex
module Proto
module IPMI

class Channel_Auth_Reply < BitStruct
	unsigned :rmcp_version,                    8,     "RMCP Version"
	unsigned :rmcp_padding,                    8,     "RMCP Padding"
	unsigned :rmcp_sequence,                   8,     "RMCP Sequence"
	unsigned :rmcp_mtype,                      1,     "RMCP Message Type"
	unsigned :rmcp_class,                      7,     "RMCP Message Class"

	unsigned :session_auth_type,               8,     "Session Auth Type"
	unsigned :session_sequence,               32,     "Session Sequence Number"
	unsigned :session_id,                     32,     "Session ID"
	unsigned :message_length,                  8,     "Message Length"

	unsigned :ipmi_tgt_address,                8,     "IPMI Target Address"
	unsigned :ipmi_tgt_lun,                    8,     "IPMI Target LUN"
	unsigned :ipmi_header_checksum,            8,     "IPMI Header Checksum"
	unsigned :ipmi_src_address,                8,     "IPMI Source Address"
	unsigned :ipmi_src_lun,                    8,     "IPMI Source LUN"
	unsigned :ipmi_command,                    8,     "IPMI Command"
	unsigned :ipmi_completion_code,            8,     "IPMI Completion Code"

	unsigned :ipmi_channel,                    8,     "IPMI Channel"

	unsigned :ipmi_compat_20,                  1,     "IPMI Version Compatibility: IPMI 2.0+"
	unsigned :ipmi_compat_reserved1,           1,     "IPMI Version Compatibility: Reserved 1"
	unsigned :ipmi_compat_oem_auth,            1,     "IPMI Version Compatibility: OEM Authentication"
	unsigned :ipmi_compat_password,            1,     "IPMI Version Compatibility: Straight Password"
	unsigned :ipmi_compat_reserved2,           1,     "IPMI Version Compatibility: Reserved 2"
	unsigned :ipmi_compat_md5,                 1,     "IPMI Version Compatibility: MD5"
	unsigned :ipmi_compat_md2,                 1,     "IPMI Version Compatibility: MD2"
	unsigned :ipmi_compat_none,                1,     "IPMI Version Compatibility: None"

	unsigned :ipmi_user_reserved1,             2,     "IPMI User Compatibility: Reserved 1"
	unsigned :ipmi_user_kg,                    1,     "IPMI User Compatibility: KG Set to Default"
	unsigned :ipmi_user_disable_message_auth,  1,     "IPMI User Compatibility: Disable Per-Message Authentication"
	unsigned :ipmi_user_disable_user_auth,     1,     "IPMI User Compatibility: Disable User-Level Authentication"
	unsigned :ipmi_user_non_null,              1,     "IPMI User Compatibility: Non-Null Usernames Enabled"
	unsigned :ipmi_user_null,                  1,     "IPMI User Compatibility: Null Usernames Enabled"
	unsigned :ipmi_user_anonymous,             1,     "IPMI User Compatibility: Anonymous Login Enabled"

	unsigned :ipmi_conn_reserved1,             6,     "IPMI Connection Compatibility: Reserved 1"
	unsigned :ipmi_conn_20,                    1,     "IPMI Connection Compatibility: 2.0"
	unsigned :ipmi_conn_15,                    1,     "IPMI Connection Compatibility: 1.5"

	unsigned :ipmi_oem_id,                    24,     "IPMI OEM ID", :endian => 'little'

	rest :ipm_oem_data, "IPMI OEM Data + Checksum Byte"


	def to_banner
		info   = self
		banner = "#{(info.ipmi_compat_20 == 1) ? "IPMI-2.0" : "IPMI-1.5"} "

		pass_info = []
		pass_info << "oem_auth" if info.ipmi_compat_oem_auth == 1
		pass_info << "password" if info.ipmi_compat_password == 1
		pass_info << "md5" if info.ipmi_compat_md5 == 1
		pass_info << "md2" if info.ipmi_compat_md2 == 1
		pass_info << "null" if info.ipmi_compat_none == 1

		user_info = []
		user_info << "kg_default" if (info.ipmi_compat_20 == 1 and info.ipmi_user_kg == 1)
		user_info << "auth_msg" unless info.ipmi_user_disable_message_auth == 1
		user_info << "auth_user" unless info.ipmi_user_disable_user_auth == 1
		user_info << "non_null_user" if info.ipmi_user_non_null == 1
		user_info << "null_user" if info.ipmi_user_null == 1
		user_info << "anonymous_user" if info.ipmi_user_anonymous == 1

		conn_info = []
		conn_info << "1.5" if info.ipmi_conn_15 == 1
		conn_info << "2.0" if info.ipmi_conn_20 == 1

		if info.ipmi_oem_id != 0
			banner << "OEMID:#{info.ipmi_oem_id} "
		end

		banner << "UserAuth(#{user_info.join(", ")}) PassAuth(#{pass_info.join(", ")}) Level(#{conn_info.join(", ")}) "
		banner
	end
end

end
end
end
