📄 mfw_sim.~c
字号:
{
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -