锁卡新增需求设计文档
一、需求概述
1.实现SHA256加密算法
2.实现主副卡的切换,支持卡2为主卡时卡1与卡2关联
二、新旧锁卡方案的区别
1.实现SHA256加密算法
| 旧锁卡方案 | 新锁卡方案 |
加密算法 | MD5 | SHA256 |
解锁码位数 | 8 | 16 |
解锁码生成方式 | 手机固定的IMEI号经过MD5加密生成 | 随机生成的盐值经过SHA256加密生成 |
2. 实现主副卡的切换,支持卡2为主卡时卡1与卡2关联
| 旧锁卡方案 | 新锁卡方案 |
卡1为主卡 | 先弹卡1的解锁框,再弹卡2的解锁框 | 先弹卡1的解锁框,再弹卡2的解锁框 |
卡2为主卡 | 先弹卡1的解锁框,再弹卡2的解锁框 | 先弹卡2的解锁框,再弹卡1的解锁框 |
二、需求分析
1.支持16位解锁码
之前解锁码是根据手机的IMEI号通过MD5加密算法计算得出的。由于该算法是根据固定IMEI号计算得出的,安全性不高。按照客户要求升级加密算法,提高安全性。
16位解锁码是通过SHA256算法计算获得,详情流程如下:
其中:
1.盐值是根据时间随机生成的,通过工具写入到NVRAM
2.AP端在每次手机重启后均会通过AT指令获取盐值保存到临时数据库中
3.手机解锁成功后,modem端会修改NVRAM中锁卡的state标志位,使解锁成功后的手机可以正常识别卡。
2.主副卡切换
之前只支持双卡场景【双卡锁卡1,但是卡2关联卡1】(卡1默认为主卡)这种情况,由于Tango手机是支持主副卡切换的,因此也需要支持【卡2为主卡时,卡1关联卡2】(卡2为主卡)的情况。
这个功能需要modem层和AP层共同实现。其中APP层主要判断哪个卡为主卡,根据主卡来协调解锁框的弹出顺序,而关联的相关功能则由modem层实现。具体流程如下:
- 普通的双卡锁卡
先弹主卡的解锁框,再弹副卡的解锁框
- 合法关联
(1)若卡1为主卡,卡1卡2写入锁卡文件,此时卡1插入合法卡,则卡2不管是否插入合法卡均合法。
(2)若卡2为主卡,卡1卡2写入锁卡文件,此时卡2插入合法卡,则卡1不管是否插入合法卡均合法。
- 解锁关联
(1)若卡1为主卡,卡1卡2写入锁卡文件,
a.卡1插入非法卡,卡1解锁成功,则卡2不需要解锁,不会弹解锁框,卡1卡2均能识别卡。
b.卡1插入合法卡,则卡2弹解锁框需要解锁。
(2)若卡2为主卡,卡1卡2写入锁卡文件,
a.卡2插入非法卡,卡2解锁成功,则卡1不需要解锁,不会弹解锁框,卡1卡2均能识别卡。
b.卡2插入合法卡,则卡1弹解锁框需要解锁。
三、具体实现
1.支持16位解锁码
修改的文件主要包含:PhoneGlobals.java IccNetworkDepersonalizationPanel.java
- 通过AT指令获取当前手机的盐值(AT+QSMLE)
PhoneGlobals.java{
parseSIMLockInfoData(){…}//解析AT指令返回的字串,获取手机的盐值
}
- 实现SHA256算法
IccNetworkDepersonalizationPanel.java{
encryptSHA(){…}//根据输入的解锁码及盐值计算出对应的64位字串
getPWD(){…}//从生成的64位字串中过滤出最终16位解锁码
}
2.主副卡切换
修改的文件主要包含:PhoneGlobals.java
PhoneGlobals.java{
/*
- 先判断哪张卡是主卡SubscriptionManager.getDefaultDataSubId();
- 再判断上传的phoneID,根据主副卡选择优先出解锁框
*/
initIccPanel(){…}//初始化解锁框
}