diff -r bad0cc58d154 -r c74b3d9f6b9e eapol/eapol_framework/eapol_common/core/eapol_handle_tlv_message_data.cpp --- a/eapol/eapol_framework/eapol_common/core/eapol_handle_tlv_message_data.cpp Tue Aug 31 15:16:37 2010 +0300 +++ b/eapol/eapol_framework/eapol_common/core/eapol_handle_tlv_message_data.cpp Wed Sep 01 12:23:57 2010 +0100 @@ -16,13 +16,13 @@ */ /* -* %version: 36 % +* %version: 31.1.3 % */ // This is enumeration of EAPOL source code. #if defined(USE_EAP_MINIMUM_RELEASE_TRACES) #undef EAP_FILE_NUMBER_ENUM - #define EAP_FILE_NUMBER_ENUM 715 + #define EAP_FILE_NUMBER_ENUM 40 #undef EAP_FILE_NUMBER_DATE #define EAP_FILE_NUMBER_DATE 1127594498 #endif //#if defined(USE_EAP_MINIMUM_RELEASE_TRACES) @@ -59,18 +59,2451 @@ EAP_FUNC_EXPORT eapol_handle_tlv_message_data_c::eapol_handle_tlv_message_data_c( abs_eap_am_tools_c * const tools) - : eap_process_tlv_message_data_c(tools) + : eap_tlv_message_data_c(tools) , m_am_tools(tools) , m_is_valid(true) { } +//------------------------------------------------------------------- + +/** + * This function should increase reference count. + */ +EAP_FUNC_EXPORT void eapol_handle_tlv_message_data_c::object_increase_reference_count() +{ +} + +//------------------------------------------------------------------- + +/** + * This function should first decrease reference count + * and second return the remaining reference count. + * Reference count must not be decreased when it is zero. + */ +EAP_FUNC_EXPORT u32_t eapol_handle_tlv_message_data_c::object_decrease_reference_count() +{ + return 0; +} + //-------------------------------------------------- EAP_FUNC_EXPORT bool eapol_handle_tlv_message_data_c::get_is_valid() { - return m_is_valid && eap_process_tlv_message_data_c::get_is_valid(); + return m_is_valid && eap_tlv_message_data_c::get_is_valid(); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT u32_t eapol_handle_tlv_message_data_c::get_payload_size( + const eap_am_network_id_c * const network_id) const +{ + return + (3ul * eap_tlv_header_c::get_header_length() // Each attribute have their own header. + + network_id->get_source_id()->get_data_length() + + network_id->get_destination_id()->get_data_length() + + sizeof(network_id->get_type())); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT u32_t eapol_handle_tlv_message_data_c::get_payload_size( + const abs_eap_state_notification_c * const state) const +{ + return + (7ul * eap_tlv_header_c::get_header_length()) // Each attribute have their own header. + + (get_payload_size(state->get_send_network_id()) + + sizeof(u32_t) // eap_protocol_layer_e + + sizeof(state->get_protocol()) + + eap_expanded_type_c::get_eap_expanded_type_size() + + sizeof(state->get_current_state()) + + sizeof(u32_t) // bool is_client + + sizeof(u32_t) // eap_status_e authentication error + ); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT u32_t eapol_handle_tlv_message_data_c::get_payload_size( + const eapol_session_key_c * const session_key) const +{ + return + ((5ul * eap_tlv_header_c::get_header_length()) // Each attribute have their own header. + + session_key->get_key()->get_data_length() + + session_key->get_sequence_number()->get_data_length() + + sizeof(u32_t) // const eapol_key_type_e m_key_type + + sizeof(session_key->get_key_index()) + + sizeof(u32_t) // const bool m_key_tx_bit + ); +} + +//-------------------------------------------------- + +#if defined(USE_EAP_SIMPLE_CONFIG) + +EAP_FUNC_EXPORT u32_t eapol_handle_tlv_message_data_c::get_payload_size( + network_key_and_index_c * key) const +{ + u32_t size(0ul); + + if (key != 0) + { + size += eap_tlv_header_c::get_header_length() + + sizeof(key->get_network_key_index()) // Size of Network Key Index + + eap_tlv_header_c::get_header_length() + + key->get_network_key()->get_data_length() // Size of Network Key + ; + } + + return (size); +} + +#endif // #if defined(USE_EAP_SIMPLE_CONFIG) + +//-------------------------------------------------- + +#if defined(USE_EAP_SIMPLE_CONFIG) + +EAP_FUNC_EXPORT u32_t eapol_handle_tlv_message_data_c::get_payload_size( + EAP_TEMPLATE_CONST eap_array_c * network_keys) const +{ + u32_t size(0ul); + + for (u32_t ind_network_key = 0ul; ind_network_key < network_keys->get_object_count(); ind_network_key++) + { + network_key_and_index_c * const key = network_keys->get_object(ind_network_key); + if (key != 0) + { + size += eap_tlv_header_c::get_header_length() // Size of structure header + + get_payload_size(key); // Size of Network Key + } + } // for () + + return (size); +} + +#endif // #if defined(USE_EAP_SIMPLE_CONFIG) + +//-------------------------------------------------- + +#if defined(USE_EAP_SIMPLE_CONFIG) + +EAP_FUNC_EXPORT u32_t eapol_handle_tlv_message_data_c::get_payload_size( + simple_config_credential_c * const credential) const +{ + u32_t size(0ul); + + if (credential != 0) + { + size += eap_tlv_header_c::get_header_length() + + sizeof(credential->get_network_index()) // Size of Network Index + + eap_tlv_header_c::get_header_length() + + credential->get_SSID()->get_data_length() // Size of SSID + + eap_tlv_header_c::get_header_length() + + sizeof(u16_t) // Size of Authentiction type + + eap_tlv_header_c::get_header_length() + + sizeof(u16_t) // Size of Encryption type + ; + + size += eap_tlv_header_c::get_header_length() // Size of header of Array + + get_payload_size(credential->get_network_keys()); + + size += eap_tlv_header_c::get_header_length() + + credential->get_MAC_address()->get_data_length() // Size of MAC Address + ; + } + + return (size); +} + +#endif // #if defined(USE_EAP_SIMPLE_CONFIG) + +//-------------------------------------------------- + +#if defined(USE_EAP_SIMPLE_CONFIG) + +EAP_FUNC_EXPORT u32_t eapol_handle_tlv_message_data_c::get_payload_size( + EAP_TEMPLATE_CONST eap_array_c * const credential_array) const +{ + u32_t size(0ul); + + for (u32_t ind_credential = 0ul; ind_credential < credential_array->get_object_count(); ind_credential++) + { + simple_config_credential_c * const credential = credential_array->get_object(ind_credential); + if (credential != 0) + { + size += eap_tlv_header_c::get_header_length() // Size of structure header + + get_payload_size(credential); + } + } // for () + + return (size); +} + +#endif // #if defined(USE_EAP_SIMPLE_CONFIG) + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_structured_parameter_header( + const eapol_tlv_message_type_e type, + const u32_t length) +{ + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_structured_parameter_header(): type=%s\n"), + get_type_string(type))); + + return add_message_header( + type, + length); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const eapol_tlv_message_type_e type, + const u32_t integer) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s\n"), + get_type_string(type))); + + const u32_t network_order_integer(eap_htonl(integer)); + + eap_status_e status = add_message_data( + type, + sizeof(network_order_integer), + &network_order_integer); + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const u64_t long_integer) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s\n"), + get_type_string(eapol_tlv_message_type_u64_t))); + + const u64_t network_order_long_integer(eap_htonll(long_integer)); + + eap_status_e status = add_message_data( + eapol_tlv_message_type_u64_t, + sizeof(network_order_long_integer), + &network_order_long_integer); + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const u32_t integer) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s\n"), + get_type_string(eapol_tlv_message_type_u32_t))); + + const u32_t network_order_integer(eap_htonl(integer)); + + eap_status_e status = add_message_data( + eapol_tlv_message_type_u32_t, + sizeof(network_order_integer), + &network_order_integer); + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const u16_t short_integer) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s\n"), + get_type_string(eapol_tlv_message_type_u16_t))); + + const u16_t network_order_short_integer(eap_htons(short_integer)); + + eap_status_e status = add_message_data( + eapol_tlv_message_type_u16_t, + sizeof(network_order_short_integer), + &network_order_short_integer); + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const u8_t byte_integer) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s\n"), + get_type_string(eapol_tlv_message_type_u8_t))); + + eap_status_e status = add_message_data( + eapol_tlv_message_type_u8_t, + sizeof(byte_integer), + &byte_integer); + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const bool boolean) +{ + const u32_t value((boolean == false) ? 0u: 1u); + + return add_parameter_data( + eapol_tlv_message_type_boolean, + value); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const eap_status_e status) +{ + const u32_t value(static_cast(status)); + + return add_parameter_data( + eapol_tlv_message_type_eap_status, + value); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const eapol_tlv_message_type_function_e function) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s, function=%s\n"), + get_type_string(eapol_tlv_message_type_function), + get_function_string(function))); + + if (function < eapol_tlv_message_type_function_none + || function >= eapol_tlv_message_type_function_illegal_value) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + const u32_t network_order_function(eap_htonl(function)); + + eap_status_e status = add_message_data( + eapol_tlv_message_type_function, + sizeof(network_order_function), + &network_order_function); + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const eap_variable_data_c * const variable_data) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s\n"), + get_type_string(eapol_tlv_message_type_variable_data))); + + if (variable_data == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + eap_status_e status(eap_status_process_general_error); + + if (variable_data->get_is_valid_data() == false) + { + // Empty variable data. Add just the header. + status = add_structured_parameter_header( + eapol_tlv_message_type_variable_data, + 0ul); + } + else + { + status = add_message_data( + eapol_tlv_message_type_variable_data, + variable_data->get_data_length(), + variable_data->get_data()); + } + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const eap_am_network_id_c * const network_id) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s\n"), + get_type_string(eapol_tlv_message_type_network_id))); + + if (network_id == 0 + || network_id->get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + const u32_t size_of_network_id = get_payload_size(network_id); + + eap_status_e status = add_structured_parameter_header( + eapol_tlv_message_type_network_id, + size_of_network_id); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data( + network_id->get_source_id()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data( + network_id->get_destination_id()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data( + network_id->get_type()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const eap_buf_chain_wr_c * const packet_buffer) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s\n"), + get_type_string(eapol_tlv_message_type_variable_data))); + + if (packet_buffer == 0 + || packet_buffer->get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + eap_status_e status = add_message_data( + eapol_tlv_message_type_variable_data, + packet_buffer->get_data_length(), + packet_buffer->get_data(packet_buffer->get_data_length())); + + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const eapol_session_key_c * const session_key) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s\n"), + get_type_string(eapol_tlv_message_type_session_key))); + + if (session_key == 0 + || session_key->get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + const u32_t size_of_session_key(get_payload_size(session_key)); + + eap_status_e status = add_structured_parameter_header( + eapol_tlv_message_type_session_key, + size_of_session_key); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data( + session_key->get_key()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data( + session_key->get_sequence_number()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data( + eapol_tlv_message_type_eapol_key_type, + static_cast(session_key->get_key_type())); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(session_key->get_key_index()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(session_key->get_key_tx_bit()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const abs_eap_state_notification_c * const state) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s\n"), + get_type_string(eapol_tlv_message_type_eap_state_notification))); + + if (state == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + const u32_t size_of_state(get_payload_size(state)); + + eap_status_e status = add_structured_parameter_header( + eapol_tlv_message_type_eap_state_notification, + size_of_state); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(state->get_send_network_id()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data( + eapol_tlv_message_type_eap_protocol_layer, + static_cast(state->get_protocol_layer())); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(state->get_protocol()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(state->get_eap_type()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(state->get_current_state()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(state->get_is_client()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(state->get_authentication_error()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const eap_type_value_e eap_type) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s\n"), + get_type_string(eapol_tlv_message_type_eap_type))); + + void * type_buffer = 0; + + eap_status_e status = allocate_message_buffer( + eapol_tlv_message_type_eap_type, + eap_expanded_type_c::get_eap_expanded_type_size(), + &type_buffer); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = eap_expanded_type_c::write_type( + m_am_tools, + 0ul, ///< Index is from 0 to n. Index 0 is the first EAP type field after base EAP header. + type_buffer, + eap_expanded_type_c::get_eap_expanded_type_size(), + true, ///< True value writes always Extented Type. + eap_type ///< The EAP type to be written. + ); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eap_tlv_message_data_c::add_message_data(): type %2d=0x%08x, length %3d=0x%08x\n"), + eapol_tlv_message_type_eap_type, + eapol_tlv_message_type_eap_type, + eap_expanded_type_c::get_eap_expanded_type_size(), + eap_expanded_type_c::get_eap_expanded_type_size())); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("add_message_data()"), + type_buffer, + eap_expanded_type_c::get_eap_expanded_type_size())); + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + const eap_general_header_base_c * const packet_data) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s\n"), + get_type_string(eapol_tlv_message_type_variable_data))); + + if (packet_data == 0 + || packet_data->get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + eap_status_e status = add_message_data( + eapol_tlv_message_type_variable_data, + packet_data->get_header_buffer_length(), + packet_data->get_header_buffer(packet_data->get_header_buffer_length())); + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); +} + +//-------------------------------------------------- + +#if defined(USE_EAP_SIMPLE_CONFIG) + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::add_parameter_data( + EAP_TEMPLATE_CONST eap_array_c * const credential_array) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::add_parameter_data(): type=%s\n"), + get_type_string(eapol_tlv_message_type_protected_setup_credential))); + + if (credential_array == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + const u32_t size_of_credential_array(get_payload_size(credential_array)); + + eap_status_e status = add_structured_parameter_header( + eapol_tlv_message_type_array, + size_of_credential_array); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + + for (u32_t ind_credential = 0ul; ind_credential < credential_array->get_object_count(); ind_credential++) + { + simple_config_credential_c * const credential = credential_array->get_object(ind_credential); + if (credential != 0) + { + const u32_t size_of_credential(get_payload_size(credential)); + + eap_status_e status = add_structured_parameter_header( + eapol_tlv_message_type_protected_setup_credential, + size_of_credential); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(credential->get_network_index()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(credential->get_SSID()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(static_cast(credential->get_Authentication_Type())); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(static_cast(credential->get_Encryption_Type())); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + const u32_t size_of_network_key_array(get_payload_size(credential->get_network_keys())); + + status = add_structured_parameter_header( + eapol_tlv_message_type_array, + size_of_network_key_array); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + for (u32_t ind_network_key = 0ul; ind_network_key < credential->get_network_keys()->get_object_count(); ind_network_key++) + { + network_key_and_index_c * const network_key = credential->get_network_keys()->get_object(ind_network_key); + if (network_key != 0) + { + const u32_t size_of_network_key(get_payload_size(network_key)); + + status = add_structured_parameter_header( + eapol_tlv_message_type_network_key, + size_of_network_key); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(network_key->get_network_key_index()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = add_parameter_data(network_key->get_network_key()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + } // for () + + status = add_parameter_data(credential->get_MAC_address()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + } // for () + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +#endif // #if defined(USE_EAP_SIMPLE_CONFIG) + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const integer_header, + u64_t * const value) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(integer_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(u64_t *)"), + integer_header->get_header_buffer(integer_header->get_header_buffer_length()), + integer_header->get_header_buffer_length())); + + if (static_cast(integer_header->get_type()) + != eapol_tlv_message_type_u64_t) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + const u8_t * const data = integer_header->get_value(sizeof(u64_t)); + if (data == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + *value = + eap_read_u64_t_network_order( + data, + sizeof(u64_t)); + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const integer_header, + u32_t * const value) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(integer_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(u32_t *)"), + integer_header->get_header_buffer(integer_header->get_header_buffer_length()), + integer_header->get_header_buffer_length())); + + if (static_cast(integer_header->get_type()) + != eapol_tlv_message_type_boolean + && static_cast(integer_header->get_type()) + != eapol_tlv_message_type_eap_protocol_layer + && static_cast(integer_header->get_type()) + != eapol_tlv_message_type_eapol_key_802_11_authentication_mode + && static_cast(integer_header->get_type()) + != eapol_tlv_message_type_eapol_key_authentication_type + && static_cast(integer_header->get_type()) + != eapol_tlv_message_type_eapol_key_type + && static_cast(integer_header->get_type()) + != eapol_tlv_message_type_eapol_tkip_mic_failure_type + && static_cast(integer_header->get_type()) + != eapol_tlv_message_type_eapol_wlan_authentication_state + && static_cast(integer_header->get_type()) + != eapol_tlv_message_type_error + && static_cast(integer_header->get_type()) + != eapol_tlv_message_type_function + && static_cast(integer_header->get_type()) + != eapol_tlv_message_type_RSNA_cipher + && static_cast(integer_header->get_type()) + != eapol_tlv_message_type_u32_t + && static_cast(integer_header->get_type()) + != eapol_tlv_message_type_eap_status + ) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + const u8_t * const data = integer_header->get_value(sizeof(u32_t)); + if (data == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + *value = + eap_read_u32_t_network_order( + data, + sizeof(u32_t)); + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const integer_header, + u16_t * const value) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(integer_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(u16_t *)"), + integer_header->get_header_buffer(integer_header->get_header_buffer_length()), + integer_header->get_header_buffer_length())); + + if (static_cast(integer_header->get_type()) + != eapol_tlv_message_type_u16_t) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + const u8_t * const data = integer_header->get_value(sizeof(u16_t)); + if (data == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + *value = + eap_read_u16_t_network_order( + data, + sizeof(u16_t)); + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const integer_header, + u8_t * const value) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(integer_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(u8_t *)"), + integer_header->get_header_buffer(integer_header->get_header_buffer_length()), + integer_header->get_header_buffer_length())); + + if (static_cast(integer_header->get_type()) + != eapol_tlv_message_type_u8_t) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + const u8_t * const data = integer_header->get_value(sizeof(u8_t)); + if (data == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + *value = *data; + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const function_header, + eapol_tlv_message_type_function_e * const function) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(function_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(eapol_tlv_message_type_function_e *)"), + function_header->get_header_buffer(function_header->get_header_buffer_length()), + function_header->get_header_buffer_length())); + + if (static_cast(function_header->get_type()) + != eapol_tlv_message_type_function) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + u32_t host_order(0ul); + + eap_status_e status = get_parameter_data( + function_header, + &host_order); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + *function = static_cast(host_order); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s, function=%s\n"), + get_type_string(eapol_tlv_message_type_function), + get_function_string(*function) + )); + + if (*function < eapol_tlv_message_type_function_none + || eapol_tlv_message_type_function_illegal_value <= *function) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); } //-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const network_id_header, + eap_am_network_id_c * const new_network_id) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(network_id_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(eap_am_network_id_c *)"), + network_id_header->get_header_buffer(network_id_header->get_header_buffer_length()), + network_id_header->get_header_buffer_length())); + + if (static_cast(network_id_header->get_type()) + != eapol_tlv_message_type_network_id) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + eapol_handle_tlv_message_data_c network_id_data(m_am_tools); + + if (network_id_data.get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + eap_status_e status = network_id_data.set_message_data( + network_id_header->get_value_length(), + network_id_header->get_value(network_id_header->get_value_length())); + + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + eap_array_c network_id_members(m_am_tools); + + status = network_id_data.parse_message_data(&network_id_members); + + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + + u32_t member_index(0ul); + + eap_variable_data_c source_id( + m_am_tools); + + if (source_id.get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + { + const eap_tlv_header_c * const source_id_header = network_id_members.get_object(member_index); + if (source_id_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = network_id_data.get_parameter_data(source_id_header, &source_id); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + + ++member_index; + + eap_variable_data_c destination_id( + m_am_tools); + + if (destination_id.get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + { + const eap_tlv_header_c * const destination_id_header = network_id_members.get_object(member_index); + if (destination_id_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = network_id_data.get_parameter_data(destination_id_header, &destination_id); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + + ++member_index; + + u16_t type_value(0ul); + + { + const eap_tlv_header_c * const type_header = network_id_members.get_object(member_index); + if (type_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = network_id_data.get_parameter_data(type_header, &type_value); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + + status = new_network_id->set_copy_of_am_network_id( + source_id.get_data(), + source_id.get_data_length(), + destination_id.get_data(), + destination_id.get_data_length(), + type_value); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const variable_data_header, + eap_variable_data_c * const variable_data) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(variable_data_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(eap_variable_data_c *)"), + variable_data_header->get_header_buffer(variable_data_header->get_header_buffer_length()), + variable_data_header->get_header_buffer_length())); + + if (static_cast(variable_data_header->get_type()) + != eapol_tlv_message_type_variable_data) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + eap_status_e status = variable_data->set_copy_of_buffer( + variable_data_header->get_value(variable_data_header->get_value_length()), + variable_data_header->get_value_length()); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const session_key_header, + eapol_session_key_c * const session_key) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(session_key_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(eapol_session_key_c *)"), + session_key_header->get_header_buffer(session_key_header->get_header_buffer_length()), + session_key_header->get_header_buffer_length())); + + if (static_cast(session_key_header->get_type()) + != eapol_tlv_message_type_session_key) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + eapol_handle_tlv_message_data_c session_key_data(m_am_tools); + + if (session_key_data.get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + eap_status_e status = session_key_data.set_message_data( + session_key_header->get_value_length(), + session_key_header->get_value(session_key_header->get_value_length())); + + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + eap_array_c session_key_members(m_am_tools); + + status = session_key_data.parse_message_data(&session_key_members); + + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + u32_t member_index(0ul); + + { + const eap_tlv_header_c * const tmp_session_key_header = session_key_members.get_object(member_index); + if (tmp_session_key_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + eap_variable_data_c key( + m_am_tools); + + if (key.get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + status = session_key_data.get_parameter_data(tmp_session_key_header, &key); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = session_key->set_key(&key); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + ++member_index; + + { + const eap_tlv_header_c * const sequence_number_header = session_key_members.get_object(member_index); + if (sequence_number_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + eap_variable_data_c sequence_number( + m_am_tools); + + if (sequence_number.get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + status = session_key_data.get_parameter_data(sequence_number_header, &sequence_number); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = session_key->set_sequence_number(&sequence_number); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + ++member_index; + + { + const eap_tlv_header_c * const key_type_header = session_key_members.get_object(member_index); + if (key_type_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + u32_t value(0ul); + + status = session_key_data.get_parameter_data(key_type_header, &value); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + session_key->set_key_type(static_cast(value)); + } + + ++member_index; + + { + const eap_tlv_header_c * const key_index_header = session_key_members.get_object(member_index); + if (key_index_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + u32_t value(0ul); + + status = session_key_data.get_parameter_data(key_index_header, &value); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + session_key->set_key_index(value); + } + + ++member_index; + + { + const eap_tlv_header_c * const key_tx_bit_header = session_key_members.get_object(member_index); + if (key_tx_bit_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + u32_t value(0ul); + + status = session_key_data.get_parameter_data(key_tx_bit_header, &value); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + session_key->set_key_tx_bit((value == 0) ? false : true); + } + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const state_header, + eap_state_notification_c * * const state) + +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(state_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(eap_state_notification_c *)"), + state_header->get_header_buffer(state_header->get_header_buffer_length()), + state_header->get_header_buffer_length())); + + if (static_cast(state_header->get_type()) + != eapol_tlv_message_type_eap_state_notification) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + eapol_handle_tlv_message_data_c session_key_data(m_am_tools); + + if (session_key_data.get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + eap_status_e status = session_key_data.set_message_data( + state_header->get_value_length(), + state_header->get_value(state_header->get_value_length())); + + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + eap_array_c session_key_members(m_am_tools); + + status = session_key_data.parse_message_data(&session_key_members); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + + u32_t member_index(0ul); + + eap_am_network_id_c send_network_id(m_am_tools); + + { + const eap_tlv_header_c * const send_network_id_header = session_key_members.get_object(member_index); + if (send_network_id_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = get_parameter_data(send_network_id_header, &send_network_id); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + + ++member_index; + + eap_protocol_layer_e protocol_layer(eap_protocol_layer_none); + + { + const eap_tlv_header_c * const protocol_layer_header = session_key_members.get_object(member_index); + if (protocol_layer_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + u32_t value(0ul); + + status = session_key_data.get_parameter_data(protocol_layer_header, &value); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + protocol_layer = static_cast(value); + } + + + ++member_index; + + u32_t protocol(0ul); + + { + const eap_tlv_header_c * const protocol_header = session_key_members.get_object(member_index); + if (protocol_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = session_key_data.get_parameter_data(protocol_header, &protocol); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + + ++member_index; + + eap_type_value_e eap_type(eap_type_none); + + { + const eap_tlv_header_c * const eap_type_header = session_key_members.get_object(member_index); + if (eap_type_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = session_key_data.get_parameter_data(eap_type_header, &eap_type); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + + ++member_index; + + u32_t current_state(0ul); + + { + const eap_tlv_header_c * const current_state_header = session_key_members.get_object(member_index); + if (current_state_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = session_key_data.get_parameter_data(current_state_header, ¤t_state); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + + ++member_index; + + bool is_client(true); + + { + const eap_tlv_header_c * const is_client_header = session_key_members.get_object(member_index); + if (is_client_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + u32_t value(0ul); + + status = session_key_data.get_parameter_data(is_client_header, &value); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + is_client = (value == 0ul) ? false : true; + } + + + ++member_index; + + eap_status_e authentication_error(eap_status_ok); + + { + const eap_tlv_header_c * const authentication_error_header = session_key_members.get_object(member_index); + if (authentication_error_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + u32_t value(0ul); + + status = session_key_data.get_parameter_data(authentication_error_header, &value); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + authentication_error = static_cast(value); + } + + + if (eap_type != eap_type_none) + { + *state = new eap_state_notification_c( + m_am_tools, + &send_network_id, + is_client, + eap_state_notification_eap, + protocol_layer, + eap_type, + current_state, + current_state, + 0ul, + false); + } + else + { + + + *state = new eap_state_notification_c( + m_am_tools, + &send_network_id, + is_client, + eap_state_notification_generic, + protocol_layer, + protocol, + current_state, + current_state, + 0ul, + false); + } + + if ((*state) == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + (*state)->set_authentication_error(authentication_error); + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const eap_type_header, + eap_type_value_e * const eap_type) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(eap_type_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(eap_type_value_e *)"), + eap_type_header->get_header_buffer(eap_type_header->get_header_buffer_length()), + eap_type_header->get_header_buffer_length())); + + if (static_cast(eap_type_header->get_type()) + != eapol_tlv_message_type_eap_type) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + eap_status_e status = eap_expanded_type_c::read_type( + m_am_tools, + 0ul, + eap_type_header->get_value(eap_type_header->get_value_length()), + eap_type_header->get_value_length(), + eap_type); + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); +} + +//-------------------------------------------------- + +#if defined(USE_EAP_SIMPLE_CONFIG) + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const network_key_header, + network_key_and_index_c * const network_key) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(network_key_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(simple_config_credential_c *)"), + network_key_header->get_header_buffer(network_key_header->get_header_buffer_length()), + network_key_header->get_header_buffer_length())); + + if (static_cast(network_key_header->get_type()) + != eapol_tlv_message_type_network_key) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + eapol_handle_tlv_message_data_c credential_data(m_am_tools); + + if (credential_data.get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + eap_status_e status = credential_data.set_message_data( + network_key_header->get_value_length(), + network_key_header->get_value(network_key_header->get_value_length())); + + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + eap_array_c credential_members(m_am_tools); + + status = credential_data.parse_message_data(&credential_members); + + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + u32_t member_index(0ul); + + u8_t network_key_index(0ul); + + { + const eap_tlv_header_c * const network_key_index_header = credential_members.get_object(member_index); + if (network_key_index_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = credential_data.get_parameter_data(network_key_index_header, &network_key_index); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + ++member_index; + + eap_variable_data_c key(m_am_tools); + + { + const eap_tlv_header_c * const key_header = credential_members.get_object(member_index); + if (key_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = credential_data.get_parameter_data(key_header, &key); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + ++member_index; + + network_key->set_network_key_index(network_key_index); + + status = network_key->get_network_key()->set_copy_of_buffer(&key); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +#endif // #if defined(USE_EAP_SIMPLE_CONFIG) + +//-------------------------------------------------- + +#if defined(USE_EAP_SIMPLE_CONFIG) + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const network_keys_array_header, + eap_array_c * const network_keys_array) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(network_keys_array_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(eap_array_c *)"), + network_keys_array_header->get_header_buffer(network_keys_array_header->get_header_buffer_length()), + network_keys_array_header->get_header_buffer_length())); + + if (static_cast(network_keys_array_header->get_type()) + != eapol_tlv_message_type_array) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + eapol_handle_tlv_message_data_c credential_array_data(m_am_tools); + + if (credential_array_data.get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + eap_status_e status = credential_array_data.set_message_data( + network_keys_array_header->get_value_length(), + network_keys_array_header->get_value(network_keys_array_header->get_value_length())); + + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + eap_array_c credential_array_members(m_am_tools); + + status = credential_array_data.parse_message_data(&credential_array_members); + + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + + for (u32_t ind_member = 0ul; ind_member < credential_array_members.get_object_count(); ind_member++) + { + network_key_and_index_c * const network_key = new network_key_and_index_c(m_am_tools); + + eap_automatic_variable_c automatic_network_key(m_am_tools, network_key); + + if (network_key == 0 + || network_key->get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + { + const eap_tlv_header_c * const simple_config_credential_header = credential_array_members.get_object(ind_member); + if (simple_config_credential_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = credential_array_data.get_parameter_data(simple_config_credential_header, network_key); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + automatic_network_key.do_not_free_variable(); + + status = network_keys_array->add_object(network_key, true); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + } // for () + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +#endif // #if defined(USE_EAP_SIMPLE_CONFIG) + +//-------------------------------------------------- + +#if defined(USE_EAP_SIMPLE_CONFIG) + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const credential_header, + simple_config_credential_c * const credential) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(credential_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(simple_config_credential_c *)"), + credential_header->get_header_buffer(credential_header->get_header_buffer_length()), + credential_header->get_header_buffer_length())); + + if (static_cast(credential_header->get_type()) + != eapol_tlv_message_type_protected_setup_credential) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + eapol_handle_tlv_message_data_c credential_data(m_am_tools); + + if (credential_data.get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + eap_status_e status = credential_data.set_message_data( + credential_header->get_value_length(), + credential_header->get_value(credential_header->get_value_length())); + + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + eap_array_c credential_members(m_am_tools); + + status = credential_data.parse_message_data(&credential_members); + + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + u32_t member_index(0ul); + + u8_t network_index(0ul); + + { + const eap_tlv_header_c * const network_index_header = credential_members.get_object(member_index); + if (network_index_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = credential_data.get_parameter_data(network_index_header, &network_index); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + ++member_index; + + eap_variable_data_c SSID(m_am_tools); + + { + const eap_tlv_header_c * const SSID_header = credential_members.get_object(member_index); + if (SSID_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = credential_data.get_parameter_data(SSID_header, &SSID); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + ++member_index; + + simple_config_Authentication_Type_e authentication_type(simple_config_Authentication_Type_None); + + { + const eap_tlv_header_c * const authentication_type_header = credential_members.get_object(member_index); + if (authentication_type_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + u16_t integer_value(0ul); + + status = credential_data.get_parameter_data(authentication_type_header, &integer_value); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + authentication_type = static_cast(integer_value); + } + + ++member_index; + + simple_config_Encryption_Type_e encryption_type(simple_config_Encryption_Type_None); + + { + const eap_tlv_header_c * const encryption_type_header = credential_members.get_object(member_index); + if (encryption_type_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + u16_t integer_value(0ul); + + status = credential_data.get_parameter_data(encryption_type_header, &integer_value); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + encryption_type = static_cast(integer_value); + } + + ++member_index; + + eap_array_c network_keys_array(m_am_tools); + + { + const eap_tlv_header_c * const network_keys_array_header = credential_members.get_object(member_index); + if (network_keys_array_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = credential_data.get_parameter_data(network_keys_array_header, &network_keys_array); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + ++member_index; + + eap_variable_data_c MAC_address(m_am_tools); + + { + const eap_tlv_header_c * const MAC_address_header = credential_members.get_object(member_index); + if (MAC_address_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = credential_data.get_parameter_data(MAC_address_header, &MAC_address); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + + ++member_index; + + + credential->set_network_index(network_index); + + status = credential->get_SSID()->set_copy_of_buffer(&SSID); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + credential->set_Authentication_Type(authentication_type); + + credential->set_Encryption_Type(encryption_type); + + status = copy( + &network_keys_array, + credential->get_network_keys(), + m_am_tools, + false); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + status = credential->get_MAC_address()->set_copy_of_buffer(&MAC_address); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +#endif // #if defined(USE_EAP_SIMPLE_CONFIG) + +//-------------------------------------------------- + +#if defined(USE_EAP_SIMPLE_CONFIG) + +EAP_FUNC_EXPORT eap_status_e eapol_handle_tlv_message_data_c::get_parameter_data( + const eap_tlv_header_c * const credential_array_header, + eap_array_c * const credential_array) +{ + EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT); + + EAP_TRACE_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("eapol_handle_tlv_message_data_c::get_parameter_data(): type=%s\n"), + get_type_string(static_cast(credential_array_header->get_type())))); + + EAP_TRACE_DATA_DEBUG( + m_am_tools, + EAP_TRACE_FLAGS_MESSAGE_DATA, + (EAPL("get_parameter_data(eap_array_c *)"), + credential_array_header->get_header_buffer(credential_array_header->get_header_buffer_length()), + credential_array_header->get_header_buffer_length())); + + if (static_cast(credential_array_header->get_type()) + != eapol_tlv_message_type_array) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_payload); + } + + eapol_handle_tlv_message_data_c credential_array_data(m_am_tools); + + if (credential_array_data.get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + eap_status_e status = credential_array_data.set_message_data( + credential_array_header->get_value_length(), + credential_array_header->get_value(credential_array_header->get_value_length())); + + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + eap_array_c credential_array_members(m_am_tools); + + status = credential_array_data.parse_message_data(&credential_array_members); + + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + + for (u32_t ind_member = 0ul; ind_member < credential_array_members.get_object_count(); ind_member++) + { + simple_config_credential_c * const simple_config_credential = new simple_config_credential_c(m_am_tools); + + eap_automatic_variable_c automatic_simple_config_credential(m_am_tools, simple_config_credential); + + if (simple_config_credential == 0 + || simple_config_credential->get_is_valid() == false) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error); + } + + { + const eap_tlv_header_c * const simple_config_credential_header = credential_array_members.get_object(ind_member); + if (simple_config_credential_header == 0) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter); + } + + status = credential_array_data.get_parameter_data(simple_config_credential_header, simple_config_credential); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + + automatic_simple_config_credential.do_not_free_variable(); + + status = credential_array->add_object(simple_config_credential, true); + if (status != eap_status_ok) + { + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, status); + } + } + } // for () + + EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT); + return EAP_STATUS_RETURN(m_am_tools, eap_status_ok); +} + +#endif // #if defined(USE_EAP_SIMPLE_CONFIG) + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_const_string eapol_handle_tlv_message_data_c::get_type_string(const eapol_tlv_message_type_e type) +{ +#if defined(USE_EAP_TRACE_STRINGS) + EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_none) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_array) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_boolean) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_eap_protocol_layer) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_eap_state_notification) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_eap_type) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_eapol_key_802_11_authentication_mode) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_eapol_key_authentication_type) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_eapol_key_type) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_eapol_tkip_mic_failure_type) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_eapol_wlan_authentication_state) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_error) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_function) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_network_id) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_RSNA_cipher) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_session_key) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_u8_t) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_u16_t) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_u32_t) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_u64_t) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_variable_data) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_network_key) + else EAP_IF_RETURN_STRING(type, eapol_tlv_message_type_protected_setup_credential) + else +#endif // #if defined(USE_EAP_TRACE_STRINGS) + { + EAP_UNREFERENCED_PARAMETER(type); + + return EAPL("Unknown EAPOL-TLV message type"); + } +} + +//-------------------------------------------------- + +EAP_FUNC_EXPORT eap_const_string eapol_handle_tlv_message_data_c::get_function_string(const eapol_tlv_message_type_function_e function) +{ +#if defined(USE_EAP_TRACE_STRINGS) + EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_none) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_check_pmksa_cache) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_start_authentication) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_complete_association) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_disassociation) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_start_preauthentication) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_start_reassociation) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_complete_reassociation) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_start_WPXM_reassociation) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_complete_WPXM_reassociation) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_packet_process) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_tkip_mic_failure) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_eap_acknowledge) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_update_header_offset) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_complete_check_pmksa_cache) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_packet_send) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_associate) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_disassociate) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_packet_data_session_key) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_state_notification) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_reassociate) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_update_wlan_database_reference_values) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_complete_start_WPXM_reassociation) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_new_protected_setup_credentials) + else EAP_IF_RETURN_STRING(function, eapol_tlv_message_type_function_illegal_value) + else +#endif // #if defined(USE_EAP_TRACE_STRINGS) + { + EAP_UNREFERENCED_PARAMETER(function); + + return EAPL("Unknown EAPOL-TLV message function"); + } +} + +//-------------------------------------------------- + // End.