--- a/eapol/eapol_framework/eapol_symbian/am/core/symbian/eapol_am_core_symbian.cpp Fri Jun 11 16:24:23 2010 +0100
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,3981 +0,0 @@
-/*
-* Copyright (c) 2001-2006 Nokia Corporation and/or its subsidiary(-ies).
-* All rights reserved.
-* This component and the accompanying materials are made available
-* under the terms of the License "Eclipse Public License v1.0"
-* which accompanies this distribution, and is available
-* at the URL "http://www.eclipse.org/legal/epl-v10.html".
-*
-* Initial Contributors:
-* Nokia Corporation - initial contribution.
-*
-* Contributors:
-*
-* Description: EAP and WLAN authentication protocols.
-*
-*/
-
-/*
-* %version: 17.1.2 %
-*/
-
-// This is enumeration of EAPOL source code.
-#if defined(USE_EAP_MINIMUM_RELEASE_TRACES)
- #undef EAP_FILE_NUMBER_ENUM
- #define EAP_FILE_NUMBER_ENUM 148
- #undef EAP_FILE_NUMBER_DATE
- #define EAP_FILE_NUMBER_DATE 1127594498
-#endif //#if defined(USE_EAP_MINIMUM_RELEASE_TRACES)
-
-
-// INCLUDE FILES
-
-#include "eap_am_memory.h"
-
-#include "eap_variable_data.h"
-#include "eap_tools.h"
-#include "eap_type_all.h"
-
-#include "eapol_am_core_symbian.h"
-#include "eapol_ethernet_header.h"
-#include "ethernet_core.h"
-#include "eap_am_tools_symbian.h"
-#include <EapolToWlmIf.h>
-#include "EapolDbDefaults.h"
-#include "EapolDbParameterNames.h"
-#include "eap_crypto_api.h"
-#include "eap_header_string.h"
-#include "eap_am_file_input_symbian.h"
-#include "eap_rogue_ap_entry.h"
-#include "abs_eap_state_notification.h"
-#include "eapol_session_key.h"
-#include "eap_buffer.h"
-#include "eap_config.h"
-
-#if defined(USE_EAP_FILECONFIG)
- #include "eap_file_config.h"
-#endif //#if defined(USE_EAP_FILECONFIG)
-
-#if defined (USE_EAPOL_KEY_STATE)
- #include "eapol_key_state.h"
-#endif
-
-// LOCAL CONSTANTS
-const TUint KMaxSqlQueryLength = 2048;
-const TUint KMaxConfigStringLength = 256;
-const u32_t KMTU = 1500u;
-const u32_t KTrailerLength = 0;
-const u32_t KHeaderOffset = 0;
-const TUint KMaxEapCueLength = 3;
-
-enum eapol_am_core_timer_id_e
-{
- EAPOL_AM_CORE_TIMER_RESTART_AUTHENTICATION_ID,
- EAPOL_AM_CORE_TIMER_DELETE_STACK_ID,
- EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID,
-};
-
-
-const TUint8 TEST_RSN_IE[] =
-{
- 0xdd, // information element id, 221 expressed as Hex value
- 0x14, // length in octets, 20 expressed as Hex value
- 0x01, 0x00, // Version 1
- 0x00, 0x0f, 0xac, 0x04, // CCMP as group key cipher suite
- 0x01, 0x00, // pairwise key cipher suite count
- 0x00, 0x0f, 0xac, 0x04, // CCMP as pairwise key cipher suite
- 0x01, 0x00, // authentication count
- 0x00, 0x0f, 0xac, 0x01, // 802.1X authentication
- 0x01, 0x00, // Pre-authentication capabilities
-};
-
-// ================= MEMBER FUNCTIONS =======================
-
-eapol_am_core_symbian_c::eapol_am_core_symbian_c(MEapolToWlmIf * const aPartner,
- const bool is_client_when_true,
- const TUint aServerIndex)
-: CActive(CActive::EPriorityStandard)
-, m_partner(aPartner)
-, m_ethernet_core(0)
-, m_am_tools(0)
-, m_enable_random_errors(false)
-, m_error_probability(0u)
-, m_generate_multiple_error_packets(0u)
-, m_authentication_counter(0u)
-, m_successful_authentications(0u)
-, m_failed_authentications(0u)
-, m_is_valid(false)
-, m_is_client(is_client_when_true)
-, m_eap_index(0u)
-, m_index_type(ELan)
-, m_index(aServerIndex)
-//, m_timer(0)
-, m_packet_index(0)
-, m_manipulate_ethernet_header(false)
-, m_send_original_packet_first(false)
-, m_authentication_indication_sent(false)
-, m_unicast_wep_key_received(false)
-, m_broadcast_wep_key_received(false)
-, m_block_packet_sends_and_notifications(false)
-, m_success_indication_sent(false)
-, m_first_authentication(true)
-, m_self_disassociated(false)
-, m_802_11_authentication_mode(EAuthModeOpen)
-, m_receive_network_id(0)
-, m_wpa_override_enabled(false)
-, m_wpa_psk_mode_allowed(false)
-, m_wpa_psk_mode_active(false)
-, m_stack_marked_to_be_deleted(false)
-, m_active_type_is_leap(false)
-, m_fileconfig(0)
-{
-}
-
-//--------------------------------------------------
-
-void eapol_am_core_symbian_c::ConstructL()
-{
- if (m_partner == 0)
- {
- User::Leave(KErrGeneral);
- }
-
- // Create tools class
- m_am_tools = new(ELeave) eap_am_tools_symbian_c(EAP_DEFAULT_TRACE_FILE);
- if (m_am_tools->get_is_valid() != true)
- {
- // The real reason most likely is KErrNoMemory but since that is not sure we'll use KErrGeneral
- User::Leave(KErrGeneral);
- }
- if (m_am_tools->configure() != eap_status_ok)
- {
- User::Leave(KErrGeneral);
- }
-
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("EAPOL INITIALISATION\n")));
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("====================\n")));
-
- m_wpa_preshared_key = new (ELeave) eap_variable_data_c(m_am_tools);
-
- m_ssid = new (ELeave) eap_variable_data_c(m_am_tools);
-
- m_wpa_psk_password_override = new (ELeave) eap_variable_data_c(m_am_tools);
-
- // Create/initialise the database
- OpenDatabaseL(m_database, m_session);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Database initialized...\n")));
-
-#if defined(USE_EAP_FILECONFIG)
-
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Initialize file configuration.\n")));
- eap_am_file_input_symbian_c fileio(m_am_tools);
-
- eap_variable_data_c file_name_c_data(m_am_tools);
-
- eap_status_e status(eap_status_process_general_error);
-
- {
- eap_const_string const FILECONFIG_FILENAME_C
- = "c:\\system\\data\\eap.conf";
-
- status = file_name_c_data.set_copy_of_buffer(
- FILECONFIG_FILENAME_C,
- m_am_tools->strlen(FILECONFIG_FILENAME_C));
- if (status != eap_status_ok)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
- }
-
- status = file_name_c_data.add_end_null();
- if (status != eap_status_ok)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
- }
- }
-
- eap_variable_data_c file_name_z_data(m_am_tools);
-
- {
- eap_const_string const FILECONFIG_FILENAME_Z
- = "z:\\private\\101F8EC5\\eap.conf";
-
- status = file_name_z_data.set_copy_of_buffer(
- FILECONFIG_FILENAME_Z,
- m_am_tools->strlen(FILECONFIG_FILENAME_Z));
- if (status != eap_status_ok)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
- }
-
- status = file_name_z_data.add_end_null();
- if (status != eap_status_ok)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
- }
- }
-
- if (status == eap_status_ok)
- {
- // First try open from C: disk.
- status = fileio.file_open(
- &file_name_c_data,
- eap_file_io_direction_read);
- if (status == eap_status_ok)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Opens configure file %s\n"),
- file_name_c_data.get_data(file_name_c_data.get_data_length())));
- }
- else if (status != eap_status_ok)
- {
- // Second try open from Z: disk.
- status = fileio.file_open(
- &file_name_z_data,
- eap_file_io_direction_read);
- if (status == eap_status_ok)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Opens configure file %s\n"),
- file_name_z_data.get_data(file_name_z_data.get_data_length())));
- }
- }
-
- if (status == eap_status_ok)
- {
- // Some of the files were opened.
-
- m_fileconfig = new eap_file_config_c(m_am_tools);
- if (m_fileconfig != 0
- && m_fileconfig->get_is_valid() == true)
- {
- status = m_fileconfig->configure(&fileio);
- if (status != eap_status_ok)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("ERROR: Configure read from %s failed.\n"),
- file_name_c_data.get_data(file_name_c_data.get_data_length())));
- }
- else
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Configure read from %s\n"),
- file_name_c_data.get_data(file_name_c_data.get_data_length())));
- }
- }
- else
- {
- // No file configuration.
- delete m_fileconfig;
- m_fileconfig = 0;
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("ERROR: Cannot create configure object for file %s\n"),
- file_name_c_data.get_data(file_name_c_data.get_data_length())));
- }
- }
- else
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("ERROR: Cannot open configure file neither %s nor %s\n"),
- file_name_c_data.get_data(file_name_c_data.get_data_length()),
- file_name_z_data.get_data(file_name_z_data.get_data_length())));
- }
- }
- }
-
-#endif //#if defined(USE_EAP_FILECONFIG)
-
-#if !defined(USE_EAP_HARDWARE_TRACE)
- {
- // Disable traces.
- m_am_tools->set_trace_mask(eap_am_tools_c::eap_trace_mask_none);
-
- eap_variable_data_c trace_output_file(m_am_tools);
-
- eap_status_e status = read_configure(
- cf_str_EAP_TRACE_output_file_name.get_field(),
- &trace_output_file);
- if (status == eap_status_ok
- && trace_output_file.get_is_valid_data() == true)
- {
- status = m_am_tools->set_trace_file_name(&trace_output_file);
- if (status == eap_status_ok)
- {
- // OK, set the default trace mask.
- m_am_tools->set_trace_mask(
- eap_am_tools_c::eap_trace_mask_debug
- | eap_am_tools_c::eap_trace_mask_always
- | eap_am_tools_c::eap_trace_mask_error);
- }
- }
- }
-#endif //#if defined(USE_EAP_HARDWARE_TRACE)
-
-
- {
- eap_status_e status = configure();
- if (status != eap_status_ok)
- {
- User::Leave(KErrGeneral);
- User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
- }
- }
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Configured EAPOL AM...\n")));
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Created timer...\n")));
-
- // SERVER TEST CODE
- if (m_is_client == false)
- {
- TRAPD(err, ReadEAPSettingsL());
- if (err != KErrNone)
- {
- // Setting reading from CommDB failed. Use default values instead (only EAP-SIM).
-
- // SIM
- _LIT(KSIM, "18");
- TEap* sim = new(ELeave) TEap;
- CleanupStack::PushL(sim);
- sim->Enabled = ETrue;
- sim->UID.Copy(KSIM);
- User::LeaveIfError(m_iap_eap_array.Append(sim));
- CleanupStack::Pop(sim);
- }
-
- }
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("========================\n")));
-
- set_is_valid();
-
-}
-
-
-//--------------------------------------------------
-
-eapol_am_core_symbian_c* eapol_am_core_symbian_c::NewL(MEapolToWlmIf * const aPartner,
- const bool aIsClient,
- const TUint aServerIndex)
-{
- eapol_am_core_symbian_c* self = new(ELeave) eapol_am_core_symbian_c(aPartner, aIsClient, aServerIndex);
- CleanupStack::PushL(self);
- self->ConstructL();
-
- if (self->get_is_valid() != true)
- {
- User::Leave(KErrGeneral);
- }
-
- CleanupStack::Pop();
- return self;
-}
-
-//--------------------------------------------------
-
-eapol_am_core_symbian_c::~eapol_am_core_symbian_c()
-{
-
-#if defined(USE_EAP_FILECONFIG)
- delete m_fileconfig;
- m_fileconfig = 0;
-#endif //#if defined(USE_EAP_FILECONFIG)
-
- shutdown();
-}
-
-//--------------------------------------------------
-
-//
-eap_status_e eapol_am_core_symbian_c::shutdown()
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::shutdown()\n")));
-
- // Cancel timer
- cancel_all_timers();
-
- // Delete upper stack if it still exists
- if (m_ethernet_core != 0)
- {
- m_ethernet_core->shutdown();
- delete m_ethernet_core;
- }
-
- delete m_wpa_preshared_key;
-
- delete m_ssid;
-
- delete m_wpa_psk_password_override;
-
- delete m_receive_network_id;
-
- m_database.Close();
- m_session.Close();
-
- // Print some statistics
- if (m_is_client)
- {
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_TEST_VECTORS,
- (EAPL("client authentication SUCCESS %d, FAILED %d, count %d\n"),
- m_successful_authentications,
- m_failed_authentications,
- m_authentication_counter));
- }
- else
- {
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_TEST_VECTORS,
- (EAPL("server authentication SUCCESS %d, FAILED %d, count %d\n"),
- m_successful_authentications,
- m_failed_authentications,
- m_authentication_counter));
- }
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("EAPOL EXITING.\n")));
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- // Finally delete tools. No logging is allowed after this.
- if (m_am_tools != 0)
- {
- m_am_tools->shutdown();
- delete m_am_tools;
- }
-
-
- // Unload all loaded plugins
- // NOTE this must be after the m_am_tools->shutdown() call.
- // m_am_tools->shutdown() will run virtual functions of some plugins.
- for(int i = 0; i < m_plugin_if_array.Count(); i++)
- {
- delete m_plugin_if_array[i];
- }
-
- m_plugin_if_array.Close();
- m_eap_type_array.Close();
-
- // Delete the IAP EAP type info array
- m_iap_eap_array.ResetAndDestroy();
-
-
- return eap_status_ok;
-}
-
-//--------------------------------------------------
-
-//
-void eapol_am_core_symbian_c::RunL()
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::RunL(): iStatus.Int() = %d\n"),
- iStatus.Int()));
-
- if (iStatus.Int() != KErrNone)
- {
- return;
- }
-
- // Authentication cancelled.
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Authentication cancelled.\n")));
-
- // Set block on.
- m_block_packet_sends_and_notifications = true;
-
- // Reset flags
- m_success_indication_sent = false;
- m_unicast_wep_key_received = false;
- m_broadcast_wep_key_received = false;
- m_authentication_indication_sent = false;
-
- m_stack_marked_to_be_deleted = true;
- set_timer(this, EAPOL_AM_CORE_TIMER_DELETE_STACK_ID, 0, 0);
-
- // reset index
- m_eap_index = 0;
-
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EFailedCompletely.\n")));
-
- m_partner->EapIndication(EFailedCompletely);
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
-}
-
-//--------------------------------------------------
-
-//
-void eapol_am_core_symbian_c::DoCancel()
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::DoCancel()\n")));
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
-}
-
-//--------------------------------------------------
-
-//
-TInt eapol_am_core_symbian_c::Start(const TIndexType aIndexType,
- const TUint aIndex,
- const TSSID& aSSID,
- const TBool aWPAOverrideEnabled,
- const TUint8* aWPAPSK,
- const TUint aWPAPSKLength)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::Start()\n")));
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("STARTING AUTHENTICATION.\n")));
-
- eap_status_e status(eap_status_ok);
-
- if (m_ethernet_core != 0)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Deleting previously used stack.\n")));
-
- // It is an error to call start without calling disassociated
- if (m_stack_marked_to_be_deleted == false)
- {
- EAP_TRACE_ERROR(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::Start called twice!\n")));
- return KErrAlreadyExists;
- }
-
- // The previously used stack is perhaps still waiting for deletion.
- cancel_timer(this, EAPOL_AM_CORE_TIMER_DELETE_STACK_ID);
-
- // Delete stack
- m_ethernet_core->shutdown();
- delete m_ethernet_core;
- m_ethernet_core = 0;
-
- m_stack_marked_to_be_deleted = false;
- }
-
- // Clear packet send and notification blocking.
- m_block_packet_sends_and_notifications = false;
-
- // Store SSID. This is needed for WPA PSK calculation.
- if (aSSID.ssidLength > 0)
- {
- status = m_ssid->set_copy_of_buffer(aSSID.ssid, aSSID.ssidLength);
- if (status != eap_status_ok)
- {
- return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));
- }
- }
-
- // Store WPAPSK. This is needed for WPA PSK mode in Easy WLAN.
- if (aWPAPSKLength > 0
- && aWPAPSK != 0)
- {
- status = m_wpa_psk_password_override->set_copy_of_buffer(aWPAPSK, aWPAPSKLength);
- if (status != eap_status_ok)
- {
- return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));
- }
- }
-
- if (aWPAOverrideEnabled)
- {
- m_wpa_override_enabled = true;
- }
- else
- {
- m_wpa_override_enabled = false;
- }
-
- ///////////////////////////////////
- // Get EAP parameters from CommDbIf
- ///////////////////////////////////
- m_index_type = aIndexType;
- m_index = aIndex;
-
- TRAPD(err, ReadEAPSettingsL());
- if (err != KErrNone)
- {
- EAP_TRACE_ERROR(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("EAP settings reading from CommDb failed or cancelled(err %d).\n"), err));
- m_partner->EapIndication(EFailedCompletely);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return err;
- }
-
- // Start new authentication from scratch.
- m_unicast_wep_key_received = false;
- m_broadcast_wep_key_received = false;
- m_wpa_psk_mode_active = false;
-
- if (m_wpa_psk_mode_allowed == false
- || m_wpa_preshared_key->get_data_length() == 0)
- {
- // Check the first enabled type
- TEap* eapType = 0;
- TInt i(0);
- for (i = 0; i < m_iap_eap_array.Count(); i++)
- {
- // Check if type is enabled
- eapType = m_iap_eap_array[i];
- if (eapType->Enabled == 1)
- {
- break;
- }
- }
- if (i >= m_iap_eap_array.Count())
- {
- // No enabled EAP types.
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("No enabled EAP types.\n")));
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EFailedCompletely.\n")));
-
- m_partner->EapIndication(EFailedCompletely);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return KErrNone;
- }
-
- // reset index (start from the first enabled EAP type)
- m_eap_index = i;
-
- // Check if the first enabled type is LEAP.
- TLex8 tmp(eapType->UID);
- TInt type(0);
- tmp.Val(type);
-
- switch (type)
- {
- case eap_type_leap:
- if (m_security_mode != Wpa
- && m_security_mode != Wpa2Only)
- {
- m_802_11_authentication_mode = EAuthModeLeap;
-
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Start: Trying auth mode LEAP.\n")));
- }
- else
- {
- // If security mode is WPA or WPA2 then even LEAP uses open authentication!
- m_802_11_authentication_mode = EAuthModeOpen;
-
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Start: Trying auth mode OPEN (LEAP in WPA mode).\n")));
- }
-
- m_active_type_is_leap = true;
- break;
- default:
- m_802_11_authentication_mode = EAuthModeOpen;
-
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Start: Trying auth mode OPEN.\n")));
-
- m_active_type_is_leap = false;
- break;
- }
- }
- else
- {
- // WPA Pre-shared key mode
- m_active_type_is_leap = false;
- m_wpa_psk_mode_active = true;
- m_802_11_authentication_mode = EAuthModeOpen;
-
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Start: Trying auth mode OPEN.\n")));
- }
-
- // Ignore return value. Result comes with CompleteAssociation call.
- m_partner->Associate(m_802_11_authentication_mode);
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));
-}
-
-//--------------------------------------------------
-
-//
-TInt eapol_am_core_symbian_c::CompleteAssociation(
- const TInt aResult,
- const TMacAddress& aLocalAddress,
- const TMacAddress& aRemoteAddress,
- const TUint8* const aReceivedWPAIE, // WLM must give only the WPA IE to EAPOL
- const TUint aReceivedWPAIELength,
- const TUint8* const aSentWPAIE,
- const TUint aSentWPAIELength,
- const TWPACipherSuite aGroupKeyCipherSuite,
- const TWPACipherSuite aPairwiseKeyCipherSuite
- )
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::CompleteAssociation(): aResult %d\n"),
- aResult));
-
- eap_status_e status(eap_status_ok);
-
- // ASSOCIATION UNSUCCESSFUL
- if (aResult != KErrNone)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("CompleteAssociation: Unsuccessful.\n")));
-
- EAP_TRACE_DATA_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Got AP MAC address"),
- aRemoteAddress.iMacAddress,
- KMacAddressLength));
-
- // Report rogue AP if we tried LEAP and it failed
- if (m_802_11_authentication_mode == EAuthModeLeap)
- {
- // Only add rogue AP if the error code is correct
- if (aResult == E802Dot11StatusAuthAlgorithmNotSupported)
- {
- eap_rogue_ap_entry_c rogue_entry(m_am_tools);
-
- rogue_entry.set_mac_address(static_cast<const u8_t *>(aRemoteAddress.iMacAddress));
- rogue_entry.set_rogue_reason(rogue_ap_association_failed);
-
- eap_array_c<eap_rogue_ap_entry_c> rogue_list(m_am_tools);
- status = rogue_list.add_object(&rogue_entry, false);
- if (status == eap_status_ok)
- {
- status = add_rogue_ap(rogue_list);
- // Ignore return value on purpose - it's not fatal if this fails
- }
- }
- }
-
- if (m_wpa_psk_mode_active == false)
- {
- if (aResult == E802Dot11StatusAuthAlgorithmNotSupported
- && m_security_mode != Wpa
- && m_security_mode != Wpa2Only) // If security mode is WPA or WPA2 then only OPEN auth should be used
- {
- // Association failed because we had wrong authentication type.
- // Try to find next allowed type that uses different authentication type
- m_eap_index++;
-
- TEap* eapType;
- TBool found(EFalse);
- TInt i(0);
- for (i = m_eap_index; i < m_iap_eap_array.Count(); i++)
- {
- // Check if type is enabled
- eapType = m_iap_eap_array[i];
- if (eapType->Enabled == 1)
- {
- TLex8 tmp(eapType->UID);
- TInt type(0);
- tmp.Val(type);
-
- switch (type)
- {
- case eap_type_leap:
- if (m_802_11_authentication_mode != EAuthModeLeap)
- {
- // This type will do; it uses different authentication mode.
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("CompleteAssociation: Changed auth mode to LEAP.\n")));
-
- m_802_11_authentication_mode = EAuthModeLeap;
- m_active_type_is_leap = true;
- found = ETrue;
- }
- break;
- default:
- if (m_802_11_authentication_mode != EAuthModeOpen)
- {
- // This type will do; it uses different authentication mode.
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("CompleteAssociation: Changed auth mode to OPEN.\n")));
-
- m_802_11_authentication_mode = EAuthModeOpen;
- m_active_type_is_leap = false;
- found = ETrue;
- }
- break;
- }
- if (found)
- {
- break;
- }
- }
- }
-
- m_eap_index = i;
-
- if (i >= m_iap_eap_array.Count())
- {
- // All the remaining allowed types had the same authentication mode.
- // Give up this AP.
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Could not associate to the AP. Tried all types.\n")));
-
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EThisAPFailed.\n")));
-
- m_partner->EapIndication(EThisAPFailed);
- return KErrNone;
-
- }
-
- // We found a type with different authentication mode. Try it.
-
- // Ignore return value. Result comes with CompleteAssociation call.
- m_partner->Associate(m_802_11_authentication_mode);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return KErrNone;
- }
- else
- {
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Could not associate to the AP (error %d).\n"), aResult));
-
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EThisAPFailed.\n")));
-
- m_partner->EapIndication(EThisAPFailed);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return KErrNone;
- }
- }
- else
- {
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Could not associate to the AP with WPA pre-shared-key.\n")));
-
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EThisAPFailed.\n")));
-
- m_partner->EapIndication(EThisAPFailed);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return KErrNone;
- }
- }
-
- // ASSOCIATION SUCCESSFUL
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("CompleteAssociation: Successful.\n")));
-
- // Store parameters
- m_local_address = aLocalAddress;
-
- m_remote_address = aRemoteAddress;
-
- m_received_wpa_ie = aReceivedWPAIE;
-
- m_received_wpa_ie_length = aReceivedWPAIELength;
-
- m_sent_wpa_ie = aSentWPAIE;
-
- m_sent_wpa_ie_length = aSentWPAIELength;
-
- m_group_key_cipher_suite = aGroupKeyCipherSuite;
-
- m_pairwise_key_cipher_suite = aPairwiseKeyCipherSuite;
-
- // Create stack if it does not already exist.
- status = create_upper_stack();
- if (status != eap_status_ok
- && status != eap_status_already_exists)
- {
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EFailedCompletely.\n")));
-
- m_partner->EapIndication(EFailedCompletely);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return KErrNone;
- }
-
- // First create stack object and then copy it to heap object. This is because
- // eap_am_network_id_c does not have a constructor that copies the buffers.
- eap_am_network_id_c receive_network_id(
- m_am_tools,
- &aRemoteAddress,
- sizeof(TMacAddress),
- &aLocalAddress,
- sizeof(TMacAddress),
- eapol_ethernet_type_pae,
- false,
- false);
-
- delete m_receive_network_id;
- m_receive_network_id = new eap_am_network_id_c(
- m_am_tools);
-
- if (m_receive_network_id == 0)
- {
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EFailedCompletely.\n")));
-
- m_partner->EapIndication(EFailedCompletely);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return KErrNone;
- }
-
- status = m_receive_network_id->set_copy_of_network_id(&receive_network_id);
- if (status != eap_status_ok)
- {
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EFailedCompletely.\n")));
-
- m_partner->EapIndication(EFailedCompletely);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return KErrNone;
- }
-
-
-#if defined (USE_EAPOL_KEY_STATE)
-
- // Initialise EAPOL key state
-
- eapol_key_authentication_type_e authentication_type(eapol_key_authentication_type_802_1X);
-
- if (aReceivedWPAIE !=0
- && aSentWPAIE != 0)
- {
- // WPA (in wpa or 802.1x security mode)
- if (m_wpa_psk_mode_allowed == false)
- {
- authentication_type = eapol_key_authentication_type_WPA_EAP;
- }
- else
- {
- m_wpa_psk_mode_active = true;
- authentication_type = eapol_key_authentication_type_WPA_PSK;
- }
-
- }
- else
- {
- // Non-wpa mode
- authentication_type = eapol_key_authentication_type_802_1X;
- }
-
- eap_variable_data_c authenticator_RSNA_IE(m_am_tools);
- eap_variable_data_c supplicant_RSNA_IE(m_am_tools);
-
- // Note: the default values here are only for 802.1x mode. In that mode
- // we don't know the WEP key length beforehand so we will have to guess.
- // It does not matter in this case if we guess wrong - only thing that matters
- // is that it is WEP.
- eapol_RSNA_key_header_c::eapol_RSNA_cipher_e
- eapol_pairwise_cipher(eapol_RSNA_key_header_c::eapol_RSNA_cipher_WEP_40);
- eapol_RSNA_key_header_c::eapol_RSNA_cipher_e
- eapol_group_cipher(eapol_RSNA_key_header_c::eapol_RSNA_cipher_WEP_40);
-
- // WPA mode is active if information elements are valid
- if (aReceivedWPAIE != 0
- && aSentWPAIE != 0)
- {
- status = authenticator_RSNA_IE.set_copy_of_buffer(aReceivedWPAIE, aReceivedWPAIELength);
- if (status != eap_status_ok)
- {
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EFailedCompletely.\n")));
-
- m_partner->EapIndication(EFailedCompletely);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return KErrNoMemory;
- }
- status = supplicant_RSNA_IE.set_copy_of_buffer(aSentWPAIE, aSentWPAIELength);
- if (status != eap_status_ok)
- {
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EFailedCompletely.\n")));
-
- m_partner->EapIndication(EFailedCompletely);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return KErrNoMemory;
- }
-
- switch (aGroupKeyCipherSuite)
- {
- case ENoCipherSuite:
- eapol_group_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_none;
- break;
- case EWEP40:
- eapol_group_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_WEP_40;
- break;
- case EWEP104:
- eapol_group_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_WEP_104;
- break;
- case ETKIP:
- eapol_group_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_TKIP;
- break;
- case ECCMP:
- eapol_group_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_CCMP;
- break;
- case EWRAP:
- default:
- User::Panic(_L("EAPOL"), KErrNotSupported);
- }
-
- switch (aPairwiseKeyCipherSuite)
- {
- case ENoCipherSuite:
- eapol_pairwise_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_none;
- break;
- case EWEP40:
- eapol_pairwise_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_WEP_40;
- break;
- case EWEP104:
- eapol_pairwise_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_WEP_104;
- break;
- case ETKIP:
- eapol_pairwise_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_TKIP;
- break;
- case ECCMP:
- eapol_pairwise_cipher = eapol_RSNA_key_header_c::eapol_RSNA_cipher_CCMP;
- break;
- case EWRAP:
- default:
- User::Panic(_L("EAPOL"), KErrNotSupported);
- }
- }
-
- if (authentication_type == eapol_key_authentication_type_WPA_PSK)
- {
- status = m_ethernet_core->association(
- m_receive_network_id,
- authentication_type,
- &authenticator_RSNA_IE,
- &supplicant_RSNA_IE,
- eapol_pairwise_cipher,
- eapol_group_cipher,
- m_wpa_preshared_key);
- }
- else
- {
- status = m_ethernet_core->association(
- m_receive_network_id,
- authentication_type,
- &authenticator_RSNA_IE,
- &supplicant_RSNA_IE,
- eapol_pairwise_cipher,
- eapol_group_cipher,
- 0);
- }
- if (status != eap_status_ok)
- {
-
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("m_ethernet_core->association call failed.\n")));
-
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EFailedCompletely.\n")));
-
- m_partner->EapIndication(EFailedCompletely);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return KErrGeneral;
- }
-
-#endif // USE_EAPOL_KEY_STATE
-
- if (m_wpa_psk_mode_active == false)
- {
- // Start authentication if mode is not pre-shared key. If mode is pre-shared key then
- // just wait for EAPOL-Key frames.
- status = m_ethernet_core->start_authentication(m_receive_network_id, m_is_client);
- }
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));
-}
-
-//--------------------------------------------------
-
-//
-TInt eapol_am_core_symbian_c::ReceivePacket(const TUint aLength, const TUint8* const aPacket)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::ReceivePacket()\n")));
-
- if (aLength < eapol_ethernet_header_wr_c::get_header_length())
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, eap_status_too_short_message));
- }
-
- eapol_ethernet_header_wr_c eth_header(m_am_tools, aPacket, aLength);
- eap_am_network_id_c receive_network_id(
- m_am_tools,
- eth_header.get_source(),
- eth_header.get_source_length(),
- eth_header.get_destination(),
- eth_header.get_destination_length(),
- eth_header.get_type(),
- false,
- false);
- eap_status_e status(eap_status_process_general_error);
- if (eth_header.get_type() == eapol_ethernet_type_pae)
- {
- status = create_upper_stack();
- if (status != eap_status_ok
- && status != eap_status_already_exists)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EFailedCompletely.\n")));
- m_partner->EapIndication(EFailedCompletely);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return KErrNone;
- }
-
-#if defined (USE_EAPOL_KEY_STATE)
- if (m_is_client == false
- && status != eap_status_already_exists)
- {
- // If we are server we need to do associate here.
- eapol_key_authentication_type_e authentication_type(
- eapol_key_authentication_type_WPA_EAP);
-
- eap_variable_data_c authenticator_RSNA_IE(m_am_tools);
- eap_variable_data_c supplicant_RSNA_IE(m_am_tools);
-
- status = authenticator_RSNA_IE.set_buffer(TEST_RSN_IE, sizeof(TEST_RSN_IE), false, false);
- if (status != eap_status_ok)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
- }
-
- status = supplicant_RSNA_IE.set_buffer(TEST_RSN_IE, sizeof(TEST_RSN_IE), false, false);
- if (status != eap_status_ok)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
- }
-
- eapol_RSNA_key_header_c::eapol_RSNA_cipher_e
- eapol_pairwise_cipher(eapol_RSNA_key_header_c::eapol_RSNA_cipher_TKIP);
- eapol_RSNA_key_header_c::eapol_RSNA_cipher_e
- eapol_group_cipher(eapol_RSNA_key_header_c::eapol_RSNA_cipher_TKIP);
-
-
- if (authentication_type == eapol_key_authentication_type_WPA_PSK)
- {
- status = m_ethernet_core->association(
- &receive_network_id,
- authentication_type,
- &authenticator_RSNA_IE,
- &supplicant_RSNA_IE,
- eapol_pairwise_cipher,
- eapol_group_cipher,
- m_wpa_preshared_key);
- }
- else
- {
- status = m_ethernet_core->association(
- &receive_network_id,
- authentication_type,
- &authenticator_RSNA_IE,
- &supplicant_RSNA_IE,
- eapol_pairwise_cipher,
- eapol_group_cipher,
- 0);
- }
-
- }
-#endif // USE_EAPOL_KEY_STATE
-
- // Forward the packet to the Ethernet layer of the EAPOL stack. Ignore return value. Failure is signalled using state_notification.
- status = m_ethernet_core->packet_process(
- &receive_network_id,
- ð_header,
- aLength);
-
- }
- else
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Not supported ethernet type 0x%04x\n"), eth_header.get_type()));
- status = eap_status_ethernet_type_not_supported;
- }
-
- status = eap_status_ok;
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));
-}
-
-//--------------------------------------------------
-
-void eapol_am_core_symbian_c::set_is_valid()
-{
- m_is_valid = true;
-}
-
-bool eapol_am_core_symbian_c::get_is_valid()
-{
- return m_is_valid;
-}
-
-void eapol_am_core_symbian_c::increment_authentication_counter()
-{
- ++m_authentication_counter;
-}
-
-u32_t eapol_am_core_symbian_c::get_authentication_counter()
-{
- return m_authentication_counter;
-}
-
-bool eapol_am_core_symbian_c::get_is_client()
-{
- return m_is_client;
-}
-
-
-//--------------------------------------------------
-
-//
-eap_status_e eapol_am_core_symbian_c::packet_data_crypto_keys(
- const eap_am_network_id_c * const /*send_network_id*/,
- const eap_variable_data_c * const /*master_session_key*/)
-{
- // Not needed in Symbian version
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_ok;
-}
-
-//--------------------------------------------------
-
-eap_status_e eapol_am_core_symbian_c::packet_data_session_key(
- const eap_am_network_id_c * const /*send_network_id*/,
- const eapol_session_key_c * const key)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
- TInt status(KErrNone);
-
- const eap_variable_data_c * const key_data = key->get_key();
- if (key_data == 0)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_key_error;
- }
-
- EAP_TRACE_DEBUG(m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("packet_data_session_key: index: %d, type %d\n"),
- key->get_key_index(),
- key->get_key_type()));
-
- EAP_TRACE_DATA_DEBUG(m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("packet_data_session_key:"),
- key_data->get_data(key_data->get_data_length()),
- key_data->get_data_length()));
-
- switch (key->get_key_type())
- {
- case eapol_key_type_broadcast:
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::packet_data_session_key: Got rc4_broadcast key.\n")));
-
- status = m_partner->SetCipherKey(
- ERC4Broadcast,
- static_cast<TUint8> (key->get_key_index()),
- key_data->get_data(key_data->get_data_length()),
- key_data->get_data_length());
- m_broadcast_wep_key_received = true;
- break;
- case eapol_key_type_unicast:
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::packet_data_session_key: Got rc4_unicast key.\n")));
-
- status = m_partner->SetCipherKey(
- ERC4Unicast,
- static_cast<TUint8> (key->get_key_index()),
- key_data->get_data(key_data->get_data_length()),
- key_data->get_data_length());
- m_unicast_wep_key_received = true;
- break;
- default:
- EAP_TRACE_ERROR(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::packet_data_session_key: Got unsupported key, type %d.\n"),
- key->get_key_type()));
- status = KErrNotSupported;
- break;
- }
-
- if (m_unicast_wep_key_received == true
- && m_broadcast_wep_key_received == true
- && m_success_indication_sent == false)
- {
- // Signal success because we have received one unicast (pairwise) key and one broadcast (group) key.
- // If there are more keys coming later they are saved also.
- if (m_active_type_is_leap == true)
- {
- // Leap was successful
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: ELeapSuccess.\n")));
- m_partner->EapIndication(ELeapSuccess);
- }
- else
- {
- // some other type was successful
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: ESuccess.\n")));
- m_partner->EapIndication(ESuccess);
- }
-
- m_success_indication_sent = true;
- m_first_authentication = false;
- }
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(status));
-}
-
-//--------------------------------------------------
-
-//
-
-eap_status_e eapol_am_core_symbian_c::packet_send(
- const eap_am_network_id_c * const /*send_network_id*/,
- eap_buf_chain_wr_c * const sent_packet,
- const u32_t header_offset,
- const u32_t data_length,
- const u32_t /*buffer_length*/)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::packet_send(data_length=%d).\n"),
- data_length));
-
- if (header_offset != 0u)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("packet_send: packet buffer corrupted.\n")));
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_process_general_error;
- }
- else if (header_offset+data_length != sent_packet->get_data_length())
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("ERROR: packet_send: packet buffer corrupted (data_length != sent_packet->get_data_length()).\n")));
- EAP_ASSERT(data_length == sent_packet->get_buffer_length());
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_process_general_error;
- }
-
- if (m_block_packet_sends_and_notifications == true)
- {
- // Packet sending block is active. This happens when disassociated has been called.
- // start_authentication clears the block.
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("packet_send: packet ignored because Disassociated() was called.\n")));
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_ok;
- }
-
- TInt status(KErrNone);
- if (m_send_original_packet_first == true)
- {
- if (m_enable_random_errors == true)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("TEST: random_error(): packet_index 0x%08x:%lu, Send original packet\n"),
- this,
- m_packet_index));
- }
-
- u8_t * const packet_data = sent_packet->get_data_offset(header_offset, data_length);
- if (packet_data == 0)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_buffer_too_short;
- }
-
- // Here we send the original packet.
- status = m_partner->EapPacketSend(
- data_length,
- static_cast<TUint8*>(packet_data));
- ++m_packet_index;
- }
-
- if (m_enable_random_errors == true
- && status == KErrNone)
- {
- if (m_generate_multiple_error_packets > 0ul)
- {
- // First create a copy of sent packet. Original correct packet will will be sent last.
- for (u32_t ind = 0ul; ind < m_generate_multiple_error_packets; ind++)
- {
- eap_buf_chain_wr_c *copy_packet = sent_packet->copy();
-
- if (copy_packet != 0
- && copy_packet->get_is_valid_data() == true)
- {
- // Make a random error to the copy message.
- random_error(copy_packet, true, m_packet_index);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("TEST: random_error(): packet_index 0x%08x:%lu, Send error packet\n"),
- this,
- m_packet_index));
-
- u8_t * const packet_data = copy_packet->get_data_offset(header_offset, data_length);
- if (packet_data == 0)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_buffer_too_short;
- }
-
- // Here we send the copied and manipulated packet.
- status = m_partner->EapPacketSend(
- data_length,
- static_cast<TUint8*>(packet_data));
-
- ++m_packet_index;
- }
- delete copy_packet;
- }
- }
- else
- {
- // Make a random error to the original message.
- random_error(sent_packet, false, m_packet_index);
-
- if (sent_packet->get_is_manipulated() == true)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("TEST: random_error(): packet_index 0x%08x:%lu, Send error packet\n"),
- this,
- m_packet_index));
- }
- }
- }
-
-
- if (m_send_original_packet_first == false
- && status == KErrNone)
- {
- if (m_enable_random_errors == true)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("TEST: random_error(): packet_index 0x%08x:%lu, Send original packet\n"),
- this,
- m_packet_index));
- }
-
- u8_t * const packet_data = sent_packet->get_data_offset(header_offset, data_length);
- if (packet_data == 0)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_buffer_too_short;
- }
-
- // Here we send the original packet.
- status = m_partner->EapPacketSend(
- data_length,
- static_cast<TUint8*>(packet_data));
- ++m_packet_index;
- }
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- return EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(status));
-}
-
-//--------------------------------------------------
-
-//
-eap_status_e eapol_am_core_symbian_c::reassociate(
- const eap_am_network_id_c * const /* send_network_id */,
- const eapol_key_authentication_type_e /* authentication_type */,
- const eap_variable_data_c * const /* PMKID */,
- const eap_variable_data_c * const /* WPXM_WPXK1 */,
- const eap_variable_data_c * const /* WPXM_WPXK2 */)
-{
- return EAP_STATUS_RETURN(m_am_tools, eap_status_not_supported);
-}
-
-//--------------------------------------------------
-
-//
-void eapol_am_core_symbian_c::state_notification(const abs_eap_state_notification_c * const state)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- if(state->get_protocol_layer() == eap_protocol_layer_general)
- {
- if (state->get_current_state() == eap_general_state_authentication_cancelled)
- {
- // Authentication was cancelled. Cannot continue.
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Authentication was cancelled. Sets timer EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID.\n")));
-
- set_timer(this, EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID, 0, 0);
- }
- else if (state->get_current_state() == eap_general_state_configuration_error)
- {
- // Configuration error. Cannot continue.
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Configuration error. Sets timer EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID.\n")));
-
- set_timer(this, EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID, 0, 0);
- }
- }
-
-
- if (m_block_packet_sends_and_notifications == true)
- {
- // Notification block is active.
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("state_notification: notification ignored because Disassociated() was called.\n")));
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return;
- }
-
-
- // Check if this is EAP layer notification
- if(state->get_protocol_layer() == eap_protocol_layer_eap)
- {
- switch (state->get_current_state())
- {
- case eap_state_none:
- break;
- case eap_state_identity_request_sent:
- // This is for server only so no need to notify WLM.
- break;
- case eap_state_identity_request_received:
- if (m_authentication_indication_sent == false)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EAuthenticating.\n")));
- m_partner->EapIndication(EAuthenticating);
- m_authentication_indication_sent = true;
- }
- break;
- case eap_state_identity_response_received:
- // This is for server only so no need to notify WLM.
- break;
- case eap_state_authentication_finished_successfully:
- {
-
- increment_authentication_counter();
- m_successful_authentications++;
-
- if (m_wpa_psk_mode_active == false)
- {
- TEap eap;
- eap.Enabled = ETrue;
- eap.UID.Num(static_cast<TInt>(state->get_eap_type()));
-
- // This moves the successful type to be the top priority type in IAP settings.
- TRAPD(err, SetToTopPriorityL(&eap));
- if (err != KErrNone)
- {
- // Just log the error.
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("state_notification: SetToTopPriorityL leaved!\n")));
- }
-
- // Move the active eap type index to the first type
- m_eap_index = 0;
- }
-
-
- }
- break;
- case eap_state_authentication_terminated_unsuccessfully:
- {
- if (m_wpa_psk_mode_active == false)
- {
- // Set index to next type.
- m_eap_index++;
- }
-
- increment_authentication_counter();
- m_failed_authentications++;
-
- // Restart authentication
- eap_am_network_id_c* send_network_id = new eap_am_network_id_c(m_am_tools, state->get_send_network_id());
- if (send_network_id == 0
- || send_network_id->get_is_valid_data() == false)
- {
- delete send_network_id;
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EFailedCompletely.\n")));
- m_partner->EapIndication(EFailedCompletely);
- break;
- }
- set_timer(this, EAPOL_AM_CORE_TIMER_RESTART_AUTHENTICATION_ID, send_network_id, 0);
-
- }
- break;
- default:
- break;
- }
- }
- else
- {
- if(state->get_protocol_layer() == eap_protocol_layer_eapol)
- {
- switch (state->get_current_state())
- {
- case eapol_state_no_start_response:
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: ENoResponse.\n")));
- m_partner->EapIndication(ENoResponse);
- break;
- default:
- break;
- }
- }
- else if(state->get_protocol_layer() == eap_protocol_layer_eapol_key)
- {
- switch (state->get_current_state())
- {
- case eapol_key_state_802_11i_authentication_terminated_unsuccessfull:
- {
- increment_authentication_counter();
- m_failed_authentications++;
-
- // Consider EAPOL layer failures fatal.
- EAP_TRACE_ERROR(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("ERROR: Unsuccessful authentication on EAPOL level.\n")));
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EThisAPFailed.\n")));
- m_partner->EapIndication(EThisAPFailed);
- }
- break;
- case eapol_key_state_802_11i_authentication_finished_successfull:
- {
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("EAPOL_KEY: %s: Authentication SUCCESS\n"),
- (m_is_client == true ? "client": "server")));
- }
- break;
- default:
- break;
- }
- }
- }
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
-}
-
-//--------------------------------------------------
-
-//
-
-eap_status_e eapol_am_core_symbian_c::timer_expired(
- const u32_t id, void * /* data */)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::TimerExpired id = %d.\n"),
- id));
-
- switch (id)
- {
- case EAPOL_AM_CORE_TIMER_RESTART_AUTHENTICATION_ID:
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("EAPOL_AM_CORE_TIMER_RESTART_AUTHENTICATION_ID elapsed: Stopping stack.\n")));
-
- // Stop stack. Do this only if Ethernet core still exists.
- if (m_ethernet_core != 0)
- {
- m_ethernet_core->shutdown();
- delete m_ethernet_core;
- m_ethernet_core = 0;
- }
- if (m_wpa_psk_mode_active == true)
- {
- // PSK mode active - cannot restart. Just fail.
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("WPA PSK mode failed.\n")));
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EThisAPFailed.\n")));
- m_partner->EapIndication(EThisAPFailed);
- break;
-
- }
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Checking if more types.\n")));
-
- TInt i;
- TEap *eapType = 0;
- // Search for more EAP types to try
- for (i = m_eap_index; i < m_iap_eap_array.Count(); i++)
- {
- // Find the next enabled EAP type (highest priority)
- eapType = m_iap_eap_array[i];
- if (eapType->Enabled == 1)
- {
- break;
- }
- }
- // Update index to point to next type to be tried
- m_eap_index = i;
-
- if (i >= m_iap_eap_array.Count())
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("No more configured EAP types to try.\n")));
-
- // No point in trying to restart authentication because there isn't any more
- // EAP types left to try...
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EThisAPFailed.\n")));
- m_partner->EapIndication(EThisAPFailed);
- break;
- }
-
- // Check if authentication mode must be changed
- TLex8 tmp(eapType->UID);
- TInt type(0);
- tmp.Val(type);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Found new type to try: %d.\n"), type));
-
- switch (type)
- {
- case eap_type_leap:
- m_active_type_is_leap = true;
- if (m_802_11_authentication_mode != EAuthModeLeap
- && m_security_mode != Wpa
- && m_security_mode != Wpa2Only) // In WPA or WPA2 even LEAP uses open authentication
- {
- // New type is LEAP and the old was something else:
- // must reassociate with correct authentication mode.
- m_self_disassociated = true;
- TInt result = m_partner->Disassociate();
- if (result != KErrNone)
- {
- // Probably unrecoverable error
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EFailedCompletely.\n")));
- m_partner->EapIndication(EFailedCompletely);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_ok;
- }
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("TimerExpired: Changing auth type to LEAP.\n")));
-
- m_802_11_authentication_mode = EAuthModeLeap;
-
- m_partner->Associate(EAuthModeLeap);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_ok;
- }
- break;
- default:
- m_active_type_is_leap = false;
- if (m_802_11_authentication_mode != EAuthModeOpen
- && m_security_mode != Wpa
- && m_security_mode != Wpa2Only) // In WPA or WPA2 even LEAP uses open authentication)
- {
- // New type is non-LEAP and the old was LEAP:
- // must reassociate with correct authentication mode
- m_self_disassociated = true;
- TInt result = m_partner->Disassociate();
- if (result != KErrNone)
- {
- // Probably unrecoverable error
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EFailedCompletely.\n")));
-
- m_partner->EapIndication(EFailedCompletely);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_ok;
- }
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("TimerExpired: Changing auth type to OPEN.\n")));
-
- m_802_11_authentication_mode = EAuthModeOpen;
-
- m_partner->Associate(EAuthModeOpen);
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_ok;
- }
- break;
- }
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("TimerExpired: No need to change auth type.\n")));
-
- if (CompleteAssociation(
- KErrNone,
- m_local_address,
- m_remote_address,
- m_received_wpa_ie,
- m_received_wpa_ie_length,
- m_sent_wpa_ie,
- m_sent_wpa_ie_length,
- m_group_key_cipher_suite,
- m_pairwise_key_cipher_suite) != KErrNone)
- {
- // Probably unrecoverable error
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Indication sent to WLM: EFailedCompletely.\n")));
- m_partner->EapIndication(EFailedCompletely);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_ok;
- }
- }
- break;
-
- case EAPOL_AM_CORE_TIMER_DELETE_STACK_ID:
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("EAPOL_AM_CORE_TIMER_DELETE_STACK_ID elapsed: Delete stack.\n")));
-
- cancel_all_timers();
-
- // Delete stack
- if (m_ethernet_core != 0)
- {
- m_ethernet_core->shutdown();
- delete m_ethernet_core;
- m_ethernet_core = 0;
- }
- m_stack_marked_to_be_deleted = false;
-
- // Re-activates timer queue.
- eap_status_e status = m_am_tools->re_activate_timer_queue();
- if (status != eap_status_ok)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("ERROR: re_activate_timer_queue() failed, status = %d\n")));
- }
- }
- break;
-
- case EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID:
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID elapsed: Indication sent to WLM: EFailedCompletely.\n")));
-
- m_partner->EapIndication(EFailedCompletely);
- }
- break;
-
- default:
- break;
- }
- return eap_status_ok;
-}
-
-eap_status_e eapol_am_core_symbian_c::timer_delete_data(
- const u32_t id, void *data)
-{
- switch (id)
- {
- case EAPOL_AM_CORE_TIMER_RESTART_AUTHENTICATION_ID:
- {
- eap_am_network_id_c* tmp = static_cast<eap_am_network_id_c*>(data);
- delete tmp;
- }
- break;
- case EAPOL_AM_CORE_TIMER_DELETE_STACK_ID:
- break;
- case EAPOL_AM_CORE_TIMER_FAILED_COMPLETELY_ID:
- break;
-
- default:
- {
- EAP_TRACE_ERROR(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::timer_delete_data: deleted unknown timer.\n")));
- (void)EAP_STATUS_RETURN(m_am_tools, eap_status_not_supported);
- }
- }
- return eap_status_ok;
-}
-//--------------------------------------------------
-
-//
-u32_t eapol_am_core_symbian_c::get_header_offset(
- u32_t * const MTU,
- u32_t * const trailer_length)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
- *MTU = KMTU;
- *trailer_length = KTrailerLength;
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return KHeaderOffset;
-}
-
-//--------------------------------------------------
-
-//
-eap_status_e eapol_am_core_symbian_c::unload_module(const eap_type_value_e type)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
- eap_status_e status(eap_status_type_does_not_exists_error);
- TInt index = m_eap_type_array.Find(type);
- if (index != KErrNotFound)
- {
- delete m_plugin_if_array[index];
- m_plugin_if_array.Remove(index);
- m_eap_type_array.Remove(index);
- status = eap_status_ok;
- }
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return EAP_STATUS_RETURN(m_am_tools, status);
-}
-
-//--------------------------------------------------
-
-//
-eap_status_e eapol_am_core_symbian_c::eap_acknowledge(const eap_am_network_id_c * const receive_network_id)
-{
- // Any Network Protocol packet is accepted as a success indication.
- // This is described in RFC 2284 "PPP Extensible Authentication Protocol (EAP)".
-
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- eap_status_e status = m_ethernet_core->eap_acknowledge(receive_network_id);
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return EAP_STATUS_RETURN(m_am_tools, status);
-}
-
-//--------------------------------------------------
-
-//
-eap_status_e eapol_am_core_symbian_c::load_module(
- const eap_type_value_e type,
- const eap_type_value_e tunneling_type,
- abs_eap_base_type_c * const partner,
- eap_base_type_c ** const eap_type_if,
- const bool is_client_when_true,
- const eap_am_network_id_c * const receive_network_id)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::load_module(type %d=%s, tunneling_type %d=%s)\n"),
- static_cast<TInt>(type),
- eap_header_string_c::get_eap_type_string(type),
- static_cast<TInt>(tunneling_type),
- eap_header_string_c::get_eap_type_string(tunneling_type)));
-
- eap_status_e status = eap_status_process_general_error;
- TBuf8<KMaxEapCueLength> cue;
- cue.Num(static_cast<TInt>(convert_eap_type_to_u32_t(type)));
- CEapType* eapType = 0;
- TInt error(KErrNone);
-
- // Check if this EAP type has already been loaded
- TInt eapArrayIndex = m_eap_type_array.Find(type);
- if (eapArrayIndex != KErrNotFound)
- {
- // Yep. It was loaded already.
- eapType = m_plugin_if_array[eapArrayIndex];
- }
- else
- {
- // We must have a trap here since the EAPOL core knows nothing about Symbian.
- TRAP(error, (eapType = CEapType::NewL(cue, m_index_type, m_index)));
- if (error != KErrNone
- || eapType == 0)
- {
- // Interface not found or implementation creation function failed
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("ECom could not find/initiate implementation.\n")));
- return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
- }
- }
- // Set the tunneling type
- eapType->SetTunnelingType(convert_eap_type_to_u32_t(tunneling_type));
-
- // Create the EAP protocol interface implementation.
- TRAP(error, (*eap_type_if = eapType->GetStackInterfaceL(m_am_tools, partner, is_client_when_true, receive_network_id)));
-
- if (error != KErrNone
- || *eap_type_if == 0
- || (*eap_type_if)->get_is_valid() == false)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Could not create EAP type interface instance. Error: %d\n"), error));
-
- status = eap_status_allocation_error;
- // Unload DLL (two ways, depending whether this type was already loaded...)
- if (eapArrayIndex == KErrNotFound)
- {
- // No need to call shutdown here because GetStackInterfaceL has done it.
- delete eapType;
- }
- else
- {
- unload_module(type);
- }
- // Note: even in error cases eap_core_c deletes eap_type_if
- }
- else
- {
- status = eap_status_ok;
- if (eapArrayIndex == KErrNotFound)
- {
- // Add plugin information to the member arrays. There is no need to store eap_type pointer because
- // the stack takes care of its deletion.
- if (m_plugin_if_array.Append(eapType) != KErrNone)
- {
- delete eapType;
- status = eap_status_allocation_error;
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return EAP_STATUS_RETURN(m_am_tools, status);
- }
- if (m_eap_type_array.Append(type) != KErrNone)
- {
- // Remove the eap type added just previously
- m_plugin_if_array.Remove(m_plugin_if_array.Count() - 1);
- delete eapType;
- status = eap_status_allocation_error;
- 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, status);
-}
-
-//--------------------------------------------------
-
-//
-TInt eapol_am_core_symbian_c::Disassociated()
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::Disassociated()\n")));
-
- if (m_self_disassociated == true)
- {
- // We were expecting this. No need to reset state.
- m_self_disassociated = false;
- return KErrNone;
- }
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::Disassociated.\n")));
-
- eap_status_e status(eap_status_ok);
-
- // Set block on.
- m_block_packet_sends_and_notifications = true;
-
- // Reset flags
- m_success_indication_sent = false;
- m_unicast_wep_key_received = false;
- m_broadcast_wep_key_received = false;
- m_authentication_indication_sent = false;
-
- if (m_ethernet_core != 0)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Stack exists. Set EAPOL_AM_CORE_TIMER_DELETE_STACK_ID timer.\n")));
-
- m_stack_marked_to_be_deleted = true;
- set_timer(this, EAPOL_AM_CORE_TIMER_DELETE_STACK_ID, 0, 0);
- }
- else
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Stack did not exists. EAPOL_AM_CORE_TIMER_DELETE_STACK_ID timer not set.\n")));
- }
-
- // reset index
- m_eap_index = 0;
-
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));
-}
-
-//--------------------------------------------------
-
-//
-TInt eapol_am_core_symbian_c::SendWPAMICFailureReport(
- TBool aFatalMICFailure,
- const TMICFailureType aMICFailureType)
-{
- EAP_TRACE_ALWAYS(
- m_am_tools,
- TRACE_FLAGS_ALWAYS|TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::SendWPAMICFailureReport(%d, %d).\n"),
- aFatalMICFailure,
- aMICFailureType));
-
- bool fatal_failure_when_true = true;
-
- if (!aFatalMICFailure)
- {
- fatal_failure_when_true = false;
- }
-
- eapol_RSNA_key_header_c::eapol_tkip_mic_failure_type_e tkip_mic_failure_type
- = eapol_RSNA_key_header_c::eapol_tkip_mic_failure_type_pairwise_key;
-
- if (aMICFailureType == EGroupKey)
- {
- tkip_mic_failure_type
- = eapol_RSNA_key_header_c::eapol_tkip_mic_failure_type_group_key;
- }
-
- const eap_status_e status = m_ethernet_core->tkip_mic_failure(
- m_receive_network_id,
- fatal_failure_when_true,
- tkip_mic_failure_type);
-
- return m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status));
-}
-
-
-//--------------------------------------------------
-
-//
-void eapol_am_core_symbian_c::ReadEAPSettingsL()
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::ReadEAPSettingsL()\n")));
-
- eap_status_e status(eap_status_ok);
-
- // Delete old IAP settings
- m_iap_eap_array.ResetAndDestroy();
- if (m_index_type == ELan)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Beginning to read IAP settings - Type: %d, Index: %d.\n"), m_index_type, m_index));
-
- CWLanSettings* wlan = new(ELeave) CWLanSettings;
- CleanupStack::PushL(wlan);
- SWLANSettings wlanSettings;
- if (wlan->Connect() != KErrNone)
- {
- // Could not connect to CommDB
- User::Leave(KErrCouldNotConnect);
- }
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT, (EAPL("Connected to CommDbIf.\n")));
-
- if (wlan->GetWlanSettingsForService(m_index, wlanSettings) != KErrNone)
- {
- wlan->Disconnect();
- User::Leave(KErrUnknown);
- }
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Got WLAN settings.\n")));
-
- wlan->GetEapDataL(m_iap_eap_array);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Got EAP data:\n")));
-
- for (TInt i = 0; i < m_iap_eap_array.Count(); i++)
- {
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("EAP type %d\n"),
- i));
-
- TLex8 tmp(m_iap_eap_array[i]->UID);
- TInt val(0);
- tmp.Val(val);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL(" UID: %d\n"), val));
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL(" Enabled: %d\n"),
- m_iap_eap_array[i]->Enabled));
- }
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("End EAP data:\n")));
-
- if (m_iap_eap_array.Count() == 0)
- {
- // The EAP field was empty. Allow all types.
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Empty EAP field -> enable all types.\n")));
-
- RImplInfoPtrArray eapArray;
-
- REComSession::ListImplementationsL(KEapTypeInterfaceUid, eapArray);
-
- TEap *eap;
- for (TInt i = 0; i < eapArray.Count(); i++)
- {
- eap = new(ELeave) TEap;
- eap->UID.Copy(eapArray[i]->DataType());
- eap->Enabled = ETrue;
- m_iap_eap_array.Append(eap);
- }
-
- eapArray.ResetAndDestroy();
- }
-
- // Get security mode
- if (m_wpa_override_enabled == false)
- {
- m_security_mode = static_cast<EWlanSecurityMode>(wlanSettings.SecurityMode);
-
- if (wlanSettings.EnableWpaPsk)
- {
- m_wpa_psk_mode_allowed = true;
- }
- else
- {
- m_wpa_psk_mode_allowed = false;
- }
- }
- else
- {
- // WPA override is enabled
- m_security_mode = Wpa;
- if (m_wpa_psk_password_override->get_is_valid_data() == true
- && m_wpa_psk_password_override->get_data_length() > 0)
- {
- m_wpa_psk_mode_allowed = true;
- }
- else
- {
- m_wpa_psk_mode_allowed = false;
- }
- }
-
-
- // Get WPA or WPA2 pre shared key & SSID
- if ((m_security_mode == Wlan8021x
- || m_security_mode == Wpa
- || m_security_mode == Wpa2Only)
- && m_wpa_psk_mode_allowed == true
- && m_is_client == true)
- {
- eap_variable_data_c * password = new eap_variable_data_c(m_am_tools);
- if (password == 0)
- {
- wlan->Disconnect();
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(KErrNoMemory);
- }
- eap_variable_data_c * ssid = new eap_variable_data_c(m_am_tools);
- if (ssid == 0)
- {
- delete password;
- wlan->Disconnect();
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(KErrNoMemory);
- }
-
- // When using easy WLAN there might be WPA PSK override
- if (m_wpa_psk_password_override->get_is_valid_data() == true
- && m_wpa_psk_password_override->get_data_length() > 0)
- {
- // Use WPA PSK override
- status = password->set_copy_of_buffer(
- m_wpa_psk_password_override->get_data(m_wpa_psk_password_override->get_data_length()),
- m_wpa_psk_password_override->get_data_length());
- if (status != eap_status_ok)
- {
- delete password;
- delete ssid;
- wlan->Disconnect();
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
- }
- }
- else
- {
- status = password->set_copy_of_buffer(wlanSettings.WPAPreSharedKey.Ptr(), wlanSettings.WPAPreSharedKey.Size());
- if (status != eap_status_ok)
- {
- delete password;
- delete ssid;
- wlan->Disconnect();
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
- }
- }
-
- TBuf8<KMaxSSIDLength> tmp;
- tmp.Copy(wlanSettings.SSID);
- status = ssid->set_copy_of_buffer(tmp.Ptr(), tmp.Size());
- if (status != eap_status_ok)
- {
- delete password;
- delete ssid;
- wlan->Disconnect();
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
- }
-
- crypto_wpa_psk_password_hash_c password_hash(m_am_tools);
-
- if (ssid->get_data_length() == 0)
- {
- status = ssid->set_copy_of_buffer(m_ssid);
- if (status != eap_status_ok)
- {
- delete password;
- delete ssid;
- wlan->Disconnect();
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
- }
- }
-
- TPSKEntry pskEntry;
-
- pskEntry.indexType = m_index_type;
- pskEntry.index = m_index;
-
- TPtr8 ssidPtr(
- ssid->get_data(ssid->get_data_length()),
- ssid->get_data_length(),
- ssid->get_data_length()
- );
-
- TInt err(KErrNone);
-
- if (m_wpa_psk_password_override->get_is_valid_data() == false
- || m_wpa_psk_password_override->get_data_length() == 0)
- {
- // Retrieve saved PSK only when override is not in effect
- TRAP(err, RetrievePSKL(pskEntry));
- }
-
- if (err != KErrNone
- || pskEntry.ssid.Compare(ssidPtr) != 0
- || pskEntry.password.Compare(wlanSettings.WPAPreSharedKey) != 0)
- {
- EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("No previous PSK found...\n")));
- // No previous PSK or parameters were changed. We need to calculate
- // PSK again
-
- status = password_hash.password_hash(
- password,
- ssid,
- m_wpa_preshared_key,
- 0,
- 0);
-
- if (status != eap_status_ok)
- {
- delete password;
- delete ssid;
- wlan->Disconnect();
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
- // return;
- }
-
- if (m_wpa_psk_password_override->get_is_valid_data() == false
- || m_wpa_psk_password_override->get_data_length() == 0)
- {
- // Save new PSK (only if psk override is not in effect)
- pskEntry.ssid.Copy(ssidPtr);
-
- pskEntry.password.Copy(wlanSettings.WPAPreSharedKey);
-
- pskEntry.psk.Copy(
- m_wpa_preshared_key->get_data(m_wpa_preshared_key->get_data_length()),
- m_wpa_preshared_key->get_data_length()
- );
-
- EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Saving PSK.\n")));
- SavePSKL(pskEntry);
- }
- }
- else
- {
- // Copy retrieved psk to member variable
- status = m_wpa_preshared_key->set_copy_of_buffer(pskEntry.psk.Ptr(), pskEntry.psk.Size());
- if (status != eap_status_ok)
- {
- delete password;
- delete ssid;
- wlan->Disconnect();
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- User::Leave(m_am_tools->convert_eapol_error_to_am_error(EAP_STATUS_RETURN(m_am_tools, status)));
- }
- }
- delete password;
- delete ssid;
- }
-
- wlan->Disconnect();
- CleanupStack::PopAndDestroy(wlan);
- if (m_security_mode != Wlan8021x
- && m_security_mode != Wpa
- && m_security_mode != Wpa2Only)
- {
- // Unsupported mode
- User::Leave(KErrNotSupported);
- }
- }
- else
- {
- // At the moment only LAN bearer is supported.
- User::Leave(KErrNotSupported);
- }
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
-}
-
-//--------------------------------------------------
-
-void eapol_am_core_symbian_c::SetToTopPriorityL(const TEap* const aEapType)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::SetToTopPriorityL()\n")));
-
- if (m_index_type == ELan)
- {
- TInt i(0);
- TBuf8<3> uid;
- for (i = 0; i < m_iap_eap_array.Count(); i++)
- {
- TEap* eap = m_iap_eap_array[i];
- if (eap->UID[0] == '0')
- {
- // Cut the leading zero
- uid.Copy(eap->UID.Right(eap->UID.Length()-1));
- }
- else
- {
- uid.Copy(eap->UID);
- }
- if (eap->Enabled == aEapType->Enabled
- && uid.Compare(aEapType->UID) == 0)
- {
- // Found
- break;
- }
- }
- if (i >= m_iap_eap_array.Count())
- {
- // This should never happen
- User::Leave(KErrNotFound);
- }
-
- TLex8 tmp(aEapType->UID);
- TInt val(0);
- tmp.Val(val);
-
- EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Setting to top priority:\n")));
- EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Old index: %d\n"), i));
- EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL(" UID: %d\n"), val));
- EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL(" Enabled: %d\n"), aEapType->Enabled));
-
- if (i == 0)
- {
- // Already at the highest priority
- return;
- }
-
- EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Beginning to write IAP EAP settings - Type: %d, Index: %d.\n"), m_index_type, m_index));
-
- CWLanSettings* wlan = new(ELeave) CWLanSettings;
- CleanupStack::PushL(wlan);
- SWLANSettings wlanSettings;
- if (wlan->Connect() != KErrNone)
- {
- // Could not connect to CommDB
- User::Leave(KErrCouldNotConnect);
- }
- EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Connected to CommDbIf.\n")));
- if (wlan->GetWlanSettingsForService(m_index, wlanSettings) != KErrNone)
- {
- wlan->Disconnect();
- User::Leave(KErrUnknown);
- }
- EAP_TRACE_DEBUG(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Got WLAN settings.\n")));
-
- // Change the order
- TEap* eap = m_iap_eap_array[i];
-
- m_iap_eap_array.Remove(i); // This does not delete the object
-
- m_iap_eap_array.Insert(eap, 0);
-
- wlan->SetEapDataL(m_iap_eap_array);
-
- wlan->Disconnect();
-
- CleanupStack::PopAndDestroy(wlan);
- }
- else
- {
- // At the moment only LAN bearer is supported.
- User::Leave(KErrNotSupported);
- }
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
-}
-
-//--------------------------------------------------
-
-eap_status_e eapol_am_core_symbian_c::configure()
-{
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::configure()\n")));
-
-
- //----------------------------------------------------------
-
-#if defined(USE_EAP_ERROR_TESTS)
-
- {
- eap_variable_data_c EAP_ERROR_TEST_enable_random_errors(m_am_tools);
-
- eap_status_e status = read_configure(
- cf_str_EAP_ERROR_TEST_enable_random_errors.get_field(),
- &EAP_ERROR_TEST_enable_random_errors);
- if (status == eap_status_ok
- && EAP_ERROR_TEST_enable_random_errors.get_is_valid_data() == true)
- {
- u32_t *enable_random_errors = reinterpret_cast<u32_t *>(
- EAP_ERROR_TEST_enable_random_errors.get_data(sizeof(u32_t));
- if (enable_random_errors != 0
- && *enable_random_errors != 0)
- {
- m_enable_random_errors = true;
- }
- }
- }
-
- {
- eap_variable_data_c EAP_ERROR_TEST_send_original_packet_first(m_am_tools);
-
- eap_status_e status = read_configure(
- cf_str_EAP_ERROR_TEST_send_original_packet_first.get_field(),
- &EAP_ERROR_TEST_send_original_packet_first);
- if (status == eap_status_ok
- && EAP_ERROR_TEST_send_original_packet_first.get_is_valid_data() == true)
- {
- u32_t *send_original_packet_first = reinterpret_cast<u32_t *>(
- EAP_ERROR_TEST_send_original_packet_first.get_data(sizeof(u32_t));
- if (send_original_packet_first != 0
- && *send_original_packet_first != 0)
- {
- m_send_original_packet_first = true;
- }
- }
- }
-
- {
- eap_variable_data_c EAP_ERROR_TEST_generate_multiple_error_packets(m_am_tools);
-
- eap_status_e status = read_configure(
- cf_str_EAP_ERROR_TEST_generate_multiple_error_packets.get_field(),
- &EAP_ERROR_TEST_generate_multiple_error_packets);
- if (status == eap_status_ok
- && EAP_ERROR_TEST_generate_multiple_error_packets.get_is_valid_data() == true)
- {
- u32_t *generate_multiple_error_packets = reinterpret_cast<u32_t *>(
- EAP_ERROR_TEST_generate_multiple_error_packets.get_data(sizeof(u32_t));
- if (generate_multiple_error_packets != 0
- && *generate_multiple_error_packets != 0)
- {
- m_generate_multiple_error_packets = *generate_multiple_error_packets;
- }
- }
- }
-
-
- {
- eap_variable_data_c EAP_ERROR_TEST_manipulate_ethernet_header(m_am_tools);
-
- eap_status_e status = read_configure(
- cf_str_EAP_ERROR_TEST_manipulate_ethernet_header.get_field(),
- &EAP_ERROR_TEST_manipulate_ethernet_header);
- if (status == eap_status_ok
- && EAP_ERROR_TEST_manipulate_ethernet_header.get_is_valid_data() == true)
- {
- u32_t *manipulate_ethernet_header = reinterpret_cast<u32_t *>(
- EAP_ERROR_TEST_manipulate_ethernet_header.get_data(sizeof(u32_t));
- if (manipulate_ethernet_header != 0
- && *manipulate_ethernet_header != 0)
- {
- m_manipulate_ethernet_header = true;
- }
- }
- }
-
- {
- eap_variable_data_c EAP_ERROR_TEST_error_probability(m_am_tools);
-
- eap_status_e status = read_configure(
- cf_str_EAP_ERROR_TEST_error_probability.get_field(),
- &EAP_ERROR_TEST_error_probability);
- if (status == eap_status_ok
- && EAP_ERROR_TEST_error_probability.get_is_valid_data() == true)
- {
- u32_t *error_probability = reinterpret_cast<u32_t *>(
- EAP_ERROR_TEST_error_probability.get_data(sizeof(u32_t));
- if (error_probability != 0)
- {
- m_error_probability = *error_probability;
- }
- }
- }
-
- {
- eap_variable_data_c EAP_disable_function_traces(m_am_tools);
-
- eap_status_e status = read_configure(
- cf_str_EAP_TRACE_enable_function_traces.get_field(),
- &EAP_disable_function_traces);
- if (status == eap_status_ok
- && EAP_disable_function_traces.get_is_valid_data() == true)
- {
- u32_t *disable_function_traces = reinterpret_cast<u32_t *>(
- EAP_disable_function_traces.get_data(sizeof(u32_t));
- if (disable_function_traces != 0
- && *disable_function_traces != 0)
- {
- m_am_tools->set_trace_mask(
- m_am_tools->get_trace_mask()
- | eap_am_tools_c::eap_trace_mask_functions
- );
- }
- }
- }
-
-#endif //#if defined(USE_EAP_ERROR_TESTS)
-
-
- //----------------------------------------------------------
-
- {
- eap_variable_data_c EAP_TRACE_disable_traces(m_am_tools);
-
- eap_status_e status = read_configure(
- cf_str_EAP_TRACE_disable_traces.get_field(),
- &EAP_TRACE_disable_traces);
- if (status == eap_status_ok
- && EAP_TRACE_disable_traces.get_is_valid_data() == true)
- {
- u32_t *disable_traces = reinterpret_cast<u32_t *>(
- EAP_TRACE_disable_traces.get_data(sizeof(u32_t)));
- if (disable_traces != 0
- && *disable_traces != 0)
- {
- m_am_tools->set_trace_mask(eap_am_tools_c::eap_trace_mask_none);
- }
- else
- {
- // OK, set the default trace mask.
- m_am_tools->set_trace_mask(
- eap_am_tools_c::eap_trace_mask_debug
- | eap_am_tools_c::eap_trace_mask_always
- | eap_am_tools_c::eap_trace_mask_error);
- }
- }
- }
-
- //----------------------------------------------------------
-
- {
- eap_variable_data_c EAP_TRACE_activate_only_trace_masks_always_and_error(m_am_tools);
-
- eap_status_e status = read_configure(
- cf_str_EAP_TRACE_activate_only_trace_masks_always_and_error.get_field(),
- &EAP_TRACE_activate_only_trace_masks_always_and_error);
- if (status == eap_status_ok
- && EAP_TRACE_activate_only_trace_masks_always_and_error.get_is_valid_data() == true)
- {
- u32_t *activate_trace_mask_always
- = reinterpret_cast<u32_t *>(
- EAP_TRACE_activate_only_trace_masks_always_and_error.get_data(
- sizeof(u32_t)));
- if (activate_trace_mask_always != 0
- && *activate_trace_mask_always != 0)
- {
- m_am_tools->set_trace_mask(
- eap_am_tools_c::eap_trace_mask_always
- | eap_am_tools_c::eap_trace_mask_error
- );
- }
- }
- }
-
- //----------------------------------------------------------
-
- {
- eap_variable_data_c EAP_TRACE_activate_trace_on_error(m_am_tools);
-
- eap_status_e status = read_configure(
- cf_str_EAP_TRACE_activate_trace_on_error.get_field(),
- &EAP_TRACE_activate_trace_on_error);
- if (status == eap_status_ok
- && EAP_TRACE_activate_trace_on_error.get_is_valid_data() == true)
- {
- u32_t *activate_trace_on_error = reinterpret_cast<u32_t *>(
- EAP_TRACE_activate_trace_on_error.get_data(sizeof(u32_t)));
- if (activate_trace_on_error != 0
- && *activate_trace_on_error != 0)
- {
- m_am_tools->set_activate_trace_on_error();
- }
- }
- }
-
- //----------------------------------------------------------
-
- // All of the configuration options are optional.
- // So we return OK.
- return eap_status_ok;
-}
-
-//--------------------------------------------------
-
-eap_status_e eapol_am_core_symbian_c::read_configure(
- const eap_configuration_field_c * const field,
- eap_variable_data_c * const data)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
- EAP_ASSERT_ALWAYS(data != NULL);
-
- // To remove compilation warning in UREL due to KMaxConfigStringLength.
- if(field->get_field_length() > KMaxConfigStringLength)
- {
- return eap_status_process_general_error;
- }
-
- // Trap must be set here because the OS independent portion of EAPOL
- // that calls this function does not know anything about Symbian.
- eap_status_e status(eap_status_ok);
-
- // Check if the wanted parameter is default type
-
- eap_variable_data_c wanted_field(m_am_tools);
- eap_variable_data_c type_field(m_am_tools);
- eap_variable_data_c type_field_server(m_am_tools);
-
- status = wanted_field.set_buffer(
- field->get_field(),
- field->get_field_length(),
- false,
- false);
- if (status != eap_status_ok)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return status;
- }
-
- status = type_field.set_buffer(
- cf_str_EAP_default_type_u32_t.get_field()->get_field(),
- cf_str_EAP_default_type_u32_t.get_field()->get_field_length(),
- false,
- false);
- if (status != eap_status_ok)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return status;
- }
-
- status = type_field_server.set_buffer(
- cf_str_EAP_server_default_type_u32_t.get_field()->get_field(),
- cf_str_EAP_server_default_type_u32_t.get_field()->get_field_length(),
- false,
- false);
- if (status != eap_status_ok)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return status;
- }
-
- if (!wanted_field.compare(&type_field)
- || !wanted_field.compare(&type_field_server))
- {
- TInt i;
- // We need to return here the next EAP type we should try
- for (i = m_eap_index; i < m_iap_eap_array.Count(); i++)
- {
- // Find the first enabled EAP type (highest priority)
- TEap *eapType = m_iap_eap_array[i];
- if (eapType->Enabled == 1)
- {
- // Convert the string to integer
- TLex8 tmp(eapType->UID);
- TInt val(0);
- tmp.Val(val);
- status = data->set_copy_of_buffer(reinterpret_cast<u8_t *>(&val), sizeof(TUint));
- if (status != eap_status_ok)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
- }
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("EAPOL: Trying EAP type: %d.\n"), val));
- break;
- }
- }
- m_eap_index = i;
- if (i >= m_iap_eap_array.Count())
- {
- // Not found
- // Send WLM notification because there is no way that the authentication
- // can be successful if we don't have any EAP types to use...
- if (m_is_client)
- {
- EAP_TRACE_ERROR(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("ERROR: No configured EAP types or all tried unsuccessfully.\n")));
- }
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_configure_field);
- }
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return EAP_STATUS_RETURN(m_am_tools, status);
- }
-
- // It was something else than EAP type. Read it from DB.
- TRAPD(err, read_configureL(
- field->get_field(),
- field->get_field_length(),
- data));
- if (err != KErrNone)
- {
- status = m_am_tools->convert_am_error_to_eapol_error(err);
-
-#if defined(USE_EAP_FILECONFIG)
- if (m_fileconfig != 0
- && m_fileconfig->get_is_valid() == true)
- {
- // Here we could try the final configuration option.
- status = m_fileconfig->read_configure(
- field,
- data);
- }
-#endif //#if defined(USE_EAP_FILECONFIG)
- }
-
- m_am_tools->trace_configuration(
- status,
- field,
- data);
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return EAP_STATUS_RETURN(m_am_tools, status);
-}
-
-//--------------------------------------------------
-
-void eapol_am_core_symbian_c::read_configureL(
- eap_config_string field,
- const u32_t /*field_length*/,
- eap_variable_data_c * const data)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- // Create a buffer for the ascii strings - initialised with the argument
- HBufC8* asciibuf = HBufC8::NewLC(128);
- TPtr8 asciiString = asciibuf->Des();
- asciiString.Copy(reinterpret_cast<const unsigned char *>(field));
-
- // Buffer for unicode parameter
- HBufC* unicodebuf = HBufC::NewLC(128);
- TPtr unicodeString = unicodebuf->Des();
-
- // Convert to unicode
- unicodeString.Copy(asciiString);
-
- // Now do the database query
- HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
- TPtr sqlStatement = buf->Des();
- _LIT(KSQLQueryRow, "SELECT %S FROM eapol");
- sqlStatement.Format(KSQLQueryRow, &unicodeString);
-
- RDbView view;
- User::LeaveIfError(view.Prepare(m_database, TDbQuery(sqlStatement), TDbWindow::EUnlimited));
- CleanupClosePushL(view);
- User::LeaveIfError(view.EvaluateAll());
- if (view.FirstL())
- {
- eap_status_e status(eap_status_process_general_error);
- view.GetL();
- switch (view.ColType(1))
- {
- case EDbColText:
- {
- unicodeString = view.ColDes(1);
- // Convert to 8-bit
- asciiString.Copy(unicodeString);
- if (asciiString.Size() > 0)
- {
- status = data->set_copy_of_buffer(asciiString.Ptr(), asciiString.Size());
- if (status != eap_status_ok)
- {
- User::Leave(KErrNoMemory);
- }
- }
- else
- {
- // Empty field. Do nothing...data remains invalid
- // and the stack knows what to do hopefully.
- break;
- }
- }
- break;
- case EDbColUint32:
- {
- TUint value;
- value = view.ColUint32(1);
- status = data->set_copy_of_buffer((const unsigned char *) &value, sizeof(value));
- if (status != eap_status_ok)
- {
- User::Leave(KErrNoMemory);
- }
- }
- break;
- default:
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("read_configureL: Unexpected column type.\n")));
- User::Panic(_L("EAPOL"), 1);
- }
- }
- else
- {
- // Could not find parameter
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("read_configureL: Could not find configuration parameter.\n")));
- User::Leave(KErrNotFound);
- }
-
- // Close database
- CleanupStack::PopAndDestroy(4); // session & 3 buffers
-
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
-}
-
-//--------------------------------------------------
-
-eap_status_e eapol_am_core_symbian_c::write_configure(
- const eap_configuration_field_c * const /*field*/,
- eap_variable_data_c * const /*data*/)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return eap_status_not_supported;
-}
-
-//--------------------------------------------------
-
-//
-eap_status_e eapol_am_core_symbian_c::set_timer(
- abs_eap_base_timer_c * const p_initializer,
- const u32_t p_id,
- void * const p_data,
- const u32_t p_time_ms)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- const eap_status_e status = m_am_tools->am_set_timer(
- p_initializer,
- p_id,
- p_data,
- p_time_ms);
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return status;
-}
-
-//--------------------------------------------------
-
-//
-eap_status_e eapol_am_core_symbian_c::cancel_timer(
- abs_eap_base_timer_c * const p_initializer,
- const u32_t p_id)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- const eap_status_e status = m_am_tools->am_cancel_timer(
- p_initializer,
- p_id);
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return status;
-}
-
-//--------------------------------------------------
-
-//
-eap_status_e eapol_am_core_symbian_c::cancel_all_timers()
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- const eap_status_e status = m_am_tools->am_cancel_all_timers();
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return status;
-}
-
-//--------------------------------------------------
-
-eap_status_e eapol_am_core_symbian_c::check_is_valid_eap_type(const eap_type_value_e eap_type)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- TEap *eapType = 0;
-
- eap_status_e status(eap_status_illegal_eap_type);
-
- for (int i = 0; i < m_iap_eap_array.Count(); i++)
- {
- // Try next EAP type
- eapType = m_iap_eap_array[i];
- if (eapType->Enabled == 1)
- {
- // Convert the string to integer
- TLex8 tmp(eapType->UID);
- TInt val(0);
- tmp.Val(val);
- if (eap_type == static_cast<eap_type_ietf_values_e>(val))
- {
- // Allowed
- status = eap_status_ok;
- break;
- }
- }
- }
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- return EAP_STATUS_RETURN(m_am_tools, status);
-}
-
-//--------------------------------------------------
-
-eap_status_e eapol_am_core_symbian_c::get_eap_type_list(
- eap_array_c<eap_type_value_e> * const eap_type_list)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- TEap *eapType = 0;
-
- eap_status_e status(eap_status_illegal_eap_type);
-
- status = eap_type_list->reset();
- if (status != eap_status_ok)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return EAP_STATUS_RETURN(m_am_tools, status);
- }
-
- for (TInt i = 0; i < m_iap_eap_array.Count(); i++)
- {
- // Check if type is enabled
- eapType = m_iap_eap_array[i];
- if (eapType->Enabled == 1)
- {
- TLex8 tmp(eapType->UID);
- TInt val(0);
- tmp.Val(val);
-
- eap_type_value_e * const eap_type = new eap_type_value_e(
- static_cast<eap_type_ietf_values_e>(val));
- if (eap_type == 0)
- {
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
- }
-
- status = eap_type_list->add_object(eap_type, true);
- 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_ok;
-}
-
-//--------------------------------------------------
-
-void eapol_am_core_symbian_c::TryOpenDatabaseL(RDbNamedDatabase& aDatabase, RDbs& aSession)
-{
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::TryOpenDatabaseL()\n")));
-
- // 1. Open/create a database
-
- // Connect to the DBMS server.
- User::LeaveIfError(aSession.Connect());
- CleanupClosePushL(aSession);
- // aSession and aDatabase are pushed to the cleanup stack even though they may be member
- // variables of the calling class and would be closed in the destructor anyway. This ensures
- // that if they are not member variables they will be closed. Closing the handle twice
- // does no harm.
-
-#ifdef SYMBIAN_SECURE_DBMS
-
- // Create the secure shared database (if necessary) with the specified secure policy.
- // Database will be created in the data caging path for DBMS (C:\private\100012a5).
-
- TInt err = aDatabase.Create(aSession, KDatabaseName, KSecureUIDFormat);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("TryOpenDatabaseL() - Created Secure DB for eapol.dat. err=%d\n"), err ));
-
- if(err == KErrNone)
- {
- aDatabase.Close();
-
- } else if (err != KErrAlreadyExists)
- {
- User::LeaveIfError(err);
- }
-
- User::LeaveIfError(aDatabase.Open(aSession, KDatabaseName, KSecureUIDFormat));
- CleanupClosePushL(aDatabase);
-
-#else
- // For non-secured database. The database will be created in the old location (c:\system\data).
-
- RFs fsSession;
- User::LeaveIfError(fsSession.Connect());
- CleanupClosePushL(fsSession);
-
- // Create the database (if necessary)
- TInt err = aDatabase.Create(fsSession, KDatabaseName);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("TryOpenDatabaseL() - Created Non-Secure DB for eapol.dat. err=%d\n"), err ));
-
- if(err == KErrNone)
- {
- aDatabase.Close();
-
- } else if (err != KErrAlreadyExists)
- {
- User::LeaveIfError(err);
- }
- CleanupStack::PopAndDestroy(); // close fsSession
-
- User::LeaveIfError(aDatabase.Open(aSession, KDatabaseName));
- CleanupClosePushL(aDatabase);
-
-#endif // #ifdef SYMBIAN_SECURE_DBMS
-
- HBufC* buf = HBufC::NewLC(KMaxSqlQueryLength);
- TPtr sqlStatement = buf->Des();
-
- // 2. Create the table for pre-shared keys in database (ignore error if exists)
-
-//// NAME /////////////////////////////////////////////////// TYPE ////////////// Constant ///////
-//| ServiceType | UNSIGNED INTEGER | KServiceType |//
-//| ServiceIndex | UNSIGNED INTEGER | KServiceIndex |//
-//| SSID | VARBINARY(255) | KSSID |//
-//| Password | VARBINARY(255) | KPassword |//
-//| PSK | VARBINARY(255) | KPSK |//
-//////////////////////////////////////////////////////////////////////////////////////////////////
-
- _LIT(KSQLCreateTable2, "CREATE TABLE %S (%S UNSIGNED INTEGER, \
- %S UNSIGNED INTEGER, \
- %S VARBINARY(255), \
- %S VARBINARY(255), \
- %S VARBINARY(255))");
-
- sqlStatement.Format(KSQLCreateTable2, &KEapolPSKTableName,
- &KServiceType, &KServiceIndex, &KSSID, &KPassword, &KPSK);
-
- err = aDatabase.Execute(sqlStatement);
- if (err != KErrNone && err != KErrAlreadyExists)
- {
- User::Leave(err);
- }
-
- CleanupStack::PopAndDestroy(); // buf
- CleanupStack::Pop(2); // database, session
-
- // If compacting is not done the database will start growing
- aDatabase.Compact();
-}
-
-//--------------------------------------------------
-
-void eapol_am_core_symbian_c::OpenDatabaseL(RDbNamedDatabase& aDatabase, RDbs& aSession)
-{
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::OpenDatabaseL()\n")));
-
- // Create the database (if necessary)
- TRAPD(err, TryOpenDatabaseL(aDatabase, aSession));
- if (err != KErrNone)
- {
- // Because of error remove the database file.
- RFs fsDataBaseFile;
- User::LeaveIfError(fsDataBaseFile.Connect());
- CleanupClosePushL(fsDataBaseFile);
- err = fsDataBaseFile.Delete(KDatabaseName);
- if(err != KErrNone)
- {
- User::Leave(KErrCorrupt);
- }
- CleanupStack::PopAndDestroy(); // close fsDataBaseFile
-
- // Try open database again. This will leave if fails second time.
- TryOpenDatabaseL(aDatabase, aSession);
- }
-}
-
-//--------------------------------------------------
-
-eap_status_e eapol_am_core_symbian_c::random_error(
- eap_buf_chain_wr_c * const sent_packet,
- const bool forse_error,
- const u32_t packet_index)
-{
- EAP_UNREFERENCED_PARAMETER(packet_index);
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::random_error()\n")));
-
- eap_status_e status(eap_status_ok);
- u8_t *data = sent_packet->get_data(sent_packet->get_data_length());
-
- crypto_random_c rand(m_am_tools);
- u32_t random_guard(0);
- bool error_generated(false);
- u32_t minimum_index(0);
-
- if (m_manipulate_ethernet_header == false)
- {
- minimum_index = eapol_ethernet_header_wr_c::get_header_length();
- }
-
- for (u32_t ind = minimum_index; ind < sent_packet->get_data_length(); ind++)
- {
- status = rand.get_rand_bytes(
- reinterpret_cast<u8_t *>(&random_guard),
- sizeof(random_guard));
- if (status != eap_status_ok)
- {
- return EAP_STATUS_RETURN(m_am_tools, status);
- }
-
- // This is simple limiter to the probability of an error.
- // probability = m_error_probability / (2^32)
- if (random_guard < m_error_probability)
- {
- u8_t rnd(0);
- u8_t previous_data(0);
- // Create an error.
- status = rand.get_rand_bytes(
- &rnd,
- sizeof(rnd));
- if (status != eap_status_ok)
- {
- return EAP_STATUS_RETURN(m_am_tools, status);
- }
-
- previous_data = data[ind];
- data[ind] ^= rnd;
-
- if (previous_data != data[ind])
- {
- error_generated = true;
- sent_packet->set_random_error_type(eap_random_error_type_manipulate_byte);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("TEST: random_error(): packet_index 0x%08x:%lu, data[0x%04x] changed from 0x%02x to 0x%02x.\n"),
- this,
- packet_index,
- ind,
- previous_data,
- data[ind]));
- }
- }
- }
-
- if (error_generated == false
- && forse_error == true
- && sent_packet->get_data_length() > 0ul)
- {
- // Generate one error.
-
- // Random error type.
- eap_random_error_type error_type = eap_random_error_type_none_keep_this_last_case;
- status = rand.get_rand_bytes(
- reinterpret_cast<u8_t *>(&error_type),
- sizeof(error_type));
- if (status != eap_status_ok)
- {
- return EAP_STATUS_RETURN(m_am_tools, status);
- }
-
- error_type = static_cast<eap_random_error_type>(
- static_cast<u32_t>(error_type % static_cast<u32_t>(
- eap_random_error_type_none_keep_this_last_case)));
-
- sent_packet->set_random_error_type(error_type);
-
- switch(error_type)
- {
- case eap_random_error_type_manipulate_byte:
- {
- u32_t rnd_index(0);
- u8_t previous_data(0);
- u32_t index(0);
-
- do
- {
- do
- {
- // Create an error index.
- status = rand.get_rand_bytes(
- reinterpret_cast<u8_t *>(&rnd_index),
- sizeof(rnd_index));
- if (status != eap_status_ok)
- {
- return EAP_STATUS_RETURN(m_am_tools, status);
- }
-
- index = (rnd_index % (sent_packet->get_data_length() - minimum_index))
- + minimum_index;
- }
- while(index < minimum_index
- || index > sent_packet->get_buffer_length());
-
- u8_t rnd(0);
- // Create an error.
- status = rand.get_rand_bytes(
- &rnd,
- sizeof(rnd));
- if (status != eap_status_ok)
- {
- return EAP_STATUS_RETURN(m_am_tools, status);
- }
-
- previous_data = data[index];
- data[index] ^= rnd;
- }
- while(previous_data == data[index]);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("TEST: random_error(): packet_index 0x%08x:%lu, data[0x%04x] changed from 0x%02x to 0x%02x.\n"),
- this,
- packet_index,
- index,
- previous_data,
- data[index]));
-
- error_generated = true;
- }
- break;
- case eap_random_error_type_change_packet_length_longer:
- {
- u8_t delta_length(0);
- i32_t new_length(0);
-
- do
- {
- status = rand.get_rand_bytes(
- reinterpret_cast<u8_t *>(&delta_length),
- sizeof(delta_length));
- if (status != eap_status_ok)
- {
- return EAP_STATUS_RETURN(m_am_tools, status);
- }
-
- new_length = static_cast<i32_t>(sent_packet->get_data_length()
- + static_cast<i32_t>(delta_length));
- }
- while (new_length < static_cast<i32_t>(
- eapol_ethernet_header_wr_c::get_header_length())
- || new_length > static_cast<i32_t>(sent_packet->get_buffer_length()));
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("TEST: random_error(): packet_index 0x%08x:%lu, packet length changed from %lu to %lu.\n"),
- this,
- packet_index,
- sent_packet->get_data_length(),
- new_length));
-
- sent_packet->set_data_length(new_length);
-
- error_generated = true;
- }
- break;
- case eap_random_error_type_change_packet_length_shorter:
- {
- u8_t delta_length(0);
- i32_t new_length(0);
-
- do
- {
- status = rand.get_rand_bytes(
- reinterpret_cast<u8_t *>(&delta_length),
- sizeof(delta_length));
- if (status != eap_status_ok)
- {
- return EAP_STATUS_RETURN(m_am_tools, status);
- }
-
- delta_length %= static_cast<i32_t>(
- sent_packet->get_data_length()
- - static_cast<i32_t>(eapol_ethernet_header_wr_c::get_header_length()));
-
- if (delta_length == 0)
- {
- continue;
- }
-
- new_length = static_cast<i32_t>(
- sent_packet->get_data_length() - static_cast<i32_t>(delta_length));
- }
- while (new_length < static_cast<i32_t>(
- eapol_ethernet_header_wr_c::get_header_length())
- || new_length > static_cast<i32_t>(sent_packet->get_buffer_length()));
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("TEST: random_error(): packet_index 0x%08x:%lu, packet length changed from %lu to %lu.\n"),
- this,
- packet_index,
- sent_packet->get_data_length(),
- new_length));
-
- sent_packet->set_data_length(new_length);
-
- error_generated = true;
- }
- break;
- default:
- User::Panic(_L("EAPOL"), 1);
- break;
- }
- }
-
- if (error_generated == true)
- {
- sent_packet->set_is_manipulated();
- }
-
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return status;
-}
-
-//--------------------------------------------------
-
-eap_status_e eapol_am_core_symbian_c::create_upper_stack()
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::create_upper_stack()\n")));
-
- eap_status_e status(eap_status_ok);
-
- if (m_ethernet_core == 0)
- {
- m_ethernet_core = new ethernet_core_c(m_am_tools, this, m_is_client);
- if (m_ethernet_core == 0
- || m_ethernet_core->get_is_valid() != true)
- {
- if (m_ethernet_core != 0)
- {
- m_ethernet_core->shutdown();
- delete m_ethernet_core;
- m_ethernet_core = 0;
- }
- EAP_TRACE_ERROR(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Stack creation failed.\n")));
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return EAP_STATUS_RETURN(m_am_tools, eap_status_process_general_error);
- }
-
- // Initialise upper stack
- status = m_ethernet_core->configure();
-
- if (status != eap_status_ok)
- {
- m_ethernet_core->shutdown();
- delete m_ethernet_core;
- m_ethernet_core = 0;
-
- EAP_TRACE_ERROR(m_am_tools, TRACE_FLAGS_DEFAULT, (EAPL("Stack creation failed.\n")));
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return EAP_STATUS_RETURN(m_am_tools, eap_status_process_general_error);
- }
- }
- else
- {
- status = eap_status_already_exists;
- }
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return status;
-}
-
-//--------------------------------------------------
-
-eap_status_e eapol_am_core_symbian_c::add_rogue_ap(
- eap_array_c<eap_rogue_ap_entry_c> & rogue_ap_list)
-{
- EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("eapol_am_core_symbian_c::add_rogue_ap()\n")));
-
- TInt err(KErrNone);
- eap_rogue_ap_entry_c* entry = 0;
-
- TMacAddress mac;
-
- TRogueType type;
-
- for (u32_t i = 0; i < rogue_ap_list.get_object_count(); i++)
- {
- entry = rogue_ap_list.get_object(i);
-
- entry->get_mac_address(mac.iMacAddress);
-
- EAP_TRACE_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Adding rogue AP - type: %d\n"),
- entry->get_rogue_reason()));
- EAP_TRACE_DATA_DEBUG(
- m_am_tools,
- TRACE_FLAGS_DEFAULT,
- (EAPL("Rogue MAC address"),
- mac.iMacAddress,
- KMacAddressLength));
-
- switch (entry->get_rogue_reason())
- {
- case rogue_ap_none:
- // Ignore this
- continue;
- case rogue_ap_association_failed:
- type = EInvalidAuthenticationType;
- break;
- case rogue_ap_timeout:
- type = EAuthenticationTimeout;
- break;
- case rogue_ap_challenge_to_client_failed:
- type = EChallengeFromAPFailed;
- break;
- case rogue_ap_challenge_to_ap_failed:
- type = EChallengeToAPFailed;
- break;
- default:
- // ignore others
- continue;
- }
-
- err = m_partner->AddRogueAP(mac, type);
- if (err != KErrNone)
- {
- break;
- }
- }
- EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
- return EAP_STATUS_RETURN(m_am_tools, m_am_tools->convert_am_error_to_eapol_error(err));
-}
-
-//--------------------------------------------------
-
-void eapol_am_core_symbian_c::RetrievePSKL(TPSKEntry& entry)
-{
- HBufC* sqlbuf = HBufC::NewLC(KMaxSqlQueryLength);
- TPtr sqlStatement = sqlbuf->Des();
-
- RDbView view;
-
- _LIT(KSQL, "SELECT %S, %S, %S, %S, %S FROM %S WHERE %S=%d AND %S=%d");
-
- sqlStatement.Format(KSQL, &KServiceType, &KServiceIndex, &KSSID, &KPassword, &KPSK,
- &KEapolPSKTableName, &KServiceType, entry.indexType, &KServiceIndex, entry.index);
-
- User::LeaveIfError(view.Prepare(m_database, TDbQuery(sqlStatement), TDbWindow::EUnlimited));
- CleanupClosePushL(view);
- User::LeaveIfError(view.EvaluateAll());
-
- TInt rows = view.CountL();
-
- if (rows == 0)
- {
- // No saved PSK
- User::Leave(KErrNotFound);
- }
- view.FirstL();
- view.GetL();
-
- entry.ssid.Copy(view.ColDes8(3));
- entry.password.Copy(view.ColDes8(4));
- entry.psk.Copy(view.ColDes8(5));
-
- CleanupStack::PopAndDestroy(2); // view, buf
-}
-
-//--------------------------------------------------
-
-void eapol_am_core_symbian_c::SavePSKL(TPSKEntry& entry)
-{
- // Connect to CommDBif so that we can delete PSK entries that have no IAP associated anymore.
- CWLanSettings* wlan = new(ELeave) CWLanSettings;
- CleanupStack::PushL(wlan);
-
- SWLANSettings wlanSettings;
-
- if (wlan->Connect() != KErrNone)
- {
- // Could not connect to CommDB
- User::Leave(KErrCouldNotConnect);
- }
-
- HBufC* sqlbuf = HBufC::NewLC(KMaxSqlQueryLength);
- TPtr sqlStatement = sqlbuf->Des();
-
- RDbView view;
-
- _LIT(KSQL, "SELECT %S, %S, %S, %S, %S FROM %S");
-
- sqlStatement.Format(KSQL, &KServiceType, &KServiceIndex, &KSSID, &KPassword, &KPSK,
- &KEapolPSKTableName);
-
- User::LeaveIfError(view.Prepare(m_database, TDbQuery(sqlStatement), TDbWindow::EUnlimited));
- CleanupClosePushL(view);
- User::LeaveIfError(view.EvaluateAll());
-
- // Get column set so we get the correct column numbers
- CDbColSet* colSet = view.ColSetL();
- CleanupStack::PushL(colSet);
-
- // Delete old row and also rows that have no associated IAP settings.
- if (view.FirstL())
- {
- do {
- view.GetL();
-
- if ((wlan->GetWlanSettingsForService(view.ColUint32(colSet->ColNo(KServiceIndex)), wlanSettings) != KErrNone)
- || (view.ColUint32(colSet->ColNo(KServiceType)) == static_cast<TUint>(entry.indexType)
- && view.ColUint32(colSet->ColNo(KServiceIndex)) == static_cast<TUint>(entry.index)))
- {
- // Not found or current IAP
- view.DeleteL();
- }
-
- } while (view.NextL() != EFalse);
- }
-
- wlan->Disconnect();
-
- view.InsertL();
-
- view.SetColL(colSet->ColNo(KServiceType), (TUint)entry.indexType);
- view.SetColL(colSet->ColNo(KServiceIndex), (TUint)entry.index);
- view.SetColL(colSet->ColNo(KSSID), entry.ssid);
- view.SetColL(colSet->ColNo(KPassword), entry.password);
- view.SetColL(colSet->ColNo(KPSK), entry.psk);
-
- view.PutL();
-
- CleanupStack::PopAndDestroy( colSet ); // Delete colSet.
-
- CleanupStack::PopAndDestroy(3); // CWLanSettings, session, database
-
-}
-
-
-//--------------------------------------------------
-
-
-// End of file