eapol/eapol_framework/eapol_symbian/am/type/sim/symbian/eap_am_type_sim_symbian.cpp
changeset 0 c8830336c852
child 2 1c7bc153c08e
equal deleted inserted replaced
-1:000000000000 0:c8830336c852
       
     1 /*
       
     2 * Copyright (c) 2001-2006 Nokia Corporation and/or its subsidiary(-ies).
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of the License "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  EAP and WLAN authentication protocols.
       
    15 *
       
    16 */
       
    17 
       
    18 
       
    19 // This is enumeration of EAPOL source code.
       
    20 #if defined(USE_EAP_MINIMUM_RELEASE_TRACES)
       
    21 	#undef EAP_FILE_NUMBER_ENUM
       
    22 	#define EAP_FILE_NUMBER_ENUM 352 
       
    23 	#undef EAP_FILE_NUMBER_DATE 
       
    24 	#define EAP_FILE_NUMBER_DATE 1127594498 
       
    25 #endif //#if defined(USE_EAP_MINIMUM_RELEASE_TRACES)
       
    26 
       
    27 
       
    28 
       
    29 #include "eap_am_memory.h"
       
    30 #include "eap_tools.h"
       
    31 #include "eap_am_type_sim_symbian.h"
       
    32 #include "abs_eap_am_crypto.h"
       
    33 #include "abs_eap_am_mutex.h"
       
    34 
       
    35 const u32_t SIM_IMSI_LENGTH = 8u;
       
    36 
       
    37 //--------------------------------------------------
       
    38 
       
    39 // 
       
    40 EAP_FUNC_EXPORT eap_am_type_sim_simulator_c::~eap_am_type_sim_simulator_c()
       
    41 {
       
    42 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
    43 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
    44 }
       
    45 
       
    46 //--------------------------------------------------
       
    47 
       
    48 // 
       
    49 EAP_FUNC_EXPORT eap_am_type_sim_simulator_c::eap_am_type_sim_simulator_c(
       
    50 	abs_eap_am_tools_c * const tools, abs_eap_am_type_sim_c * const partner)
       
    51 : eap_am_type_sim_c(tools, partner)
       
    52 , m_am_tools(tools)
       
    53 {
       
    54 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
    55 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
    56 }
       
    57 
       
    58 //--------------------------------------------------
       
    59 
       
    60 EAP_FUNC_EXPORT eap_status_e eap_am_type_sim_simulator_c::query_SIM_imsi(
       
    61 	u8_t * const imsi, const u32_t max_length, u32_t * const imsi_length)
       
    62 {
       
    63 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
    64 	u32_t ind = 0u;
       
    65 	for (ind = 0u; ind < max_length; ind++)
       
    66 	{
       
    67 		imsi[ind] = static_cast<u8_t>(~ind;
       
    68 	}
       
    69 	*imsi_length = ind;
       
    70 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
    71 	return eap_status_process_general_error;
       
    72 }
       
    73 
       
    74 //--------------------------------------------------
       
    75 
       
    76 //
       
    77 EAP_FUNC_EXPORT eap_status_e eap_am_type_sim_simulator_c::query_SIM_kc_and_sres(
       
    78 	const u8_t * const imsi, const u32_t imsi_length,
       
    79 	const u8_t * const rand, const u32_t /*rand_length*/,
       
    80 	u8_t * const kc, u32_t * const kc_length,
       
    81 	u8_t * const sres, u32_t * const sres_length)
       
    82 {
       
    83 	EAP_TRACE_BEGIN(m_am_tools, TRACE_FLAGS_DEFAULT);
       
    84 
       
    85 	if (imsi == 0
       
    86 		|| rand == 0
       
    87 		|| kc == 0
       
    88 		|| sres == 0)
       
    89 	{
       
    90 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
    91 		return EAP_STATUS_RETURN(m_am_tools, eap_status_illegal_parameter);
       
    92 	}
       
    93 
       
    94 	EAP_ASSERT_ALWAYS(*kc_length >= 8u);
       
    95 	EAP_ASSERT_ALWAYS(*sres_length >= 4u);
       
    96 
       
    97 	eap_variable_data_c aes_context(m_am_tools);
       
    98 	eap_variable_data_c encryption_IV(m_am_tools);
       
    99 	eap_variable_data_c imsi_tmp(m_am_tools);
       
   100 	u8_t tmp_buffer[16u];
       
   101 
       
   102 	eap_status_e status = imsi_tmp.add_data(imsi, imsi_length);
       
   103 	if (status != eap_status_ok)
       
   104 	{
       
   105 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
   106 		return status;
       
   107 	}
       
   108 
       
   109 	status = imsi_tmp.add_data(imsi, imsi_length);
       
   110 	if (status != eap_status_ok)
       
   111 	{
       
   112 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
   113 		return status;
       
   114 	}
       
   115 
       
   116 	status = m_am_tools->get_crypto()->cbc_aes_set_encryption_key(
       
   117 		&aes_context,
       
   118 		//&encryption_IV,
       
   119 		imsi_tmp.get_data(imsi_tmp.get_data_length()),
       
   120 		imsi_tmp.get_data_length());
       
   121 	if (status != eap_status_ok)
       
   122 	{
       
   123 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
   124 		return status;
       
   125 	}
       
   126 
       
   127 	status = encryption_IV.init(m_am_tools->get_crypto()->aes_key_length());
       
   128 	if (status != eap_status_ok)
       
   129 	{
       
   130 		return status;
       
   131 	}
       
   132 	encryption_IV.set_is_valid();
       
   133 
       
   134 	encryption_IV.set_data_length(m_am_tools->get_crypto()->aes_key_length());
       
   135 	m_am_tools->memset(
       
   136 		encryption_IV.get_data(encryption_IV.get_data_length()),
       
   137 		0,
       
   138 		encryption_IV.get_data_length());
       
   139 
       
   140 	status = m_am_tools->get_crypto()->cbc_aes_encrypt_data(
       
   141 		&aes_context,
       
   142 		&encryption_IV,
       
   143 		rand,
       
   144 		tmp_buffer,
       
   145 		sizeof(tmp_buffer));
       
   146 
       
   147 	m_am_tools->memmove(kc, tmp_buffer, *kc_length);
       
   148 
       
   149 
       
   150 	eap_variable_data_c kc_tmp(m_am_tools);
       
   151 	u8_t sres_tmp[16u];
       
   152 
       
   153 	status = kc_tmp.add_data(kc, *kc_length);
       
   154 	if (status != eap_status_ok)
       
   155 	{
       
   156 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
   157 		return status;
       
   158 	}
       
   159 
       
   160 	status = kc_tmp.add_data(kc, *kc_length);
       
   161 	if (status != eap_status_ok)
       
   162 	{
       
   163 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
   164 		return status;
       
   165 	}
       
   166 
       
   167 	status = m_am_tools->get_crypto()->cbc_aes_set_encryption_key(
       
   168 		&aes_context,
       
   169 		//&encryption_IV,
       
   170 		kc_tmp.get_data(kc_tmp.get_data_length()),
       
   171 		kc_tmp.get_data_length());
       
   172 	if (status != eap_status_ok)
       
   173 	{
       
   174 		EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
   175 		return status;
       
   176 	}
       
   177 
       
   178 	status = encryption_IV.init(m_am_tools->get_crypto()->aes_key_length());
       
   179 	if (status != eap_status_ok)
       
   180 	{
       
   181 		return status;
       
   182 	}
       
   183 	encryption_IV.set_is_valid();
       
   184 
       
   185 	encryption_IV.set_data_length(m_am_tools->get_crypto()->aes_key_length());
       
   186 	m_am_tools->memset(
       
   187 		encryption_IV.get_data(encryption_IV.get_data_length()),
       
   188 		0,
       
   189 		encryption_IV.get_data_length());
       
   190 
       
   191 	status = m_am_tools->get_crypto()->cbc_aes_encrypt_data(
       
   192 		&aes_context,
       
   193 		&encryption_IV,
       
   194 		rand,
       
   195 		sres_tmp,
       
   196 		sizeof(sres_tmp));
       
   197 
       
   198 	m_am_tools->memmove(sres, sres_tmp, *sres_length);
       
   199 
       
   200 
       
   201 	EAP_TRACE_END(m_am_tools, TRACE_FLAGS_DEFAULT);
       
   202 	return eap_status_ok;
       
   203 }
       
   204 
       
   205 //--------------------------------------------------
       
   206 
       
   207 eap_status_e eap_am_type_sim_simulator_c::query_SIM_triplets(
       
   208 	//const eap_state_selector_c * const p_state_selector,
       
   209 	const eap_variable_data_c * const p_imsi,
       
   210 	eap_type_sim_triplet_array_c * const triplets)
       
   211 {
       
   212 	// NOTE if user needs to use imsi after return from query_SIM_triplets()
       
   213 	// function that parameter MUST be copied using copy() member function of each parameter.
       
   214 	// For example: saved_imsi = imsi->copy()
       
   215 
       
   216 	eap_status_e status = eap_status_process_general_error;
       
   217 
       
   218 	const u32_t triplet_count = 2u;
       
   219 
       
   220 
       
   221 
       
   222 // End.