济南文明网,撑死,倾世皇妃 下载
enroll流程主要的工作是在hal层以下完成的。对于应用层和framwork层的流程就不做详细分析了。
点击设置中的添加指纹,setting就会调到fingerprintd的preenroll接口。preenroll会在指纹ta中生成并保存一个64位的随机数。这个随机数有两个用途:
返回给上层,用于填充enroll中的authenticated token challenge。
ta会用它对下次enroll做初步校验,保证enroll没有被第三方篡改。
1 、我们先看一下 fingerprint.h对enroll接口的定义:
int (*enroll)(struct fingerprint_device *dev, const hw_auth_token_t *hat, uint32_t gid, uint32_t timeout_sec);
1.1 、hw_auth_token_t:保证此次enroll的合法性,我们具体看一下android怎么定义此结构体的。
authtoken version :此token的版本号
challenge:就是前面调用preenroll的到的64位随机数,防止此次enroll被第三方假冒
user sid : 安全性id,不是android user id
athenticator id: 用于标明不同的认证权限
authenticator type:0x00表示gatekeeper,0x01表示fingerprint
timestamp:最近一次开机时间戳
authtoken hmac key: 用一个特殊的key和sha-256算法去计算前面一堆参数后,得到的一个 hmac值,保证前面参数的合法性和安全性。
1.2. gid:说明是哪个用户注册指纹(anroid支持多用户)。
1.3. timeout_sec:超时设置。
2、上层调用enroll接口,一直将上述参数传递到指纹ta中。ta拿到参数之后会先检查参数是否合法。我们看看ta是怎样检查的:
//核对传递下来的token->challenge与之前preenroll阶段保存的g_challenge是否相同 if (token && token->challenge == g_challenge) { g_user_id = token->user_id; } else { loge(log_tag "[%s] invalid or null auth token", __func__); } //检测token版本是否相同 if (token && token->version != cmd->data.enroll.system_auth_token_version) { loge(log_tag "[%s] invalid hat version code detected", __func__); err = error_invalid_hat_version; break; } //检测authenticator_type版本是否相同 if (token && (token->authenticator_type & gf_hw_auth_fingerprint)) { loge(log_tag "[%s] invalid challenge detected", __func__); err = error_invalid_challenge; break; } /*token中,除了hmac之外的数据取出来,然后拿这部分数据用key和相应加密算法生成hmac*/ cpl_memcpy(&hat, token, sizeof(gf_hw_auth_token_t)); cpl_memset(&(hat.hmac), 0, hmac_len); generate_hmac(&hat); /*比对新生成的hmac和之前上层传递下来token中自带的hmac是否相同,如果相同则认为没本次enroll合法,接下来ic就会切换到一种采图的工作模式*/ if (0 != cpl_memcmp(hat.hmac, token->hmac, hmac_len)) { loge(log_tag "[%s] token authenticate failed", __func__); err = error_untrusted_enroll; break; }
3、验证完参数合法之后,ta会将指纹ic切换到一种等待手指按下采图的工作模式。此时一旦手指按下,会进入中断处理函数,该函数主要的工作流程如下图:
从等待手指按下开始,到收到中断读取数据,送算法处理,然后保存图像数据为模板,上报注册进度等消息给上层,最后等待手指抬起。这个过程会一直循环,直到模板建立完成后上报注册完成消息给上层,enroll才算结束了。
4、因为读取数据,算法分析等过程都涉及ic厂商的商业机密,所以不能在此分享。
postenroll主要工作是更新一下ta中保存的challenge。
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Android studio 解决logcat无过滤工具栏的操作
Android Studio 恢复小窗口停靠模式(Docked Mode)
Android studio保存logcat日志到本地的操作
Android Studio快捷键生成TAG、Log.x日志输出介绍
网友评论