eapol/eapol_framework/eapol_common/type/securid/core/eap_type_securid_server.cpp
changeset 0 c8830336c852
child 2 1c7bc153c08e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eapol/eapol_framework/eapol_common/type/securid/core/eap_type_securid_server.cpp	Thu Dec 17 08:47:43 2009 +0200
@@ -0,0 +1,194 @@
+/*
+* 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.
+*
+*/
+
+
+// This is enumeration of EAPOL source code.
+#if defined(USE_EAP_MINIMUM_RELEASE_TRACES)
+	#undef EAP_FILE_NUMBER_ENUM
+	#define EAP_FILE_NUMBER_ENUM 116 
+	#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_state_notification.h"
+#include "eap_type_securid.h"
+#include "eap_type_securid_types.h"
+#include "eap_buffer.h"
+
+static const u8_t EAP_SECURID_PASSCODE_STRING[] = "passcode";
+
+
+#ifdef EAP_SECURID_SERVER
+
+eap_status_e eap_type_securid_c::server_packet_process(
+	eap_header_wr_c * const received_eap,
+	const u32_t eap_packet_length)
+{	
+	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
+	eap_status_e status = eap_status_header_corrupted;
+
+	if (eap_packet_length < received_eap->get_length())
+	{
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+		return EAP_STATUS_RETURN(m_am_tools, eap_status_drop_packet_quietly);
+	}
+
+	if (received_eap->get_type() == eap_type_identity)
+	{
+		m_identifier = static_cast<u8_t> (received_eap->get_identifier() + 1);
+
+		// Send request
+
+		const u8_t * const message = EAP_SECURID_PASSCODE_STRING;
+		u32_t message_length = m_am_tools->strlen(reinterpret_cast<eap_const_string>(message));
+
+		u32_t packet_length = eap_header_base_c::get_type_data_start_offset(m_use_eap_expanded_type)
+			+ message_length; // Remove null termination
+
+		eap_buf_chain_wr_c * packet = create_send_packet(packet_length);
+		if (!packet)
+		{
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+		}
+
+		eap_header_base_c eap_header(
+			m_am_tools,
+			packet->get_data_offset(m_offset, packet_length),
+			packet_length);
+		if (eap_header.get_is_valid() == false)
+		{
+			delete packet;
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter);
+		}
+		eap_header.set_code(eap_code_request);
+		eap_header.set_identifier(++m_identifier);
+		eap_header.set_length(
+			static_cast<u16_t>(packet_length),
+			m_use_eap_expanded_type);
+		eap_header.set_type(
+			m_eap_type,
+			m_use_eap_expanded_type);
+
+		u8_t * type_data = const_cast<u8_t *> (eap_header.get_type_data_offset(0, eap_header.get_type_data_length()));
+		if (type_data == 0)
+		{
+			delete packet;
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+		}
+
+		m_am_tools->memmove(type_data, message, message_length);
+
+		eap_status_e status = packet_send(packet, packet_length);
+		delete packet;
+
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+		return EAP_STATUS_RETURN(m_am_tools, status);
+	}
+	else if (received_eap->get_type() == eap_type_securid)
+	{
+		// Verify passcode response.
+		u8_t * type_data = const_cast<u8_t *>(received_eap->get_type_data(received_eap->get_type_data_length()));
+		if (type_data == 0)
+		{
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+		}
+
+		if (received_eap->get_type_data_length() != m_pincode.get_data_length()
+			|| m_am_tools->memcmp(
+				type_data,
+				m_pincode.get_data(m_pincode.get_data_length()),
+				m_pincode.get_data_length()) != 0)
+		{
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_authentication_failure);
+		}
+	}
+	else if (received_eap->get_type() == eap_type_generic_token_card)
+	{
+		// Verify passcode response.
+		u8_t * type_data = const_cast<u8_t *>(received_eap->get_type_data(received_eap->get_type_data_length()));
+		if (type_data == 0)
+		{
+			EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+			return EAP_STATUS_RETURN(m_am_tools, eap_status_allocation_error);
+		}
+
+#if defined(USE_FAST_EAP_TYPE)
+		if (m_use_EAP_FAST_response == true)
+		{
+			const u32_t passcode_offset(EAP_FAST_EAP_GTC_RESPONSE_PREFIX_LENGTH + m_identity.get_data_length() + EAP_FAST_EAP_GTC_RESPONSE_SEPARATOR_LENGTH);
+
+			if (received_eap->get_type_data_length() < passcode_offset+m_passcode.get_data_length())
+			{
+				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+				return EAP_STATUS_RETURN(m_am_tools, eap_status_too_short_message);
+			}
+
+			type_data += passcode_offset;
+
+			if (m_am_tools->memcmp(
+					type_data,
+					m_passcode.get_data(m_passcode.get_data_length()),
+					m_passcode.get_data_length()) != 0)
+			{
+				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+				return EAP_STATUS_RETURN(m_am_tools, eap_status_authentication_failure);
+			}
+		}
+		else
+#endif //#if defined(USE_FAST_EAP_TYPE)
+		{
+			if (received_eap->get_type_data_length() != m_passcode.get_data_length()
+				|| m_am_tools->memcmp(
+					type_data,
+					m_passcode.get_data(m_passcode.get_data_length()),
+					m_passcode.get_data_length()) != 0)
+			{
+				EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+				return EAP_STATUS_RETURN(m_am_tools, eap_status_authentication_failure);
+			}
+		}
+	}
+	else
+	{
+		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+		return EAP_STATUS_RETURN(m_am_tools, eap_status_authentication_failure);
+	}
+
+	m_identifier++;
+
+	status = finish_successful_authentication();
+
+	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
+	return EAP_STATUS_RETURN(m_am_tools, status);
+
+}
+
+#endif //#ifdef EAP_SECURID_SERVER
+
+//--------------------------------------------------
+
+
+// End.