帮同学宣传一下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。