Qualcomm Simlock——启动检测流程

来源:互联网 发布:mac删除应用程序还在 编辑:程序博客网 时间:2024/05/21 10:55

Simlock功能

simlock功能介绍

SIMLOCK功能的基本原理是通过私有加密算法把加密后的定制参数保存在手机存储中,通过校验存储在手机中的加密信息和SIM卡中的信息来实现手机的高级的保护。功能实现中SIMLOCK进程需要查询存储在SIM中的IMSIGID1GID2相关信息,利用这些信息来实现不同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号。


        
原创粉丝点击