| 帮同学宣传一下http://shop57644665.taobao.com/ |
Authentication
当MM在注册网络时,网络会发送Authentication的请求。这个请求是通过RR_DATA_IND(AUTHENTICATION REQUEST)发送给MM。在这个原语中带有从网络发送过来的Random Number (RAND)。MM会通过SIM_AUTHENTICATION_REQ这个原语将RAND发送给SIM。SIM会执行RUN GSM ALGORITHM.这个命令,根据得到的RAND计算出SRES 和Kc,然后通过SIM_AUTHENTICATION_CNF发送给MM。MM得到这些数据后会通过RR_DATA_REQ(AUTHENTICATION RESPONSE),RR_SYNC_REQ (ciphering parameters)发送给RR,然后传送给网络。网络会比较传送过来的SRES 和自己计算出来的SRES 来作为Authentication的依据。Kc会被ME端用作以后同网络进行enciphered。
SIM响应MM的SIM_AUTHENTICATION_REQ代码流程如下:
if (SIM_IS_FLAG_SET (GSM_DATAFIELD))
error = FKT_Select (SIM_DF_GSM, NULL, 0);
else
error = FKT_Select (SIM_DF_1800, NULL, 0);
//需要注意的是SIM在执行RUN GSM ALGORITHM时需要先选中DFGSM
if (error EQ SIM_NO_ERROR)
error = FKT_RunGSMAlgo (sim_authentication_req->rand, response, SIM_GSM_ALG_LEN);
////////////////////////////////////
// FKT_RunGSMAlgo这个函数的实现如下
sw1sw2 = SIM_RunGSMAlgo ((UBYTE *)response,
(UBYTE *)rand,
&size);
error = FKT_convert_error (sw1sw2, size);
if (error EQ SIM_NO_ERROR)
error = FKT_GetResponse (data, len);
return error;
// SIM_RunGSMAlgo函数就是直接封装SIM的COMMAND SIM_RUN_GSM_ALGO然后发送给SIM
///////////////////////////////////////////
PSENDX (MM, sim_authentication_cnf);
error = FKT_Select (SIM_KC, NULL, 0);
if (error EQ SIM_NO_ERROR)
{
kc_n.c_kc = MAX_KC_N;
FKT_UpdateBinary (kc_n.kc, (USHORT)kc_n.c_kc, 0);
}
//发送给MM后,会继续选中SIM_KC更新该EF。
















