FreeCalypso > hg > leo2moko-debug
diff g23m/condat/ms/src/mfw/mfw_sim.~c @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/g23m/condat/ms/src/mfw/mfw_sim.~c Mon Jun 01 03:24:05 2015 +0000 @@ -0,0 +1,2946 @@ +/* ++--------------------------------------------------------------------+ +| PROJECT: MMI-Framework (8417) $Workfile:: mfw_sim.c $| +| $Author:: Vo $Revision:: 1 $| +| CREATED: 13.10.98 $Modtime:: 22.03.00 17:21 $| +| STATE : code | ++--------------------------------------------------------------------+ + + MODULE : MFW_SIM + + PURPOSE : This modul contains the functions for SIM management. + + + $History:: mfw_sim.c $ + * + * ***************** Version 43 ***************** + * User: Vo Date: 22.03.00 Time: 17:29 + * Updated in $/GSM/Condat/MS/SRC/MFW + * Add new parameter PIN type in structure T_MFW_SIM_STATUS to + * identify PIN type + * Change in SIM lock + * + * ***************** Version 42 ***************** + * User: Es Date: 2.03.00 Time: 16:18 + * Updated in $/GSM/Condat/MS/SRC/MFW + * use 'aci_delete()' instead of 'aci_ext_init()' to clear the + * primitive routing for mfw_sim. (because other routings may have to + * be preserved!) + * + * ***************** Version 41 ***************** + * User: Vo Date: 22.12.99 Time: 16:03 + * Updated in $/GSM/Condat/MS/SRC/MFW + * Remove maximum preferred PLMN records and used preferred PLMN + * records in local memory + * + * ***************** Version 40 ***************** + * User: Vo Date: 2.12.99 Time: 13:18 + * Updated in $/GSM/Condat/MS/SRC/MFW + * New: request of max/used perferred PLMN list + * + * ***************** Version 39 ***************** + * User: Vo Date: 17.11.99 Time: 11:37 + * Updated in $/GSM/Condat/MS/SRC/MFW + * Bug fix: de-personalisation for SIM lock + * New: SIM inserted + * + * ***************** Version 38 ***************** + * User: Vo Date: 21.10.99 Time: 13:26 + * Updated in $/GSM/Condat/MS/SRC/MFW + * add response of de-registration +| +| ***************** Version 37 ***************** +| User: Le Date: 11.10.99 Time: 16:27 +| Updated in $/GSM/Condat/MS/SRC/MFW +| +| ***************** Version 36 ***************** +| User: Le Date: 8.10.99 Time: 13:38 +| Updated in $/GSM/Condat/MS/SRC/MFW +| +| ***************** Version 35 ***************** +| User: Le Date: 4.10.99 Time: 10:33 +| Updated in $/GSM/Condat/MS/SRC/MFW + * + * ***************** Version 34 ***************** + * User: Es Date: 29.09.99 Time: 11:20 + * Updated in $/GSM/DEV/MS/SRC/MFW + * including CFUN_OK enhancement by AK, not fully implemented + * + * ***************** Version 33 ***************** + * User: Es Date: 16.09.99 Time: 16:56 + * Updated in $/GSM/DEV/MS/SRC/MFW + * reordered include statements due to addons in mfw_phb.h + * + * ***************** Version 32 ***************** + * User: Vo Date: 13.09.99 Time: 12:05 + * Updated in $/GSM/DEV/MS/SRC/MFW + * change comment + * + * ***************** Version 31 ***************** + * User: Vo Date: 12.09.99 Time: 15:32 + * Updated in $/GSM/DEV/MS/SRC/MFW + * Bug fix: change PIN + * Bug fix/New: SIM lock + * New: request of PIN status + * New: save preferred language + * New: read group identifier level 1 & 2 + * + * ***************** Version 30 ***************** + * User: Vo Date: 30.08.99 Time: 14:23 + * Updated in $/GSM/DEV/MS/SRC/MFW + * bug fix + * new function + * + * ***************** Version 29 ***************** + * User: Vo Date: 9.08.99 Time: 13:11 + * Updated in $/GSM/DEV/MS/SRC/MFW + * PIN/PUK count + * + * ***************** Version 28 ***************** + * User: Vo Date: 26.07.99 Time: 14:34 + * Updated in $/GSM/DEV/MS/SRC/MFW + * Move include file mfw_cb.h + * + * ***************** Version 27 ***************** + * User: Vo Date: 21.07.99 Time: 14:41 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 26 ***************** + * User: Vo Date: 16.07.99 Time: 13:50 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 25 ***************** + * User: Vo Date: 9.07.99 Time: 14:34 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 24 ***************** + * User: Vo Date: 2.07.99 Time: 19:03 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 23 ***************** + * User: Vo Date: 28.05.99 Time: 9:52 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 22 ***************** + * User: Vo Date: 31.03.99 Time: 14:09 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 21 ***************** + * User: Es Date: 15.03.99 Time: 18:21 + * Updated in $/GSM/DEV/MS/SRC/MFW + * recode + * + * ***************** Version 20 ***************** + * User: Vo Date: 25.02.99 Time: 16:47 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 19 ***************** + * User: Vo Date: 17.02.99 Time: 19:03 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 18 ***************** + * User: Vo Date: 12.02.99 Time: 18:05 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 17 ***************** + * User: Vo Date: 12.02.99 Time: 17:46 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 16 ***************** + * User: Vo Date: 9.02.99 Time: 14:54 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 15 ***************** + * User: Vo Date: 12.01.99 Time: 14:27 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 14 ***************** + * User: Es Date: 23.12.98 Time: 15:47 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 12 ***************** + * User: Es Date: 18.12.98 Time: 13:05 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 11 ***************** + * User: Vo Date: 17.12.98 Time: 14:31 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 10 ***************** + * User: Es Date: 8.12.98 Time: 16:53 + * Updated in $/GSM/DEV/MS/SRC/MFW + * + * ***************** Version 8 ***************** + * User: Vo Date: 24.11.98 Time: 21:40 + * Updated in $/GSM/DEV/MS/SRC/MFW + * first successful compilation of MFW +| +| ***************** Version 6 ***************** +| User: Le Date: 11.11.98 Time: 13:35 +| Updated in $/GSM/DEV/MS/SRC/MFW +| +| ***************** Version 5 ***************** +| User: Le Date: 10.11.98 Time: 16:07 +| Updated in $/GSM/DEV/MS/SRC/MFW +| +| ***************** Version 4 ***************** +| User: Le Date: 10.11.98 Time: 11:08 +| Updated in $/GSM/DEV/MS/SRC/MFW +| +| ***************** Version 3 ***************** +| User: Le Date: 27.10.98 Time: 15:59 +| Updated in $/GSM/DEV/MS/SRC/MFW +| +| ***************** Version 2 ***************** +| User: Le Date: 21.10.98 Time: 16:20 +| Updated in $/GSM/DEV/MS/SRC/MFW +*/ + +#define ENTITY_MFW + +#include <string.h> +#include <stdio.h> +#include <stdlib.h> + +#if defined (NEW_FRAME) + +#include "typedefs.h" +#include "vsi.h" +#include "pei.h" +#include "custom.h" +#include "gsm.h" + +#else + +#include "stddefs.h" +#include "custom.h" +#include "gsm.h" +#include "vsi.h" + +#endif + +#include "p_sim.h" +#include "aci_cmh.h" +#include "psa.h" +#include "psa_sim.h" +#include "pcm.h" +#include "mfw_mfw.h" +#include "mfw_nm.h" +#include "mfw_sim.h" +#include "mfw_sima.h" +#include "mfw_simi.h" +#include "mfw_nmi.h" +#include "mfw_nma.h" +#include "mfw_phb.h" +#include "mfw_cm.h" +#include "mfw_cmi.h" +#include "mfw_acie.h" +#include "mfw_sms.h" +#include "mfw_smsi.h" +#include "mfw_win.h" + + +#include "ksd.h" +#include "psa.h" + +#if defined (FAX_AND_DATA) +#include "aci_fd.h" +#endif + +#include "cmh.h" +#include "phb.h" +#include "cmh_phb.h" + +#include "mfw_ss.h" +#include "mfw_ssi.h" + +#ifdef SIM_TOOLKIT +#include "mfw_sat.h" +#endif + +extern BOOL sima_response_cb (USHORT opc, void * data); +extern void simDecodeIMSI (UBYTE *ci, UBYTE li, UBYTE *di); +extern UBYTE mfw_IMSI []; /* expanded IMSI (ASCIIZ) */ +static T_MFW_SIM_STATUS sim_status; +static T_MFW_SIM_CONFIG sim_config; +static int pin_flag; +static UBYTE pin_ident; + +UBYTE sim_nlock; /* Network lock */ +UBYTE sim_splock; /* Service provider lock */ +UBYTE sim_plock; /* SIM lock */ +UBYTE sim_nslock; /* Network SUBSET lock */ +UBYTE sim_clock; /* corporate lock */ +UBYTE sim_blocked; /* blocked flag */ + +static UBYTE sim_service_table [10]; /* SIM service table */ +static UBYTE sim_stat = SIM_NOT_ACTIVE; + +static int simCommand (ULONG cmd, void *h); /* handle win commands */ + +UBYTE pin1_set = MFW_SIM_UNKNOWN; +UBYTE pin2_set = MFW_SIM_ENABLE; + +static BOOL sat_update = FALSE; + +static int pSlot; /* primitive handler slot */ + +EXTERN MfwHdr * current_mfw_elem; +#if defined (WIN32) +/* + * Only for windows to check several SIM lock combinations + */ +UBYTE sim_lock_mode = 0; +#endif +UBYTE sim_lock_field = NOT_PRESENT_8BIT; /* type of sim lock field */ + +static UBYTE sim_get_sim_lock (EF_SIMLCKEXT * simlck); +static void sim_set_sim_lock (EF_SIMLCKEXT * simlck); +static void sim_fill_sim_lock (EF_SIMLCKEXT * simlck); +static void sim_check_unblock_sim (EF_SIMLCKEXT * simlck); + +#define SIMLOCK_DISABLED 0 +#define SIMLOCK_ENABLED 1 +#define SIMLOCK_LOCKED 2 +#define SIMLOCK_BLOCKED 3 + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_init | ++--------------------------------------------------------------------+ + + PURPOSE : initialize SIM manager + +*/ + +int sim_init (void) +{ + EF_SIMLCKEXT simlck; + + TRACE_FUNCTION("sim_init()"); + + /* + * initialise SIM lock flags + */ + sim_nslock = sim_plock = sim_nlock = sim_clock = sim_splock = 0; + sim_blocked = FALSE; + + /* + * Read SIM Lock Flags + */ + if (sim_get_sim_lock (&simlck) EQ PCM_OK) + { + sim_plock = (UBYTE) FldGet(simlck.locks1,plock); + sim_nlock = (UBYTE) FldGet(simlck.locks1,nlock); + sim_nslock = (UBYTE) FldGet(simlck.locks1,nslock); + sim_splock = (UBYTE) FldGet(simlck.locks1,splock); + sim_clock = (UBYTE) FldGet(simlck.locks2,clock); + + if (simlck.cnt >= simlck.maxcnt) + sim_blocked = TRUE; + else + sim_blocked = FALSE; + } + + pin_flag = -1; + pin_ident = MFW_SIM_UNKNOWN; + + /* + * install prim handler + */ + pSlot = aci_create(sima_response_cb,NULL); + mfwCommand[MfwTypSim] = (MfwCb) simCommand; + + return TRUE; +} + + +/* ++---------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_init_sim_insert | ++---------------------------------------------------------------------+ + + PURPOSE : initialize SIM manager + +*/ + +void sim_init_sim_insert() +{ +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_exit | ++--------------------------------------------------------------------+ + + PURPOSE : finalize SIM manager + +*/ + +void sim_exit (void) +{ + TRACE_FUNCTION("sim_exit()"); + + /* + * remove prim handler + */ + aci_delete(pSlot); + sim_stat = SIM_NOT_ACTIVE; +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_create | ++--------------------------------------------------------------------+ + + PURPOSE : create SIM event handler + +*/ + +T_MFW_HND sim_create (MfwHnd hWin, MfwEvt event, MfwCb cbfunc) +{ + MfwHdr *hdr; + T_MFW_SIM *sim_para; + + TRACE_FUNCTION("sim_create()"); + + hdr = (MfwHdr *) mfwAlloc(sizeof(MfwHdr)); + sim_para = (T_MFW_SIM *) mfwAlloc(sizeof(T_MFW_SIM)); + + if (!hdr || !sim_para) + return 0; + + sim_para->emask = event; + sim_para->handler = cbfunc; + + hdr->data = sim_para; + hdr->type = MfwTypSim; + + return mfwInsert((MfwHdr *) hWin,hdr); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_delete | ++--------------------------------------------------------------------+ + + PURPOSE : delete SIM event handler + +*/ + +MfwRes sim_delete (MfwHnd h) +{ + TRACE_FUNCTION("sim_delete()"); + + if (!h || !((MfwHdr *) h)->data) + return MfwResIllHnd; + + if (!mfwRemove((MfwHdr *) h)) + return MfwResIllHnd; + + mfwFree((U8 *) ((MfwHdr *) h)->data,sizeof(T_MFW_SIM)); + mfwFree((U8 *) h,sizeof(MfwHdr)); + + return MfwResOk; +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_signal | ++--------------------------------------------------------------------+ + + PURPOSE : Send a signal + +*/ + +void sim_signal (MfwEvt event, void *para) +{ + TRACE_FUNCTION ("sim_signal()"); + + if (mfwSignallingMethod EQ 0) + { + if (mfwFocus) + if (sim_sign_exec(mfwFocus,event,para)) + return; + if (mfwRoot) + sim_sign_exec(mfwRoot,event,para); + } + else + { + MfwHdr * h = 0; + + /* + * Focus set, then start here + */ + if (mfwFocus) + h = mfwFocus; + /* + * Focus not set, then start root + */ + if (!h) + h = mfwRoot; + + /* + * No elements available, return + */ + + while (h) + + + { + /* + * Signal consumed, then return + */ + if (sim_sign_exec (h, event, para)) + return; + + /* + * All windows tried inclusive root + */ + if (h == mfwRoot) + return; + + /* + * get parent window + */ + h = mfwParent(mfwParent(h)); + if(h) + h = ((MfwWin * )(h->data))->elems; + } + sim_sign_exec (mfwRoot, event, para); + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_sign_exec | ++--------------------------------------------------------------------+ + + PURPOSE : Send a signal if SIM management handler + +*/ + +int sim_sign_exec (MfwHdr *cur_elem, MfwEvt event, T_MFW_SIM_PARA *para) +{ + + TRACE_FUNCTION("sim_sign_exec()"); + + while (cur_elem) + { + if (cur_elem->type == MfwTypSim) + { + T_MFW_SIM *sim_data; + sim_data = (T_MFW_SIM *) cur_elem->data; + if (sim_data->emask & event) + { + sim_data->event = event; + switch (event) + { + case E_SIM_STATUS: + memcpy(&sim_data->para.status, + para,sizeof(T_MFW_SIM_STATUS)); + break; + } + if (sim_data->handler) + { + // PATCH LE 06.06.00 + // store current mfw elem + current_mfw_elem = cur_elem; + // END PATCH LE 06.06.00 + if ((*(sim_data->handler))(sim_data->event, + (void *) &sim_data->para)) + return TRUE; + } + } + } + cur_elem = cur_elem->next; + } + + return FALSE; +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_activate | ++--------------------------------------------------------------------+ + + PURPOSE : Start SIM card activation + +*/ + +void sim_activate (void) +{ + TRACE_FUNCTION("sim_activate()"); + + /* + * Full functionality is used donīt reset the ME + */ + if (sAT_PlusCFUN(CMD_SRC_LCL,CFUN_FUN_Full,CFUN_RST_NotPresent) + NEQ AT_EXCT) + { + TRACE_ERROR("sAT_PlusCFUN error"); + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_spn_req | ++--------------------------------------------------------------------+ + + PURPOSE : Request service provider name + +*/ + +void sim_spn_req (void) +{ + T_EF_SPN spn; + + TRACE_FUNCTION("sim_spn_req()"); + + memset(&spn,0,sizeof(T_EF_SPN)); + + if (sim_check_service(17,sim_service_table) + EQ ALLOCATED_AND_ACTIVATED) + sim_read_sim(SIM_SPN,17,17); + else + nm_spn_cnf(&spn); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_ok_cfun | ++--------------------------------------------------------------------+ + + PURPOSE : Notify successful end of SIM card activation + +*/ + +void sim_ok_cfun (void) +{ + T_ACI_CFUN_FUN fun; + + TRACE_FUNCTION ("sim_ok_cfun()"); + + qAT_PlusCFUN( CMD_SRC_LCL, &fun ); + + if( fun EQ CFUN_FUN_Full ) + { + sim_stat = SIM_ACTIVE; + sim_status.sim_status = MFW_SIM_NO_PIN; + sim_status.sim_operation_mode = sim_config.oper_mode; + sim_status.sim_pin_retries = 0; + sim_status.sim_procedure = MFW_SIM_ACTIVATION; + sim_status.sim_status_type = pin_ident; + + pin_ident = MFW_SIM_UNKNOWN; + sim_signal(E_SIM_STATUS,&sim_status); + nm_activate(MFW_SIM_NO_PIN); + + pin1_set = MFW_SIM_DISABLE; + } + else if( fun EQ CFUN_FUN_Minimum ) + { + nm_ok_deregistration(); + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_error_cfun | ++--------------------------------------------------------------------+ + + PURPOSE : Notify error status of SIM card + +*/ + +void sim_error_cfun (U8 result) +{ + TRACE_FUNCTION("sim_error_cfun()"); + + sim_status.sim_procedure = MFW_SIM_ACTIVATION; + sim_status.sim_operation_mode = sim_config.oper_mode; + + switch (result) + { + case CME_ERR_SimPinReq: /* PIN 1 must be entered */ + sim_status.sim_status = MFW_SIM_PIN_REQ; + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PIN1); + sim_status.sim_status_type = MFW_SIM_PIN1; + sim_stat = SIM_ACTIVE; + break; + case CME_ERR_SimPin2Req: /* PIN 2 must be entered */ + sim_status.sim_status = MFW_SIM_PIN2_REQ; + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PIN2); + sim_status.sim_status_type = MFW_SIM_PIN2; + sim_stat = SIM_ACTIVE; + break; + case CME_ERR_SimPukReq: /* PUK 1 must be entered */ + sim_status.sim_status = MFW_SIM_PUK_REQ; + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PUK1); + sim_status.sim_status_type = MFW_SIM_PUK1; + sim_stat = SIM_ACTIVE; + break; + case CME_ERR_SimPuk2Req: /* PUK 2 must be entered */ + sim_status.sim_status = MFW_SIM_PUK2_REQ; + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PUK2); + sim_status.sim_status_type = MFW_SIM_PUK2; + sim_stat = SIM_ACTIVE; + break; + case CME_ERR_SimFail: /* SIM card is invalid */ + case CME_ERR_SimWrong: + sim_status.sim_status = MFW_SIM_INVALID_CARD; + sim_status.sim_pin_retries = 0; + sim_status.sim_status_type = MFW_SIM_UNKNOWN; + sim_stat = SIM_NOT_ACTIVE; + break; + case CME_ERR_SimNotIns: /* no SIM card inserted */ + sim_status.sim_status = MFW_SIM_NO_SIM_CARD; + sim_status.sim_pin_retries = 0; + sim_status.sim_status_type = MFW_SIM_UNKNOWN; + sim_stat = SIM_NOT_ACTIVE; + break; + default: + TRACE_ERROR("sim_error_cfun(): result"); + return; + } + + sim_signal(E_SIM_STATUS,&sim_status); + + if ((result == CME_ERR_SimPinReq) + OR (result == CME_ERR_SimPukReq)) + pin1_set = MFW_SIM_ENABLE; +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_error_cpin | ++--------------------------------------------------------------------+ + + PURPOSE : Inform about error of PIN entering or PUK entering + +*/ + +void sim_error_cpin (T_ACI_CME_ERR reason) +{ + T_ACI_CPIN_RSLT code; + + TRACE_FUNCTION("sim_error_cpin()"); + + sim_status.sim_procedure = pin_flag; + sim_status.sim_operation_mode = sim_config.oper_mode; + sim_status.sim_status = MFW_SIM_FAILURE; + sim_status.sim_status_type = pin_ident; + + pin_flag = -1; + pin_ident = MFW_SIM_UNKNOWN; + + switch (reason) + { + case CME_ERR_WrongPasswd: + if (qAT_PlusCPIN(CMD_SRC_LCL,&code) != AT_CMPL) + { + TRACE_ERROR("sim_error_cpin():CPIN? failed"); + sim_signal(E_SIM_STATUS,&sim_status); + return; + } + break; + case CME_ERR_SimWrong: + sim_status.sim_status = MFW_SIM_INVALID_CARD; + sim_signal(E_SIM_STATUS,&sim_status); + return; + default: + TRACE_ERROR("sim_error_cpin():Ill reason"); + sim_signal(E_SIM_STATUS,&sim_status); + return; + } + + switch (code) + { + case CPIN_RSLT_SimPinReq: + sim_status.sim_status = MFW_SIM_PIN_REQ; + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PIN1); + break; + case CPIN_RSLT_SimPukReq: + sim_status.sim_status = MFW_SIM_PUK_REQ; + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PUK1); + break; + case CPIN_RSLT_SimPin2Req: + sim_status.sim_status = MFW_SIM_PIN2_REQ; + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PIN2); + break; + case CPIN_RSLT_SimPuk2Req: + sim_status.sim_status = MFW_SIM_PUK2_REQ; + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PUK2); + break; + case CPIN_RSLT_NotPresent: + case CPIN_RSLT_SimReady: + default: + TRACE_ERROR("sim_error_cpin():Ill code"); + break; + } + + sim_signal(E_SIM_STATUS,&sim_status); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_ok_cpin | ++--------------------------------------------------------------------+ + + PURPOSE : Successful end of PIN entering or PUK entering + +*/ + +void sim_ok_cpin (void) +{ + TRACE_FUNCTION("sim_ok_cpin()"); + + switch (pin_flag) + { + case MFW_SIM_VERIFY: + sim_status.sim_procedure = MFW_SIM_VERIFY; + sim_status.sim_status = MFW_SIM_NO_PIN; + sim_status.sim_status_type = pin_ident; + break; + case MFW_SIM_UNBLOCK: + sim_status.sim_procedure = MFW_SIM_UNBLOCK; + sim_status.sim_status = MFW_SIM_SUCCESS; + sim_status.sim_status_type = pin_ident; + break; + default: + break; + } + + pin_flag = -1; + pin_ident = MFW_SIM_UNKNOWN; + sim_status.sim_operation_mode = sim_config.oper_mode; + sim_status.sim_pin_retries = 0; + + sim_signal (E_SIM_STATUS, &sim_status); + if (nm_reg_flag_req()) + nm_activate(MFW_SIM_NO_PIN); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_ss_unblock | ++--------------------------------------------------------------------+ + + PURPOSE : SIM unblock via SS string + +*/ + +void sim_ss_unblock(UBYTE result, T_ACI_CME_ERR reason) +{ + TRACE_FUNCTION("sim_ss_unblock()"); + + pin_flag = MFW_SIM_UNBLOCK; + + if (result == SIM_UBLK_ERROR) + sim_error_cpin (reason); + if (result == SIM_UBLK_OK) + sim_ok_cpin (); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_verify_pin | ++--------------------------------------------------------------------+ + + PURPOSE : Verify PIN + +*/ + +void sim_verify_pin (U8 pin_id, char *pin) +{ + TRACE_FUNCTION("sim_verify_pin()"); + + pin_flag = MFW_SIM_VERIFY; + pin_ident = pin_id; + switch (pin_id) + { + case MFW_SIM_PIN1: + sAT_PercentPVRF(CMD_SRC_LCL, PVRF_TYPE_Pin1, pin, 0); + break; + case MFW_SIM_PIN2: + sAT_PercentPVRF(CMD_SRC_LCL, PVRF_TYPE_Pin2, pin, 0); + break; + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_unblock_pin | ++--------------------------------------------------------------------+ + + PURPOSE : unblock SIM + +*/ + +void sim_unblock_pin (U8 pin_id, char *puk, char *newpin) +{ + TRACE_FUNCTION("sim_unblock_pin()"); + + pin_flag = MFW_SIM_UNBLOCK; + pin_ident = pin_id; + switch (pin_id) + { + case MFW_SIM_PUK1: + sAT_PercentPVRF(CMD_SRC_LCL, PVRF_TYPE_Puk1, puk, newpin); + break; + case MFW_SIM_PUK2: + sAT_PercentPVRF(CMD_SRC_LCL, PVRF_TYPE_Puk2, puk, newpin); + break; + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_change_pin | ++--------------------------------------------------------------------+ + + PURPOSE : Request of PIN change + +*/ + +void sim_change_pin (U8 pin_id, U8 *old_pin, U8 *new_pin) +{ + TRACE_FUNCTION("sim_change_pin()"); + + pin_ident = pin_id; + switch (pin_id) + { + case MFW_SIM_PIN1: + sAT_PlusCPWD(CMD_SRC_LCL, CPWD_FAC_Sc, + (char *)old_pin, (char *)new_pin); + break; + case MFW_SIM_PIN2: + sAT_PlusCPWD(CMD_SRC_LCL, CPWD_FAC_P2, + (char *)old_pin, (char *)new_pin); + break; + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_ok_cpinc | ++--------------------------------------------------------------------+ + + PURPOSE : Notify successful end of PIN change + +*/ + +void sim_ok_cpinc (void) +{ + TRACE_FUNCTION("sim_ok_cpinc()"); + + sim_status.sim_procedure = MFW_SIM_CHANGE; + sim_status.sim_status = MFW_SIM_SUCCESS; + sim_status.sim_operation_mode = sim_config.oper_mode; + sim_status.sim_pin_retries = 0; + sim_status.sim_status_type = pin_ident; + + pin_ident = MFW_SIM_UNKNOWN; + sim_signal(E_SIM_STATUS,&sim_status); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_error_cpinc | ++--------------------------------------------------------------------+ + + PURPOSE : Notify failed PIN change + +*/ + +void sim_error_cpinc (void) +{ + TRACE_FUNCTION("sim_error_cpinc()"); + + sim_status.sim_procedure = MFW_SIM_CHANGE; + sim_status.sim_status = MFW_SIM_FAILURE; + sim_status.sim_operation_mode = sim_config.oper_mode; + if (pin_ident EQ MFW_SIM_PIN1) + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PIN1); + else if (pin_ident EQ MFW_SIM_PIN2) + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PIN2); + else + sim_status.sim_pin_retries = 0; + sim_status.sim_status_type = pin_ident; + + pin_ident = MFW_SIM_UNKNOWN; + sim_signal(E_SIM_STATUS,&sim_status); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_disable_pin | ++--------------------------------------------------------------------+ + + PURPOSE : Request PIN disability + +*/ + +void sim_disable_pin (U8 *pin) +{ + TRACE_FUNCTION("sim_disable_pin()"); + + ss_set_clck(CLCK_FAC_Sc, CLCK_MOD_Unlock, + (char *)pin, -1, MFW_SIM_CPIND); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_ok_cpind | ++--------------------------------------------------------------------+ + + PURPOSE : Successful end of PIN disability + +*/ + +void sim_ok_cpind (void) +{ + TRACE_FUNCTION("sim_ok_cpind()"); + + sim_status.sim_procedure = MFW_SIM_DISABLE; + sim_status.sim_status = MFW_SIM_SUCCESS; + sim_status.sim_operation_mode = sim_config.oper_mode; + sim_status.sim_pin_retries = 0; + sim_status.sim_status_type = MFW_SIM_UNKNOWN; // no indication + + pin1_set = MFW_SIM_DISABLE; + sim_signal(E_SIM_STATUS,&sim_status); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_error_cpind | ++--------------------------------------------------------------------+ + + PURPOSE : Failed PIN disability + +*/ + +void sim_error_cpind (void) +{ + TRACE_FUNCTION("sim_error_cpind()"); + + sim_status.sim_procedure = MFW_SIM_DISABLE; + sim_status.sim_status = MFW_SIM_FAILURE; + sim_status.sim_operation_mode = sim_config.oper_mode; + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PIN1); + sim_status.sim_status_type = MFW_SIM_UNKNOWN; // no indication + + sim_signal(E_SIM_STATUS,&sim_status); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_enable_pin | ++--------------------------------------------------------------------+ + + PURPOSE : Request PIN enability + +*/ + +void sim_enable_pin (U8 *pin) +{ + TRACE_FUNCTION("sim_enable_pin()"); + + ss_set_clck(CLCK_FAC_Sc, CLCK_MOD_Lock, + (char *)pin, -1, MFW_SIM_CPINE); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_ok_cpine | ++--------------------------------------------------------------------+ + + PURPOSE : Successful end of PIN enability + +*/ + +void sim_ok_cpine() +{ + TRACE_FUNCTION("sim_ok_cpine()"); + + sim_status.sim_procedure = MFW_SIM_ENABLE; + sim_status.sim_status = MFW_SIM_SUCCESS; + sim_status.sim_operation_mode = sim_config.oper_mode; + sim_status.sim_pin_retries = 0; + sim_status.sim_status_type = MFW_SIM_UNKNOWN; // no indication + + pin1_set = MFW_SIM_ENABLE; + sim_signal(E_SIM_STATUS,&sim_status); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_error_cpine | ++--------------------------------------------------------------------+ + + PURPOSE : Failed PIN enability + +*/ + +void sim_error_cpine (void) +{ + TRACE_FUNCTION("sim_error_cpine()"); + + sim_status.sim_procedure = MFW_SIM_ENABLE; + sim_status.sim_status = MFW_SIM_FAILURE; + sim_status.sim_operation_mode = sim_config.oper_mode; + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PIN1); + sim_status.sim_status_type = MFW_SIM_UNKNOWN; // no indication + + sim_signal(E_SIM_STATUS,&sim_status); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_check_service | ++--------------------------------------------------------------------+ + + PURPOSE : Checks a service status + +*/ + +U8 sim_check_service (U8 nr, U8 *serv_table) +{ + U8 value; + + TRACE_FUNCTION("sim_check_service()"); + + value = *(serv_table + (nr - 1) / 4); + value >>= ((nr - 1) & 3) * 2; + + return (value & 3); +} + + +/* ++-----------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_serv_table_check | ++-----------------------------------------------------------------------+ + + PURPOSE : Checks a service status in SIM service table + +*/ + +T_MFW sim_serv_table_check(UBYTE serv_num) +{ + TRACE_FUNCTION("sim_serv_table_check()"); + return sim_check_service(serv_num, sim_service_table); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : rAT_PlusCFUNP | ++--------------------------------------------------------------------+ + + PURPOSE : MMI relevant parameters from the SIM card + +*/ + +void rAT_PlusCFUNP (T_SIM_MMI_INSERT_IND *mmi_insert_ind) +{ + TRACE_FUNCTION("rAT_PlusCFUNP()"); + + sim_stat = SIM_ACTIVE; + + sim_config.oper_mode = mmi_insert_ind->func; + // sms_mmi_parameter(mmi_insert_ind->cbmid); + nm_mmi_parameters(&mmi_insert_ind->imsi_field, + &mmi_insert_ind->pref_plmn); + memcpy(sim_service_table,mmi_insert_ind->sim_serv, + sizeof(sim_service_table)); + //memcpy(sim_config.deper_key,mmi_insert_ind->deper_key, + // sizeof(sim_config.deper_key)); + sim_config.phase = mmi_insert_ind->phase; + sim_config.access_acm = mmi_insert_ind->access_acm; + sim_config.access_acmmax = mmi_insert_ind->access_acmmax; + sim_config.access_puct = mmi_insert_ind->access_puct; + +// sim_init_sim_insert(); + + if (sim_check_service(15,sim_service_table) + == ALLOCATED_AND_ACTIVATED) + sim_read_sim(SIM_GID1, NOT_PRESENT_8BIT, 5); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_mmi_parameter | ++--------------------------------------------------------------------+ + + PURPOSE : MMI relevant parameters from the SIM card + +*/ + +void sim_mmi_parameter(T_SIM_ACTIVATE_CNF *sim_act_cnf) +{ + TRACE_FUNCTION("sim_mmi_parameter()"); + + memcpy( sim_config.pref_lang, sim_act_cnf->pref_lang, 5); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_gid1_cnf | ++--------------------------------------------------------------------+ + + PURPOSE : read SIM group identifier 1 from SIM card + +*/ + +void sim_gid1_cnf(SHORT error, UBYTE *data) +{ + TRACE_FUNCTION("sim_gid1_cnf()"); + + if (error EQ SIM_NO_ERROR) + memcpy(sim_config.sim_gidl1, data, 5); + + if (!sat_update) + { + if (sim_check_service(16,sim_service_table) + == ALLOCATED_AND_ACTIVATED) + sim_read_sim(SIM_GID2, NOT_PRESENT_8BIT, 5); + } +#ifdef SIM_TOOLKIT + else + { + sat_update = FALSE; + satUpdateFiles ( TRUE, SIM_GID1 ); + } +#endif +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_gid2_cnf | ++--------------------------------------------------------------------+ + + PURPOSE : read SIM group identifier 2 from SIM card + +*/ + +void sim_gid2_cnf(SHORT error, UBYTE *data) +{ + TRACE_FUNCTION("sim_gid2_cnf()"); + if (error EQ SIM_NO_ERROR) + memcpy(sim_config.sim_gidl2, data, 5); + +#ifdef SIM_TOOLKIT + if ( sat_update ) + { + sat_update = FALSE; + satUpdateFiles ( TRUE, SIM_GID2 ); + } +#endif +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_save_pref_lang | ++--------------------------------------------------------------------+ + + PURPOSE : save preferred language + +*/ + +void sim_save_pref_lang (UBYTE *lang, UBYTE len) +{ + UBYTE sim_data[7]; + UBYTE i; + + TRACE_FUNCTION("sim_save_pref_lang()"); + + // + // copy a maximum of 5 bytes for storing on the SIM card + // + for (i=0;i<len AND i<5;i++) + sim_data[i] = lang[i]; + + // + // if less than 5 bytes fill with dummy values + // + for (i=len; i<5;i++) + sim_data[i] = 0xFF; + + // + // write to the SIM card + // + sim_write_sim(SIM_LP, sim_data, 5); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : rAT_PercentSIMREM | ++--------------------------------------------------------------------+ + + PURPOSE : call back for SIM removed + +*/ + +void rAT_PercentSIMREM( T_ACI_SIMREM_TYPE srType ) +{ + TRACE_FUNCTION("rAT_PercentSIMREM()"); + + if ( srType EQ SIMREM_FAILURE ) + { + sim_status.sim_procedure = MFW_SIM_REMOVED; + sim_status.sim_status = MFW_SIM_NO_SIM_CARD; + sim_status.sim_operation_mode = sim_config.oper_mode; + sim_status.sim_pin_retries = 0; + sim_status.sim_status_type = MFW_SIM_UNKNOWN; + sim_stat = SIM_NOT_ACTIVE; + sim_signal(E_SIM_STATUS,&sim_status); + } + else if ( srType EQ SIMREM_RESET ) + { +#ifdef SIM_TOOLKIT + sim_signal(E_SIM_RESET, 0); +#endif + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : rAT_percentSIMINS | ++--------------------------------------------------------------------+ + + PURPOSE : call back for SIM inserted + +*/ + +void rAT_PercentSIMINS( T_ACI_CME_ERR err ) +{ + TRACE_FUNCTION("rAT_percentSIMINS()"); + + sim_signal(E_SIM_INSERTED, 0); + + switch ( err ) + { + case CME_ERR_SimPinReq: + sim_status.sim_status = MFW_SIM_PIN_REQ; + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PIN1); + sim_status.sim_status_type = MFW_SIM_PIN1; + sim_stat = SIM_ACTIVE; + sim_signal(E_SIM_STATUS, &sim_status); + break; + + case CME_ERR_SimPukReq: + sim_status.sim_status = MFW_SIM_PUK_REQ; + sim_status.sim_pin_retries = sim_pin_count(MFW_SIM_PUK1); + sim_status.sim_status_type = MFW_SIM_PUK1; + sim_stat = SIM_ACTIVE; + sim_signal(E_SIM_STATUS, &sim_status); + break; + + default: + break; + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_configuration | ++--------------------------------------------------------------------+ + + PURPOSE : Request the configuration of SIM card + +*/ + +UBYTE sim_cvt_access_status(UBYTE acs) +{ + TRACE_FUNCTION("sim_cvt_access_status()"); + + switch(acs) + { + case ACCESS_ALWAYS: return MFW_SIM_NO_PIN; + case ACCESS_PIN_1: return MFW_SIM_PIN1; + case ACCESS_PIN_2: return MFW_SIM_PIN2; + default: return MFW_SIM_UNKNOWN; + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_configuration | ++--------------------------------------------------------------------+ + + PURPOSE : Request the configuration of SIM card + +*/ + +MfwRes sim_configuration (U8 *phase, U8 *serv, U8 *slen, + U8 *lang, U8 *llen, + T_MFW_AOC_ACCESS *access) +{ + U8 l; + TRACE_FUNCTION("sim_configuration()"); + + //PATCH2 TB 1310: Add test of NULL parameter to avoid to declare parameter of unwanted data + if (sim_stat != SIM_ACTIVE) + return MFW_SIM_FAILURE; + + if (phase != NULL) + *phase = sim_config.phase; + + if ((serv != NULL) && (slen != NULL)) + { + l = sizeof(sim_service_table); + if (l < *slen) + *slen = l; + memcpy(serv,sim_service_table,*slen); + } + + //PATCH1 TB 1310: replace slen by llen + if ((lang != NULL) && (llen != NULL)) + { + l = sizeof(sim_config.pref_lang); + if (l < *llen) + *llen = l; + memcpy(lang, sim_config.pref_lang, *llen); + } + //END PATCH1 TB + + if (access != NULL) + { + access->access_acm = sim_cvt_access_status(sim_config.access_acm); + access->access_acmmax = sim_cvt_access_status(sim_config.access_acmmax); + access->access_puct = sim_cvt_access_status(sim_config.access_puct); + } + //END PATCH2 TB + + return MFW_SIM_SUCCESS; +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_status_check | ++--------------------------------------------------------------------+ + + PURPOSE : check activation of SIM card + +*/ + +int sim_status_check (void) +{ + TRACE_FUNCTION("sim_status_check()"); + + return sim_stat; +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_pin_count | ++--------------------------------------------------------------------+ + + PURPOSE : Request PIN/PUK count + +*/ + +int sim_pin_count(U8 pin_id) +{ + SHORT pn1Cnt; + SHORT pn2Cnt; + SHORT pk1Cnt; + SHORT pk2Cnt; + T_ACI_PVRF_STAT ps1; + T_ACI_PVRF_STAT ps2; + + TRACE_FUNCTION("sim_pin_count()"); + + + if (qAT_PercentPVRF(CMD_SRC_LCL, &pn1Cnt, + &pn2Cnt, &pk1Cnt, &pk2Cnt, &ps1, &ps2) != AT_CMPL) + return -1; + + switch (pin_id) + { + case MFW_SIM_PIN1: return pn1Cnt; + case MFW_SIM_PIN2: return pn2Cnt; + case MFW_SIM_PUK1: return pk1Cnt; + case MFW_SIM_PUK2: return pk2Cnt; + default: return -1; + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : simDecodeB2A | ++--------------------------------------------------------------------+ + + PURPOSE : convert bcd to ASCII + +*/ + +void simDecodeB2A (U8 *ci, U8 li, U8 *di) +{ + int i; + + TRACE_FUNCTION("simDecodeB2A()"); + + for (i = 0; i < li * 2; i++) + { + di[i] = (i & 1) ? (ci[i/2] >> 4) + '0' + : (ci[i/2] & 0x0f) + '0'; + if (di[i] > '9') + { + di[i] = 0; + break; + } + } + di[i] = 0; +} + + +/* ++---------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_unlock_sim_lock | ++---------------------------------------------------------------------+ + + PURPOSE : de-personalisation for SIM lock. + +*/ + +T_MFW sim_unlock_sim_lock(UBYTE type, UBYTE *passwd) +{ + UBYTE eep_ckey [LONG_NAME]; // extracted version of PCM content + EF_SIMLCKEXT simlck; + + TRACE_FUNCTION("sim_unlock_sim_lock()"); + + /* + * Read SIM LOCK Record from PCM + */ + if (sim_get_sim_lock (&simlck) NEQ PCM_OK) + { + TRACE_ERROR("No SIMLCK"); + return MFW_SIM_UNLOCK_ERR; + } + + /* + * check whether card is already blocked + */ + if (simlck.cnt >= simlck.maxcnt) + return MFW_SIM_BLOCKED; + + switch (type) + { + /* + * N-Lock + */ + case MFW_SIM_NLOCK: + /* + * Extract Key from PCM record + */ + simDecodeB2A (simlck.NKey, 8, eep_ckey); + if (!strcmp((char *)eep_ckey, (char *)passwd)) + { + /* + * unblock password is okay + */ + sim_nlock = SIMLOCK_ENABLED; + simlck.locks1 = (UBYTE) FldSet(simlck.locks1,nlock,sim_nlock); + simlck.cnt = 0; + sim_set_sim_lock (&simlck); + + return MFW_SIM_NLOCK; + } + break; + + /* + * SP-Lock + */ + case MFW_SIM_SPLOCK: + /* + * Extract Key from PCM record + */ + simDecodeB2A (simlck.SPKey, 8, eep_ckey); + if (!strcmp((char *)eep_ckey, (char *)passwd)) + { + /* + * unblock password is okay + */ + sim_splock = SIMLOCK_ENABLED; + simlck.locks1 = (UBYTE) FldSet(simlck.locks1,splock,sim_splock); + simlck.cnt = 0; + sim_set_sim_lock (&simlck); + + return MFW_SIM_SPLOCK; + } + break; + + /* + * NS-Lock + */ + case MFW_SIM_NSLOCK: + /* + * Extract Key from PCM record + */ + simDecodeB2A (simlck.NSKey, 8, eep_ckey); + if (!strcmp((char *)eep_ckey, (char *)passwd)) + { + /* + * unblock password is okay + */ + sim_nslock = SIMLOCK_ENABLED; + simlck.locks1 = (UBYTE) FldSet(simlck.locks1,nslock,sim_nslock); + simlck.cnt = 0; + sim_set_sim_lock (&simlck); + + return MFW_SIM_NSLOCK; + } + break; + + /* + * C-Lock + */ + case MFW_SIM_CLOCK: + /* + * Extract Key from PCM record + */ + simDecodeB2A (simlck.CKey, 8, eep_ckey); + if (!strcmp((char *)eep_ckey, (char *)passwd)) + { + /* + * unblock password is okay + */ + sim_clock = SIMLOCK_ENABLED; + simlck.locks2 = (UBYTE) FldSet(simlck.locks2,clock,sim_clock); + simlck.cnt = 0; + sim_set_sim_lock (&simlck); + + return MFW_SIM_CLOCK; + } + break; + + /* + * P-Lock + */ + case MFW_SIM_PLOCK: + /* + * Extract Key from PCM record + */ + simDecodeB2A (simlck.PKey, 8, eep_ckey); + if (!strcmp((char *)eep_ckey, (char *)passwd)) + { + /* + * unblock password is correct + */ + sim_plock = SIMLOCK_ENABLED; + simlck.locks1 = (UBYTE) FldSet(simlck.locks1,plock,sim_plock); + simlck.cnt = 0; + sim_set_sim_lock (&simlck); + + return MFW_SIM_PLOCK; + } + break; + + default: + return MFW_SIM_UNLOCK_ERR; + } + + /* + * another failed attempt + * increment counter, store in PCM and may change the status + */ + simlck.cnt++; + sim_set_sim_lock (&simlck); + + if (simlck.cnt >= simlck.maxcnt) + { + sim_blocked = TRUE; + return MFW_SIM_BLOCKED; + } + else + return MFW_SIM_UNLOCK_ERR; +} + +/* ++---------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_check_sim_Plock | ++---------------------------------------------------------------------+ + + PURPOSE : check SIM lock + +*/ + +int sim_check_sim_Plock (void) +{ + EF_SIMLCKEXT simlck; + UBYTE i; + + TRACE_FUNCTION ("sim_check_sim_Plock()"); + + + if (sim_blocked EQ TRUE OR + sim_plock EQ SIMLOCK_BLOCKED) + { + /* + * Try to reset unlock attempt counter + */ + sim_check_unblock_sim (&simlck); + return MFW_SIM_BLOCKED; + } + + /* + * lock check disabled + */ + if (sim_plock EQ SIMLOCK_DISABLED) + return MFW_SIM_DISABLE; + + /* + * lock check blocked + */ + if (sim_plock EQ SIMLOCK_LOCKED) + return MFW_SIM_LOCKED; + + /* + * lock check enabled + */ + if (sim_plock EQ SIMLOCK_ENABLED) + { + if (sim_get_sim_lock (&simlck) NEQ PCM_OK) + { + TRACE_ERROR("No SIMLCK"); + return MFW_SIM_FAILURE; + } + + /* + * Check all digits + */ + for (i=0; i<simlck.len_p_imsi; i++) + { + if (sim_check_imsi_digit(simlck.p_imsi[i], mfw_IMSI[i]) EQ FALSE) + break; + } + + /* + * all digits okay + */ + if (i EQ simlck.len_p_imsi) + return MFW_SIM_ENABLE; + + /* + * P-LOCK check failed + */ + + sim_plock = SIMLOCK_LOCKED; + simlck.locks1 = (UBYTE) FldSet(simlck.locks1,plock,sim_plock); + sim_set_sim_lock (&simlck); + return MFW_SIM_LOCKED; + } + + /* + * shall not happen + */ + return MFW_SIM_FAILURE; +} + + +/* ++---------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_check_sim_Nlock | ++---------------------------------------------------------------------+ + + PURPOSE : Check network lock + +*/ + +int sim_check_sim_Nlock (void) +{ + EF_SIMLCKEXT simlck; + UBYTE i; + + TRACE_FUNCTION ("sim_check_sim_Nlock()"); + + if (sim_blocked EQ TRUE OR + sim_nlock EQ SIMLOCK_BLOCKED) + { + /* + * Try to reset unlock attempt counter + */ + sim_check_unblock_sim (&simlck); + return MFW_SIM_BLOCKED; + } + + /* + * lock check disabled + */ + if (sim_nlock EQ SIMLOCK_DISABLED) + return MFW_SIM_DISABLE; + + /* + * lock check blocked + */ + if (sim_nlock EQ SIMLOCK_LOCKED) + return MFW_SIM_LOCKED; + + /* + * lock check enabled + */ + if (sim_nlock EQ SIMLOCK_ENABLED) + { + if (sim_get_sim_lock (&simlck) NEQ PCM_OK) + { + TRACE_ERROR("No SIMLCK"); + return MFW_SIM_FAILURE; + } + + /* + * check all digits + */ + for (i=0; i<simlck.len_n_imsi; i++) + { + if (sim_check_imsi_digit(simlck.n_imsi[i], mfw_IMSI[i]) EQ FALSE) + break; + } + + /* + * all digits okay + */ + if (i EQ simlck.len_n_imsi) + return MFW_SIM_ENABLE; + + /* + * N-LOCK check failed + */ + sim_nlock = SIMLOCK_LOCKED; + simlck.locks1 = (U8) FldSet(simlck.locks1,nlock,sim_nlock); + sim_set_sim_lock (&simlck); + return MFW_SIM_LOCKED; + } + /* + * shall not happen + */ + return MFW_SIM_FAILURE; +} + + +/* ++---------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_check_sim_SPlock| ++---------------------------------------------------------------------+ + + PURPOSE : Check SIM service provider lock. It only works with SIMs + which support GID1 file. + +*/ + +int sim_check_sim_SPlock (void) +{ + EF_SIMLCKEXT simlck; + UBYTE i; + + TRACE_FUNCTION ("sim_check_sim_SPlock()"); + + /* + * Only if Service 15 is activated and allocated + */ + if (sim_check_service(15,sim_service_table) NEQ ALLOCATED_AND_ACTIVATED) + return MFW_SIM_FAILURE; + + if (sim_blocked EQ TRUE OR + sim_splock EQ SIMLOCK_BLOCKED) + { + /* + * Try to reset unlock attempt counter + */ + sim_check_unblock_sim (&simlck); + return MFW_SIM_BLOCKED; + } + + /* + * lock check disabled + */ + if (sim_splock EQ SIMLOCK_DISABLED) + return MFW_SIM_DISABLE; + + /* + * lock check blocked + */ + if (sim_splock EQ SIMLOCK_LOCKED) + return MFW_SIM_LOCKED; + + /* + * lock check enabled + */ + if (sim_splock EQ SIMLOCK_ENABLED) + { + if (sim_get_sim_lock (&simlck) NEQ PCM_OK) + { + TRACE_ERROR("No SIMLCK"); + return MFW_SIM_FAILURE; + } + + /* + * check SP group identifier + */ + if (memcmp(&simlck.gidl1, sim_config.sim_gidl1, 1)) + { + sim_splock = SIMLOCK_LOCKED; + simlck.locks1 = (UBYTE) FldSet(simlck.locks1,splock,sim_splock); + sim_set_sim_lock (&simlck); + + return MFW_SIM_LOCKED; + } + + /* + * check all digits + */ + for (i=0; i<simlck.len_sp_imsi; i++) + { + if (sim_check_imsi_digit(simlck.sp_imsi[i], mfw_IMSI[i]) EQ FALSE) + break; + } + + /* + * all digits okay + */ + if (i EQ simlck.len_sp_imsi) + return MFW_SIM_ENABLE; + + /* + * failed SP-Lock + */ + sim_splock = SIMLOCK_LOCKED; + simlck.locks1 = (UBYTE) FldSet(simlck.locks1,splock,sim_splock); + sim_set_sim_lock (&simlck); + + return MFW_SIM_LOCKED; + } + /* + * shall not happen + */ + return MFW_SIM_FAILURE; +} + + +/* ++---------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_check_sim_NSlock| ++---------------------------------------------------------------------+ + + PURPOSE : Check network subset lock + +*/ + +int sim_check_sim_NSlock (void) +{ + EF_SIMLCKEXT simlck; + UBYTE i; + + TRACE_FUNCTION ("sim_check_sim_NSlock()"); + + if (sim_blocked EQ TRUE OR + sim_nslock EQ SIMLOCK_BLOCKED) + { + /* + * Try to reset unlock attempt counter + */ + sim_check_unblock_sim (&simlck); + return MFW_SIM_BLOCKED; + } + + /* + * lock check disabled + */ + if (sim_nslock EQ SIMLOCK_DISABLED) + return MFW_SIM_DISABLE; + + /* + * lock check blocked + */ + if (sim_nslock EQ SIMLOCK_LOCKED) + return MFW_SIM_LOCKED; + + /* + * lock check enabled + */ + if (sim_nslock EQ SIMLOCK_ENABLED) + { + if (sim_get_sim_lock (&simlck) NEQ PCM_OK) + { + TRACE_ERROR("No SIMLCK"); + return MFW_SIM_FAILURE; + } + + /* + * check all digits + */ + for (i=0; i<simlck.len_ns_imsi; i++) + { + if (sim_check_imsi_digit(simlck.ns_imsi[i], mfw_IMSI[i]) EQ FALSE) + break; + } + + /* + * all digits okay + */ + if (i EQ simlck.len_ns_imsi) + return MFW_SIM_ENABLE; + + /* + * Lock has failed + */ + sim_nslock = SIMLOCK_LOCKED; + simlck.locks1 = (UBYTE) FldSet(simlck.locks1,nslock,sim_nslock); + sim_set_sim_lock (&simlck); + + return MFW_SIM_LOCKED; + } + + /* + * shall not happen + */ + return MFW_SIM_FAILURE; +} + +/* ++---------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_check_sim_Clock | ++---------------------------------------------------------------------+ + + PURPOSE : Check corporate lock. It only works with SIMs + which support GID1 and GID2 files. + +*/ + +int sim_check_sim_Clock (void) +{ + EF_SIMLCKEXT simlck; + UBYTE i; + + TRACE_FUNCTION ("sim_check_sim_Clock()"); + + /* + * check the SIM supports GID1 and GID2 + */ + if (sim_check_service(15,sim_service_table) NEQ ALLOCATED_AND_ACTIVATED) + return MFW_SIM_FAILURE; + + if (sim_check_service(16,sim_service_table) NEQ ALLOCATED_AND_ACTIVATED) + return MFW_SIM_FAILURE; + + if (sim_blocked EQ TRUE OR + sim_clock EQ SIMLOCK_BLOCKED) + { + /* + * Try to reset unlock attempt counter + */ + sim_check_unblock_sim (&simlck); + return MFW_SIM_BLOCKED; + } + + /* + * lock check disabled + */ + if (sim_clock EQ SIMLOCK_DISABLED) + return MFW_SIM_DISABLE; + + /* + * lock check blocked + */ + if (sim_clock EQ SIMLOCK_LOCKED) + return MFW_SIM_LOCKED; + + /* + * lock check enabled + */ + if (sim_clock EQ SIMLOCK_ENABLED) + { + if (sim_get_sim_lock (&simlck) NEQ PCM_OK) + { + TRACE_ERROR("No SIMLCK"); + return MFW_SIM_FAILURE; + } + + /* + * check SP group identifier 1 and 2 + */ + if (simlck.gidl1 NEQ sim_config.sim_gidl1[0] OR + simlck.gidl2 NEQ sim_config.sim_gidl2[0]) + { + sim_clock = SIMLOCK_LOCKED; + simlck.locks2 = (UBYTE) FldSet(simlck.locks2,clock,sim_clock); + sim_set_sim_lock (&simlck); + return MFW_SIM_LOCKED; + } + + /* + * check all digits */ + for (i=0; i<simlck.len_c_imsi; i++) + { + if (sim_check_imsi_digit(simlck.c_imsi[i], mfw_IMSI[i]) EQ FALSE) + break; + } + + /* + * all digits okay + */ + if (i EQ simlck.len_c_imsi) + return MFW_SIM_ENABLE; + + /* + * C-Lock has failed + */ + sim_clock = SIMLOCK_LOCKED; + simlck.locks2 = (UBYTE) FldSet(simlck.locks2,clock,sim_clock); + sim_set_sim_lock (&simlck); + + return MFW_SIM_LOCKED; + } + return MFW_SIM_FAILURE; +} + +/* ++-----------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_get_simlock_count | ++-----------------------------------------------------------------------+ + + PURPOSE : Request the count of SIMLOCK + +*/ + +T_MFW sim_get_simlock_count(UBYTE *cnt) +{ + EF_SIMLCKEXT simlck; + + TRACE_FUNCTION("sim_get_simlock_count()"); + + if (sim_get_sim_lock (&simlck) NEQ PCM_OK) + return MFW_SIM_FAILURE; + else + *cnt = simlck.cnt; + return MFW_SIM_SUCCESS; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_pin_status | ++--------------------------------------------------------------------+ + + PURPOSE : Request PIN1/PIN2 status + +*/ + +void sim_pin_status(T_MFW_SIM_PIN_STATUS *status) +{ + SHORT pn1Cnt; + SHORT pn2Cnt; + SHORT pk1Cnt; + SHORT pk2Cnt; + T_ACI_PVRF_STAT ps1; + T_ACI_PVRF_STAT ps2; + + TRACE_FUNCTION("sim_pin_status()"); + + status->stat = MFW_SIM_UNKNOWN; + status->set = MFW_SIM_UNKNOWN; + if (qAT_PercentPVRF(CMD_SRC_LCL, &pn1Cnt, + &pn2Cnt, &pk1Cnt, &pk2Cnt, &ps1, &ps2) == AT_CMPL) + { + switch (status->type) + { + case MFW_SIM_PIN1: + status->stat = sim_cvtPINstatus(ps1, MFW_SIM_PIN1); + status->set = pin1_set; + break; + case MFW_SIM_PIN2: + status->stat = sim_cvtPINstatus(ps2, MFW_SIM_PIN2); + status->set = pin2_set; + break; + } + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_cvtPINstatus | ++--------------------------------------------------------------------+ + + PURPOSE : + +*/ + +UBYTE sim_cvtPINstatus(T_ACI_PVRF_STAT ps, UBYTE type) +{ + TRACE_FUNCTION("sim_cvtPINstatus()"); + + switch (ps) + { + case PVRF_STAT_NotRequired: + return MFW_SIM_NO_PIN; + case PVRF_STAT_Required: + if (type EQ MFW_SIM_PIN1) + return MFW_SIM_PIN_REQ; + if (type EQ MFW_SIM_PIN2) + return MFW_SIM_PIN2_REQ; + return MFW_SIM_UNKNOWN; + default: + return MFW_SIM_UNKNOWN; + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : simDecodeIMSI | ++--------------------------------------------------------------------+ + + PURPOSE : convert imsi (packed bcd to ASCIIZ; ->11.11) + +*/ + +void simDecodeIMSI (UBYTE * imsi_field, + UBYTE imsi_c_field, + UBYTE * imsi_extracted) +{ + UBYTE length; + UBYTE i; + UBYTE digit; + + TRACE_FUNCTION ("simDecodeImsi()"); + + /* + * calculate number of digits + */ + length = (imsi_c_field-1)*2; + + /* + * if odd number of digits add one + */ + if (imsi_field[0] & 0x08) + length++; + + /* + * extract all digits + */ + for (i = 0; i < length; i++) + { + digit = (i & 1) ? + imsi_field[(i + 1) / 2] & 0x0f : + (imsi_field[(i + 1) / 2] & 0xf0) >> 4; + +#if defined (WIN32) + { + char buf[40]; + sprintf (buf, "DIGIT [%d] = %d",i, digit); + TRACE_FUNCTION (buf); + } +#endif + if (i < LONG_NAME) + imsi_extracted [i] = digit + 0x30; + else + { + imsi_extracted [i] = 0; + return; + } + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_pin_ident | ++--------------------------------------------------------------------+ + + PURPOSE : handle mfw windows command + +*/ + +void sim_pin_ident(UBYTE id) +{ + TRACE_FUNCTION("sim_pin_ident()"); + pin_ident = id; +} + +/* ++-----------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_check_imsi_digit | ++-----------------------------------------------------------------------+ + + PURPOSE : Check a IMSI digit + +*/ + +T_MFW sim_check_imsi_digit(UBYTE pcm_imsi, UBYTE sim_imsi) +{ + UBYTE h; + UBYTE l; + + TRACE_FUNCTION("sim_check_imsi_digit()"); + + h = pcm_imsi >> 4 | 0x30; + l = pcm_imsi & 0x0F | 0x30; + +#if defined (WIN32) + { + char buf[40]; + sprintf (buf, "check %c shall be in the range [%c..%c]", + sim_imsi, h, l); + TRACE_FUNCTION (buf); + } +#endif + + if (h > l) + return FALSE; + + if ((sim_imsi < h) OR (sim_imsi > l)) + return FALSE; + + return TRUE; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : simCommand | ++--------------------------------------------------------------------+ + + PURPOSE : handle mfw windows command + +*/ + +static int simCommand (U32 cmd, void *h) +{ + switch (cmd) + { + case MfwCmdDelete: /* delete me */ + if (!h) + return 0; + sim_delete(h); + return 1; + default: + break; + } + + return 0; +} + + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_get_sim_lock | ++--------------------------------------------------------------------+ + + PURPOSE : Reads the SIM LOCK Record content from PCM + +*/ + +#if defined (WIN32) +static const UBYTE sim_lock_table_1 [] = +{ + // + // all locks enabled, wrong IMSI + // + 0x55, 0x01, // locks + 0x00, // unblock counter + 0x0F, // maximum attempt + 0x21, 0x43, 0x65, 0x87, // P control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // N control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // NS control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // SP control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // C control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x0F, // length of IMSI + 0x22, 0x00, 0x22, 0x01, // IMSI range definition + 0x23, 0x15, 0x22, 0x35, + 0x24, 0x25, 0x11, 0x22, + 0x46, 0x55, 0x66, + 0x00, 0x00 // Group Identifier +}; + +static const UBYTE sim_lock_table_2 [] = +{ + // + // all locks enabled, IMSI ok + // + 0x55, 0x01, // locks + 0x00, // unblock counter + 0x0F, // maximum attempt + 0x21, 0x43, 0x65, 0x87, // P control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // N control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // NS control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // SP control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // C control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x0D, // length of IMSI + 0x22, 0x66, 0x22, 0x00, // IMSI range definition + 0x11, 0x44, 0x77, 0x09, + 0x09, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, + 0x00, 0x00 // Group Identifier +}; + +static const UBYTE sim_lock_table_3 [] = +{ + // + // all locks enabled, wrong IMSI, extended format + // + 0x55, 0x01, // locks + 0x00, // unblock counter + 0x0F, // maximum attempt + 0x21, 0x43, 0x65, 0x87, // P control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // N control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // NS control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // SP control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // C control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x0F, // length of IMSI P-Lock + 0x22, 0x00, 0x22, 0x01, // IMSI range definition P-Lock + 0x23, 0x15, 0x22, 0x35, + 0x24, 0x25, 0x11, 0x22, + 0x46, 0x55, 0x66, + 0x0F, // length of IMSI SP-Lock + 0x22, 0x00, 0x22, 0x01, // IMSI range definition SP-Lock + 0x23, 0x15, 0x22, 0x35, + 0x24, 0x25, 0x11, 0x22, + 0x46, 0x55, 0x66, + 0x0F, // length of IMSI NS-Lock + 0x22, 0x00, 0x22, 0x01, // IMSI range definition NS-Lock + 0x23, 0x15, 0x22, 0x35, + 0x24, 0x25, 0x11, 0x22, + 0x46, 0x55, 0x66, + 0x0F, // length of IMSI C-Lock + 0x22, 0x00, 0x22, 0x01, // IMSI range definition C-Lock + 0x23, 0x15, 0x22, 0x35, + 0x24, 0x25, 0x11, 0x22, + 0x46, 0x55, 0x66, + 0x0F, // length of IMSI N-Lock + 0x22, 0x00, 0x22, 0x01, // IMSI range definition N-Lock + 0x23, 0x15, 0x22, 0x35, + 0x24, 0x25, 0x11, 0x22, + 0x46, 0x55, 0x66, + 0x0F, // length of IMSI U-Lock + 0x22, 0x00, 0x22, 0x01, // IMSI range definition U-Lock + 0x23, 0x15, 0x22, 0x35, + 0x24, 0x25, 0x11, 0x22, + 0x46, 0x55, 0x66, + 0x00, 0x00 // Group Identifier +}; + +static const UBYTE sim_lock_table_4 [] = +{ + // + // all locks enabled, IMSI ok, extended format + // + 0x55, 0x01, // locks + 0x00, // unblock counter + 0x0F, // maximum attempt + 0x21, 0x43, 0x65, 0x87, // P control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // N control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // NS control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // SP control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // C control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x0D, // length of IMSI P-Lock + 0x22, 0x66, 0x22, 0x00, // IMSI range definition P-Lock + 0x11, 0x44, 0x77, 0x09, + 0x09, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, + 0x0D, // length of IMSI SP-Lock + 0x22, 0x66, 0x22, 0x00, // IMSI range definition SP-Lock + 0x11, 0x44, 0x77, 0x09, + 0x09, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, + 0x0D, // length of IMSI NS-Lock + 0x22, 0x66, 0x22, 0x00, // IMSI range definition NS-Lock + 0x11, 0x44, 0x77, 0x09, + 0x09, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, + 0x0D, // length of IMSI C-Lock + 0x22, 0x66, 0x22, 0x00, // IMSI range definition C-Lock + 0x11, 0x44, 0x77, 0x09, + 0x09, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, + 0x0D, // length of IMSI N-Lock + 0x22, 0x66, 0x22, 0x00, // IMSI range definition N-Lock + 0x11, 0x44, 0x77, 0x09, + 0x09, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, + 0x0D, // length of IMSI U-Lock + 0x22, 0x66, 0x22, 0x00, // IMSI range definition U-Lock + 0x11, 0x44, 0x77, 0x09, + 0x09, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, + 0x00, 0x00 // Group Identifier +}; + +static const UBYTE sim_lock_table_5 [] = +{ + // + // one lock enabled, wrong IMSI ok + // + 0x01, 0x00, // locks + 0x00, // unblock counter + 0x0F, // maximum attempt + 0x21, 0x43, 0x65, 0x87, // P control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // N control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // NS control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // SP control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x21, 0x43, 0x65, 0x87, // C control key + 0xFF, 0xFF, 0xFF, 0xFF, + 0x0D, // length of IMSI + 0x22, 0x00, 0x22, 0x00, // IMSI range definition + 0x11, 0x44, 0x77, 0x09, + 0x09, 0x09, 0x09, 0x09, + 0x09, 0x09, 0x09, + 0x00, 0x00 // Group Identifier +}; + +#endif + +static UBYTE sim_get_sim_lock (EF_SIMLCKEXT * simlck) +{ + UBYTE version; + UBYTE sim_lock_type = 0; + + TRACE_FUNCTION("sim_get_sim_lock()"); + +#if defined (WIN32) + version = 0; + + switch (sim_lock_mode) + { + case 1: + memcpy (simlck, sim_lock_table_1, SIZE_EF_SIMLCK); + sim_lock_field = 1; + sim_fill_sim_lock (simlck); + break; + case 2: + memcpy (simlck, sim_lock_table_2, SIZE_EF_SIMLCK); + sim_lock_field = 1; + sim_fill_sim_lock (simlck); + break; + case 3: + memcpy (simlck, sim_lock_table_3, SIZE_EF_SIMLCKEXT); + sim_lock_field = 2; + break; + case 4: + memcpy (simlck, sim_lock_table_4, SIZE_EF_SIMLCKEXT); + sim_lock_field = 2; + break; + case 5: + memcpy (simlck, sim_lock_table_5, SIZE_EF_SIMLCKEXT); + sim_lock_field = 1; + break; + default: + memset (simlck, 0, SIZE_EF_SIMLCKEXT); + sim_lock_field = 2; + break; + } + return PCM_OK; +#else + + if (sim_lock_field EQ NOT_PRESENT_8BIT) + { + if (pcm_ReadFile((UBYTE *) EF_SIMLCK_ID, + SIZE_EF_SIMLCK, + (UBYTE *) simlck, + &version) EQ PCM_OK) + { + sim_lock_field = 1; + sim_fill_sim_lock (simlck); + return PCM_OK; + } + if (pcm_ReadFile((UBYTE *) EF_SIMLCKEXT_ID, + SIZE_EF_SIMLCKEXT, + (UBYTE *) simlck, + &version) EQ PCM_OK) + { + sim_lock_field = 2; + return PCM_OK; + } + return PCM_NVRAM_ACCS_FAIL; + } + + if (sim_lock_field EQ 1) + { + if (pcm_ReadFile((UBYTE *) EF_SIMLCK_ID, + SIZE_EF_SIMLCK, + (UBYTE *) simlck, + &version) EQ PCM_OK) + { + sim_fill_sim_lock (simlck); + return PCM_OK; + } + } + + if (sim_lock_field EQ 2) + { + if (pcm_ReadFile((UBYTE *) EF_SIMLCKEXT_ID, + SIZE_EF_SIMLCKEXT, + (UBYTE *) simlck, + &version) EQ PCM_OK) + { + return PCM_OK; + } + } + return PCM_NVRAM_ACCS_FAIL; +#endif +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_get_sim_lock | ++--------------------------------------------------------------------+ + + PURPOSE : Reads the SIM LOCK Record content from PCM + +*/ + +static void sim_set_sim_lock (EF_SIMLCKEXT * simlck) +{ + TRACE_FUNCTION("sim_set_sim_lock()"); + + if (sim_lock_field EQ 1) + { + /* + * set GDL1 and 2 on the expected location + * => len_sp_imsi = gdl1, sp_imsi[0] = gdl2 + */ + simlck->len_sp_imsi = simlck->gidl1; + simlck->sp_imsi [0] = simlck->gidl2; + pcm_WriteFile((UBYTE *) EF_SIMLCK_ID,SIZE_EF_SIMLCK, + (UBYTE *) simlck); + } + else + pcm_WriteFile((UBYTE *) EF_SIMLCKEXT_ID,SIZE_EF_SIMLCKEXT, + (UBYTE *) simlck); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_fill_sim_lock | ++--------------------------------------------------------------------+ + + PURPOSE : Fills the extended SIM Lock record with defaults if + only the simple SIM Lock Record is available. + +*/ + +static void sim_fill_sim_lock (EF_SIMLCKEXT * simlck) +{ + TRACE_FUNCTION("sim_fill_sim_lock()"); + + if (sim_lock_field EQ 1) + { + /* + * PCM contains SIMLOCK record. Must be mapped to the internal + * used SIMLOCKEXT record. + * + * gidl1, gidl2 to the end of record: + */ + simlck->gidl1 = simlck->len_sp_imsi; + simlck->gidl2 = simlck->sp_imsi [0]; + /* + * IMSI must be copied for the other locks + * N-Lock digits 1..5, rest filled with 0x09 to suppress compare + * SP-Lock digits 1..5, rest filled with 0x09 to suppress compare + * NS-Lock digits 1..7, rest filled with 0x09 to suppress compare + * C-Lock digits 1..5, rest filled with 0x09 to suppress compare + */ + memset (simlck->n_imsi, 0x09, 15); + memcpy (simlck->n_imsi, simlck->p_imsi, 5); + simlck->len_n_imsi = 5; + memset (simlck->sp_imsi, 0x09, 15); + memcpy (simlck->sp_imsi, simlck->p_imsi, 5); + simlck->len_ns_imsi = 5; + memset (simlck->ns_imsi, 0x09, 15); + memcpy (simlck->ns_imsi, simlck->p_imsi, 7); + simlck->len_ns_imsi = 7; + memset (simlck->c_imsi, 0x09, 15); + memcpy (simlck->c_imsi, simlck->p_imsi, 5); + simlck->len_c_imsi = 5; + /* + * initialise unblock imsi so that it never will fit + */ + simlck->len_u_imsi = 0; + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_check_unblock_sim | ++--------------------------------------------------------------------+ + + PURPOSE : Checks the IMSI against a stored unblock SIM. If the + check is positive, the unlock attempt counter will + be resetted. + +*/ + +static void sim_check_unblock_sim (EF_SIMLCKEXT * simlck) +{ + UBYTE i; + + TRACE_FUNCTION("sim_check_unblock_sim()"); + + if (sim_get_sim_lock (simlck) EQ PCM_OK) + { + if (simlck->len_u_imsi EQ 0) + return; + + /* + * check all digits */ + for (i=0; i<simlck->len_u_imsi; i++) + { + if (sim_check_imsi_digit(simlck->u_imsi[i], mfw_IMSI[i]) EQ FALSE) + break; + } + + /* + * all digits okay, then reset counter and nothing else + */ + if (i EQ simlck->len_u_imsi) + { + simlck->cnt = 0; + sim_set_sim_lock (simlck); + } + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_simlock_ok | ++--------------------------------------------------------------------+ + + PURPOSE : The function checks whether the SIM LOCK is active or not. + +*/ + +UBYTE sim_simlock_ok (void) +{ + if (sim_nslock EQ SIMLOCK_BLOCKED OR + sim_nslock EQ SIMLOCK_LOCKED) + return FALSE; + + if (sim_plock EQ SIMLOCK_BLOCKED OR + sim_plock EQ SIMLOCK_LOCKED) + return FALSE; + + if (sim_splock EQ SIMLOCK_BLOCKED OR + sim_splock EQ SIMLOCK_LOCKED) + return FALSE; + + if (sim_nlock EQ SIMLOCK_BLOCKED OR + sim_nlock EQ SIMLOCK_LOCKED) + return FALSE; + + if (sim_clock EQ SIMLOCK_BLOCKED OR + sim_clock EQ SIMLOCK_LOCKED) + return FALSE; + + return TRUE; +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_get_imsi | ++--------------------------------------------------------------------+ + + PURPOSE : Request IMSI number in SIM card + +*/ + +UBYTE * sim_get_imsi (void) +{ + return mfw_IMSI; +} + +/* ++---------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_mmi_update_parameter | ++---------------------------------------------------------------------+ + + PURPOSE : MMI relevant parameters from the SIM card + +*/ + +void sim_mmi_update_parameter(T_SIM_ACTIVATE_IND *sim_act_ind) +{ + TRACE_FUNCTION("sim_mmi_update_parameter()"); + + memcpy( sim_config.pref_lang, sim_act_ind->pref_lang, 5); +} + +#ifdef SIM_TOOLKIT +/* ++---------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_sat_file_update | ++---------------------------------------------------------------------+ + + PURPOSE : SIM file change indication + +*/ + +void sim_sat_file_update(USHORT dataId) +{ + TRACE_FUNCTION("sim_sat_file_update()"); + + sat_update = TRUE; + switch (dataId) + { + case SIM_SST: + sim_read_sim(SIM_SST, NOT_PRESENT_8BIT, 10); + break; + case SIM_GID1: + sim_read_sim(SIM_GID1, NOT_PRESENT_8BIT, 5); + break; + case SIM_GID2: + sim_read_sim(SIM_GID2, NOT_PRESENT_8BIT, 5); + break; + default: + break; + } +} +#endif + +/* ++---------------------------------------------------------------------+ +| PROJECT : MMI-Framework (8417) MODULE : MFW_SIM | +| STATE : code ROUTINE : sim_read_sst_cnf | ++---------------------------------------------------------------------+ + + PURPOSE : SIM file change indication + +*/ + +void sim_read_sst_cnf (SHORT error, UBYTE *data) +{ + TRACE_FUNCTION("sim_read_sst_cnf()"); + + if (error EQ SIM_NO_ERROR) + memcpy(sim_service_table, data, sizeof(sim_service_table)); + else + TRACE_EVENT("SST read error"); + +#ifdef SIM_TOOLKIT + if (sat_update) + { + sat_update = FALSE; + satUpdateFiles ( TRUE, SIM_SST ); + } +#endif +}