Qualcomm Simlock——启动检测流程
Simlock功能
simlock功能介绍
SIMLOCK功能的基本原理是通过私有加密算法,把加密后的定制参数保存在手机存储中,通过校验存储在手机中的加密信息和SIM卡中的信息来实现手机的高级的保护。功能实现中SIMLOCK进程需要查询存储在SIM卡中的IMSI、GID1、GID2相关信息,利用这些信息来实现不同SIMLOCK功能等级,达到限制不同运营商、地区等方案。
Sim卡参数
IMSI由以下4部分组成:
1) 移动国家码(the MobileCountry Code, MCC),标识移动用户所属国家代号,占3位数字;
2) 移动网络码(the Mobile NetworkCode,MNC),由2或3位数字组成,用于识别移动用户所归属的移动通信网;
3) 归属位置寄存器(the HomeLocation Register,HLR),标识SP;
4) 移动用户识别号(the MobileSubscriber Identification Number,MSIN),用以识别移动通信网中的移动用户;
GID1和GID2是存储在SIM卡中可选EF。包含了SIM和移动设备的联合识别标识符,用作辨别SIM是否能在规定的用户群里面使用。
SIMLOCK结构体
该结构体是simlock部分的重要结构体,整个逻辑会根据结构体中的变量来控制算法类型以及加密策略和simlock的种类等,所以熟悉该结构体对后续的代码很有帮助
typedef struct{
uint8 salt[SALT_LEN];//SALT算法只生成一次,然后保存
uint8 hck[HCK_LEN];//HCK变量是用从SML分区读取参数和SALT算法运算后的值
}SML_CONFIG;
typedef struct{
uint32 magic;
uint32 vaild_flag;
uint8 reserved0[16];//保留,暂时没用
uint8 reserved1[16];
uint8 reserved2[16];
uint8 usbkey[32];//USB KEY,SML KEY,CK0,CK1
}PRI_DATA,QMI_PRI_REQ_RSP;
typedef struct{
QMI_PRI_REQ_RSP pri_req;//计算RSP整个参数运算校验结果,然后存储这些参数
uint8 config_hmac0[HMAC_LEN];//解析的时候再将参数运算一次,对比 QMI_PRI_REQ_RSP pri_req,然后确认数据是否完整,此变量保存结果
SML_CONFIG sml_config[2];//计算SML_CONFIG,原理同上
uint8 config_hmac1[HMAC_LEN];
}QMI_P_REQ;
typedef struct {
simlock_sfs_enum_type sfs_type;
simlock_device_mode_enum_type device_mode;
simlock_slot_policy_enum_type slot_policy;//锁卡策略,比如说,锁单卡,双卡,4G,3G等情况
simlock_subscription_policy_enum_type sub_policy;
simlock_category_status_type//锁卡算法种类,比如说SP算法,NS category_status[SIMLOCK_SLOT_COUNT_MAX][SIMLOCK_CATEGORY_COUNT_MAX];
} simlock_config_data_type;
typedef struct
{
simlock_category_header_data_type category_header;
uint32 code_data_length;
simlock_category_code_data_type * code_data_ptr;
} simlock_category_file_data_type;//QC种类说的是锁卡的算法,比如SP锁,NW锁等,一共是5种,在3GPP运算的函数中源码
typedef struct
{
simlock_category_enum_type category_type;
boolean auto_lock;
simlock_code_enum_type code_type;
uint32 num_retries_max;
uint32 curr_retries;
uint32 iteration_cnt;
simlock_salt_type salt;
simlock_hck_type hck;
uint8 num_of_codes;
} simlock_category_header_data_type;
SIMLOCK流程图
PS:由于Simlock流程涉及工厂流程、导key流程、开机流程、解锁流程、rebuild流程等,目前该文档主要讲解开机流程,其余流程后续会在另外文档补充:
simlock代码分析
modem端simlock代码大致分析如下:
1 simlock_init
simlock_status = simlock_config_check_dir(SIMLOCK_DIR_SAFE);//判断modem中 EFS文件目录是否存在
simlock_status = simlock_config_check_config_file();//判断config文件是否存在
simlock_status = simlock_file_check(simlock_sfs_config_file, &sfs_file_len);//判断simlock 配置文件
simlock_create_dir_and_default_config_file //创建EFS文件的路径(safe/sys/uim/simlock)和默认的配置文件
simlock_status = simlock_config_create_config_file();
simlock_init_fs();//如果首次启动或者是ST1/ST2擦除会重新构建simlock的配置和category文件和config文件
ret = jrd_secro_get_length_and_errorCode(&len, &errorCode);//获取security data长度
ret = jrd_secro_load(pPersoBuffer,len);// 从share memory中获取security data文件数据
simlock_perso_status = simlock_perso_parse_and_get_persoData(pPersoBuffer,uPolicyAndStatusDataFromPerso,uintCategoryDataFromPerso, CU);//解析数据\得到配置文件中的具体配置值(函数通过库提供,只能看到接口)
simlock_status = simlock_customize_setPolicy_msg() //根据解析出来的值设置policy
simlock_status = simlock_set_simlock_policy() //根据解析出来的值设置policy
simlock_status = simlock_config_update_and_write_policies(policy_msg_ptr, &config_file_data); //把policy update到simlock config文件中去
simlock_status =simlock_customize_lockCK_msg(customize_lockCK_msg_req_ptr,&CategoryDataFromPerso[uLoop]);//从解析出来的文件中配置 cateory锁相关的结构体
simlock_status = simlock_set_lock_ck(&customize_lockCK_msg_req_ptr->message.lock_ck_msg);//cateory锁相关的操作,将解析出来的数据最终配置到sfs文件系统中
2 simlock_run_algorithm //simlock的核心算法
simlock_status = simlock_config_read_config_data(&config_file_data);//读取sfs文件系统中的config 文件
simlock_3gpp_run_algorithm() //验证sim卡数据和config/cateory锁目录的数据是否匹配
simlock_3gpp_run_algorithm_nw
//锁mcc,mnc
simlock_3gpp_run_algorithm_ns
simlock_3gpp_run_algorithm_sp
simlock_3gpp_run_algorithm_cp //判断是哪种锁类型,进行相应的运算,判断卡是否有效
simlock_3gpp_run_algorithm_sim
simlock_3gpp_run_algorithm_spn
//锁mcc,mnc,gid1
simlock_3gpp_run_algorithm_iccid
以上五类会根据5种对应的锁卡策略来进行运算,如下:
1) Network(N),作用是限制ME使用特定的网络。N码(又叫PLMN)由MCC和MNC两部分组成。默认的MNC占用2位数,一个字节,也有特殊的情况是占用3位数;
2) NetworkSubset(NS),作用是限制ME使用指定供应商提供的SIM卡。NS码(又叫HLR),占用2位数,在IMSI中的第6,7位;
3) ServiceProvider(SP), 作用是网络服务商限制用户在ME上使用特殊服务,SP码被定义在GID1文件的第一个字节;
4) Corporate(C),作用是限制公司员工或客户使用定制的ME时不能使用其它的SIM卡。GID2文件的第一个字节定义了C码,C码也可以在GID2文件的第一个,第二个,第三个和第四个字节定义;
5) SIM(SIM),作用是运营商限制ME只能使用特定的SIM卡。SIM号在IMSI中的从第8位到第15位(或者是从第9位到第15位,当MNC是占3位的时候)。SIM码是由N号,NS号和SIM号组成的IMSI号。