eapol/eapol_framework/eapol_common/am/common/crypto/rc4/eap_am_crypto_rc4.cpp
changeset 0 c8830336c852
child 2 1c7bc153c08e
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eapol/eapol_framework/eapol_common/am/common/crypto/rc4/eap_am_crypto_rc4.cpp	Thu Dec 17 08:47:43 2009 +0200
@@ -0,0 +1,274 @@
+/*
+* 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 6 
+	#undef EAP_FILE_NUMBER_DATE 
+	#define EAP_FILE_NUMBER_DATE 1127594498 
+#endif //#if defined(USE_EAP_MINIMUM_RELEASE_TRACES)
+
+
+#include "eap_am_memory.h"
+#include "eap_am_crypto_rc4.h"
+
+//------------------------------------------------------------
+
+#if 1
+	#define EAP_RC4_TRACE_DEBUG EAP_TRACE_DEBUG
+#else
+	#define EAP_RC4_TRACE_DEBUG(tools, flags, params)
+#endif
+
+#if defined(USE_EAP_TRACE)	
+	static const u32_t EAP_TRACE_MASK_RC4 = eap_am_tools_c::eap_trace_mask_crypto_rc4;
+#endif //#if defined(USE_EAP_TRACE)	
+
+//------------------------------------------------------------
+
+/**
+ * Destructor resets the used internal buffers.
+ */
+EAP_FUNC_EXPORT eap_am_crypto_rc4_c::~eap_am_crypto_rc4_c()
+{
+	cleanup();
+}
+
+//------------------------------------------------------------
+
+/**
+ * Constructor initializes the used internal buffers.
+ */
+EAP_FUNC_EXPORT eap_am_crypto_rc4_c::eap_am_crypto_rc4_c(
+	abs_eap_am_tools_c * const tools)
+	: m_am_tools(tools)
+	, m_ind_i(0ul)
+	, m_ind_j(0ul)
+	, m_is_valid(false)
+{
+	m_state[0] = 0;
+	set_is_valid();
+}
+
+//--------------------------------------------------
+
+/**
+ * This function cleans up the RC4 context.
+ */
+EAP_FUNC_EXPORT eap_status_e eap_am_crypto_rc4_c::cleanup()
+{
+	m_ind_i = 0ul;
+	m_ind_j = 0ul;
+	m_is_valid = false;
+	m_am_tools->memset(m_state, 0, eap_am_crypto_rc4_constant_state_size);
+
+	return EAP_STATUS_RETURN(m_am_tools, eap_status_ok);
+}
+
+//------------------------------------------------------------
+
+/**
+ * The set_is_invalid() function sets the state of the eap_am_crypto_rc4_c
+ * object invalid. 
+ * The eap_am_crypto_rc4_c object calls this function after it is initialized.
+ */
+EAP_FUNC_EXPORT void eap_am_crypto_rc4_c::set_is_invalid()
+{
+	m_is_valid = false;
+}
+
+//------------------------------------------------------------
+
+/**
+ * The set_is_valid() function sets the state of the eap_am_crypto_rc4_c
+ * object valid. 
+ * The eap_am_crypto_rc4_c object calls this function after it is initialized.
+ */
+EAP_FUNC_EXPORT void eap_am_crypto_rc4_c::set_is_valid()
+{
+	m_is_valid = true;
+}
+
+//------------------------------------------------------------
+
+/**
+ * The get_is_valid() function returns the status of the eap_am_crypto_rc4_c
+ * object. 
+ * True indicates the object is allocated successfully.
+ */
+EAP_FUNC_EXPORT bool eap_am_crypto_rc4_c::get_is_valid()
+{
+	return m_is_valid;
+}
+
+//------------------------------------------------------------
+
+/**
+ * Function swaps the values.
+ */
+EAP_FUNC_EXPORT inline void eap_am_crypto_rc4_c::swap(
+	u8_t * const s_i,
+	u8_t * const s_j)
+{
+	const u8_t tmp = *s_i;
+	*s_i = *s_j;
+	*s_j = tmp;
+}
+
+//------------------------------------------------------------
+
+/**
+ * This function sets the RC4 key.
+ */
+EAP_FUNC_EXPORT eap_status_e eap_am_crypto_rc4_c::set_key(
+	const eap_variable_data_c * const p_key)
+{
+	u32_t ind = 0ul;
+
+	// Note the size of ind must be bigger than 8-bits.
+	for (ind = 0ul; ind < eap_am_crypto_rc4_constant_state_size
+			 ; ind++)
+	{
+		m_state[ind] = static_cast<u8_t>(ind);
+
+		EAP_RC4_TRACE_DEBUG(m_am_tools, EAP_TRACE_MASK_RC4,
+					(EAPL("RC4: m_state[%d]=0x%02x\n"),
+					ind,
+					m_state[ind]));
+	} // for()
+
+	const u32_t key_length = p_key->get_data_length();
+	const u8_t * const key = p_key->get_data(key_length);
+
+	m_ind_i = 0ul;
+	m_ind_j = 0ul;
+
+	// Note the size of ind must be bigger than 8-bits.
+	for (ind = 0ul; ind < eap_am_crypto_rc4_constant_state_size
+			 ; ind++)
+	{
+		m_ind_j = static_cast<u8_t>(
+			static_cast<u8_t>(m_ind_j)
+			+ static_cast<u8_t>(m_state[ind])
+			+ static_cast<u8_t>(key[ind % key_length]));
+
+		swap(&(m_state[ind]), &(m_state[m_ind_j]));
+
+		EAP_RC4_TRACE_DEBUG(m_am_tools, EAP_TRACE_MASK_RC4,
+					(EAPL("RC4: swapped m_state[%d]=0x%02x and m_state[%d]=0x%02x\n"),
+					ind,
+					m_state[ind],
+					m_ind_j,
+					m_state[m_ind_j]));
+	} // for()
+
+	m_ind_i = 0ul;
+	m_ind_j = 0ul;
+
+	return EAP_STATUS_RETURN(m_am_tools, eap_status_ok);
+}
+
+//------------------------------------------------------------
+
+/**
+ */
+inline u8_t eap_am_crypto_rc4_c::get_random_byte()
+{
+	m_ind_i = static_cast<u8_t>(m_ind_i + 1ul);
+	
+	m_ind_j = static_cast<u8_t>(m_ind_j + m_state[m_ind_i]);
+	
+	swap(&(m_state[m_ind_i]), &(m_state[m_ind_j]));
+	
+	u8_t random_byte = m_state[static_cast<u8_t>(m_state[m_ind_i]
+									   + m_state[m_ind_j])];
+
+	EAP_RC4_TRACE_DEBUG(m_am_tools, EAP_TRACE_MASK_RC4,
+				(EAPL("RC4: random_byte=0x%02x\n"),
+				random_byte));
+
+	return random_byte;
+}
+
+//------------------------------------------------------------
+
+/**
+ * This function does RC4 encryption.
+ */
+inline eap_status_e eap_am_crypto_rc4_c::process_data(
+	const void * const p_data_in,
+	void * const p_data_out,
+	const u32_t data_length)
+{
+	const u8_t * const data_in = static_cast<const u8_t *>(p_data_in);
+	u8_t * const data_out = static_cast<u8_t *>(p_data_out);
+
+	for (u32_t ind = 0ul; ind < data_length; ind++)
+	{
+		EAP_RC4_TRACE_DEBUG(m_am_tools, EAP_TRACE_MASK_RC4,
+					(EAPL("RC4: data_in[%d]=0x%02x\n"),
+					ind,
+					data_in[ind]));
+
+		data_out[ind] = static_cast<u8_t>(data_in[ind] ^ get_random_byte());
+
+		EAP_RC4_TRACE_DEBUG(m_am_tools, EAP_TRACE_MASK_RC4,
+					(EAPL("RC4: data_out[%d]=0x%02x\n"),
+					ind,
+					data_out[ind]));
+	} // for()
+
+	return EAP_STATUS_RETURN(m_am_tools, eap_status_ok);
+}
+
+//------------------------------------------------------------
+
+/**
+ * This function does RC4 encryption.
+ */
+EAP_FUNC_EXPORT eap_status_e eap_am_crypto_rc4_c::encrypt_data(
+	const void * const p_data_in,
+	void * const p_data_out,
+	const u32_t data_length)
+{
+	return EAP_STATUS_RETURN(
+		m_am_tools,
+		process_data(p_data_in, p_data_out, data_length));
+}
+
+//------------------------------------------------------------
+
+/**
+ * This function does RC4 decryption.
+ */
+EAP_FUNC_EXPORT eap_status_e eap_am_crypto_rc4_c::decrypt_data(
+	const void * const p_data_in,
+	void * const p_data_out,
+	const u32_t data_length)
+{
+	return EAP_STATUS_RETURN(
+		m_am_tools,
+		process_data(p_data_in, p_data_out, data_length));
+}
+
+//------------------------------------------------------------
+
+
+
+// End.