LockSettings
=============
`LockSettings `_
`VerifyCredentialResponse.java `_
User Credential
------------------
Pattern/PIN/Password 映射为 Credential,由 Gatekeeper 负责校验。
每个user还关联一个随机的64-bit user secure identifier (SID)。
user的SID参与AuthToken的运算。
Synthetic Password
--------------------
Synthetic Password 可以由 Gatekeeper + Keymaster 保护,也可以由 Weaver 保护。
User LockScreenCredential / Escrow Token 派生KEK,用于保护 Synthetic Password。
Keymaster 也生成一个KM Key保护Synthetic Password。
改User Credential,不改 Synthetic Password。
`SyntheticPasswordManager.java `_
当escrow token开启时,SP_E0_NAME, SP_P1_NAME 可协助恢复SyntheticPassword
SyntheticPassword = hash( P0 || P1 )
SyntheticPassword 可派生 disk enc key, keystore enc key, gatekeeper auth key, vendor auth secret 等。
Gatekeeper
-----------
Gatekeeper 主要用于校验 User Credential,并限制失败重试。
enroll 设置 password,计算得到password handle。
verify 基于 输入的password,重新计算 password handle,并与之前的值做比较。
初始化概要
-----------
随机生成 P0, P1。
::
Synthetic Password = hash(P0 || P1)
E0 = Encrypt(Synthetic Password, P0)
存储 .p1, .e0 文件。
基于Synthetic Password,hmac-sha256分别派生三个子KEY: DiskEncryptionKey (用于FBE), KeystorePassword, GkPassword (用于Gatekeeper)。
user id + GkPassword 派生 spHandle,存储 .handle 文件。
Credential + scrypt 相关参数 + salt 用于派生 PasswordToken。
PasswordToken 结合 user id + 100000 = fakeUid,派生 PasswordHandle。注意PasswordHandle中还包含Gatekeeper随机生成的SID。
scrypt相关参数 + salt + PasswordHandle 记为 PasswordData,存储 `.pwd` 文件。注意, `` 随机值是以"sp-handle"存在数据库中。
随机生成16KB的 `.secdis` 文件。
将PasswordToken 与 secdis 的hash值拼接,得到applicationId。
使用applicationId的hash值,作为KEK,加密Synthetic Password,获得intermediate。再使用keystore中随机生成的km key,加密intermediate,获得blob,存储为`.spblob`文件。
校验概要
----------
先基于Credential,结合PasswordData信息,派生PasswordToken。再结合UserId,校验PasswordHandle。
基于PasswordToken,恢复applicationId。结合keystore,解密获得Synthetic Password。
基于Synthetic Password,校验spHandle。
使用Synthetic Password,解密CE Key => vold retrieveKey。
将CE Key install 到 keyring => vold installKey。可以只install hmac token,或者install TP加密CE KEY的密文。
SyntheticPasswordManager
--------------------------
`SyntheticPasswordManager.java `_
class AuthenticationToken
- private byte[] derivePassword(byte[] personalization) 新版用hmac-sha256,旧版用hash。
- static AuthenticationToken create() 生成 p0, p1、派生Synthetic Password、输出e0。
- public AuthenticationToken newSyntheticPasswordAndSid(IGateKeeperService gatekeeper, byte[] hash, LockscreenCredential credential, int userId)
class PasswordData
- public static PasswordData create(int passwordType) 初始化生成scrypt相关参数
weaver
- private VerifyCredentialResponse weaverVerify(int slot, byte[] key) 值比较
function
- public long createPasswordBasedSyntheticPassword(IGateKeeperService gatekeeper, LockscreenCredential credential, AuthenticationToken authToken, int userId) 如果weaver可用,把pwdToken存入weaver;否则,基于pwdToken派生pwdHandle,派生applicationId。此函数内的sid与pwdHandle有关。