FreeCalypso > hg > fc-magnetite
view src/aci2/mfw/mfw_sim.~c @ 350:84d81d34efa2
cfg-headers/fax-and-data: created
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 24 Dec 2017 23:13:24 +0000 |
parents | 93999a60b835 |
children |
line wrap: on
line source
/* +--------------------------------------------------------------------+ | 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 }