版权声明:本文为博主原创文章,转载请附上原文出处链接和本声明

#指纹支付相关的细节处理(以QSEE为例)#

##一. AuthToken 处理##

###1.AuthToken 格式及定义(CA侧要跟TA侧相同)###

 typedef struct __attribute__((__packed__)) {uint8_t version;  // Current version is 0uint64_t challenge;uint64_t user_id;             // secure user ID, not Android user IDuint64_t authenticator_id;    // secure authenticator IDuint32_t authenticator_type;  // hw_authenticator_type_t, in network orderuint64_t timestamp;           // in network orderuint8_t hmac[32];}   hw_auth_token_t;Version :此token的版本号Challenge:就是前面调用preEnroll的到的64位随机数,防止此次enroll被第三方假冒User SID : 安全性id,不是android user idAthenticator ID: 用于标明不同的认证权限Authenticator Type:0x00表示Gatekeeper,0x01表示FingerprintTimestamp:最近一次开机时间戳AuthToken HMAC key: 用一个特殊的key和SHA-256算法去计算前面一堆参数后,得到的一个 hmac值,保证前面参数的合法性和安全性。

###2.从Keymaster TA 与Auth Token key###

  1. Fingerprint HAL Open时,Fingerprint HAL(以后简称HAL)向Keymaster发送KEYMASTER_GET_AUTH_TOKEN_KEY 命令,并得到返回的加密key。

  2. HAL向指纹TA(以后简称TA)发送命令,以内存数据共享方式,向TA传输从Keymater 获取到的加密key.

  3. TA 使用**qsee_decapsulate_inter_app_message()**方法,通过加密key 来获取Keymaster TA的解密key

  4. TA在authenticate时候,自己创建Token 并调用QSEE的qsee_hmac()方法,使用QSEE_HMAC_SHA256 类型算法来加密token ,并共享给其他TA (Keymaster TA,Gatekeeper TA ,还有bio TA)

     retval = QSEEcom_start_app(&keymaster_handle,OXI_KEYMASTER_APP_PATH,OXI_KEYMASTER_APP_NAME,shared_buffer_zise);km_get_auth_token_req_t* command = (km_get_auth_token_req_t*)keymaster_handle->ion_sbuffer;uint32_t command_length = QSEECOM_ALIGN(sizeof(km_get_auth_token_req_t*));km_get_auth_token_rsp_t* response = (km_get_auth_token_rsp_t*)(keymaster_handle->ion_sbuffer+command_length);command->cmd_id = KEYMASTER_GET_AUTH_TOKEN_KEY;command->auth_type = HW_AUTH_FINGERPRINT;uint32_t response_length = shared_buffer_zise-command_length;retval = QSEEcom_send_cmd(keymaster_handle,command,command_length,response,response_length);
    

###二. Fingerprint HAL 跟Fingerprint TA 细节处理###
####1.pre_enroll()方法:####

TA侧创建challenge并保存,TA把此challenge回传给HAL,在pre_enroll 方法里面,直接return 这个challeng值

####2.enroll(…,const hw_auth_token_t *hat,…)方法:####

enroll 的时候,系统会传一个token给Fingerprint HAL,HAL层需要把此token传给TA侧,TA做如下相关处理:

1).TA侧会对token里面的challenge跟在pre_enroll时候,TA保存的challenge 的值做对比。

2).TA侧会,根据从keymaster TA得到的加密key,用qsee_hmac()方法,使用QSEE_HMAC_SHA256类型的HMAC 加密,比较两个hmac 数组内容是否一致,
如果不一致,则中断enroll进程,直接return掉。

//核对传递下来的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.user_id问题:####

user_id是在enroll的时候系统传给fingerprint HAL层的,HAL层需要把这个值传到fingerprint TA中与指纹模板进行绑定,enroll时候系统传进来的user_id
是多少,则authenticate 成功后回传给系统的user_id就应该是多少

1).user_id 在 enroll 完成后生成指纹模板时,与指纹模板绑定。
2)在指纹匹配成功后,获取user_id,把此值赋值给TA创建的Token中的user_id元素。

3).TA会对Token 进行HMA 算法加密。

4).TA会把包含user_id 的Token 传给fingerprint Hal,由Hal 回调给系统。

####4.authenticator_id问题:####

在enroll 成功完成之后,需要根据生成指纹模板的数据库id 来生成authenticator_id,此来生成authenticator_id 会在两个地方使用;

1).此值需要回传给fingerprint Hal,在get_authenticator_id()方法里面,直接返回。

2).在指纹匹配成功后,在TA创建Token,把此值赋值给Token中的authenticator_id元素。

3).TA会对Token 进行HMA 算法加密。

4).TA会把包含authenticator_id 的Token 传给fingerprint Hal,由Hal 回调给系统。

####5.operation_id问题:####

这个值很重要,因为支付的bio接口会用到此值,使用步骤如下:

1).authenticate(…, uint64_t operation_id,…)的时候,系统会把这个值传递给fingerprint HAL, Hal 层需要传递此值到fingerprint TA;

2).在指纹匹配成功后,在TA创建Token,把此值赋值给Token中的challenge元素。

3).TA会对Token 进行HMAC算法加密

4)调用bio接口set_auth_result(),把此operation_id 传给bio 接口。

    int32_t set_auth_result(boolean result, uint64_t finger_id, uint64_t operation_id)
{int32_t status = 0;bio_result bio_res;BIO_ERROR_CODE bio_err;bio_res.method = BIO_FINGERPRINT_MATCHING;bio_res.result = result;bio_res.user_id = BIO_NA;if (bio_res.result) {bio_res.user_entity_id = finger_id;bio_res.transaction_id = operation_id;//session_id} else {bio_res.user_entity_id = BIO_NA;bio_res.transaction_id = BIO_NA;}if ((bio_err = bio_set_auth_result(&bio_res, NULL)) != BIO_NO_ERROR) {status = -1;}return status;
}

###三. 支付宝、微信支付###

支付这块,需要实现两个接口,一个是指纹list接口,一个是匹配成功的接口。

1).指纹list 接口,需要在初始化,指纹模板 增、更新、删除的时候调用,具体需要参照代码

2).匹配成功的接口(上面的set_auth_result就是),需要在指纹匹配成功之后,在TA进行Token HMAC 加密之后调用

这个两个接口最终都是调用bio API 的bio_set_auth_result() 方法。我们指纹厂商,只需要实现前面的细节,跟上面两个接口即可,剩下的都是平台,TEE 还有支付厂商的事情。

参考:auth token 这里请参考google官方说明

指纹支付相关的细节处理相关推荐

  1. 这两款明星手机的指纹支付功能,为什么被支付宝微信紧急叫停

    号称最先进最安全的屏下指纹识别技术翻车了. 一对英国夫妇给三星S10手机套上硅胶套后,发现任何人的指纹都能轻易解锁手机,甚至可以用指纹登录到银行APP. 随后,三星官方承认S10和Note 10两款手 ...

  2. 微信支付宝关闭三星Galaxy指纹支付;乐视网回应贾跃亭破产;Chrome 78发布|极客头条...

    快来收听极客头条音频版吧,智能播报由标贝科技提供技术支持. 「CSDN 极客头条」,是从 CSDN 网站延伸至官方微信公众号的特别栏目,专注于一天业界事报道.风里雨里,我们将每天为朋友们,播报最新鲜有 ...

  3. Android指纹支付 - android M / P 全适配

    前言 先说一下为什么会发布出这个库吧.很多没做过指纹相关功能肯定和我一开始一样认为:指纹支付很简单官方封装好的Api调用一下就好了,熟悉几个Api的事情.但是呢,这只是识别指纹,真正的指纹识别应用设计 ...

  4. 移动支付模式再添新军:指纹支付

    "手指一伸,就能购买电影票.买衣服,吃饭结账",或许指纹支付很快就会来到我们身边.作为国内唯一一家持有指纹支付牌照的公司,上海点佰趣公司宣布,今年将把指纹支付业务向北京等地推广.这 ...

  5. 如何利用 SOTER ,1 个版本内完成指纹支付开发?

    转自:https://cloud.tencent.com/developer/article/1005987 作者简介 : Henryye,叶轩,来自腾讯微信事业群,主要负责腾讯开源项目TENCENT ...

  6. 安卓指纹支付(指纹识别)

    笔记: 大概流程:(页面弹窗仿支付宝) 开启指纹支付:点击开关按钮,先检索手机里面指纹系统有没有指纹,没有则跳转到手机设置手动去录入指纹,录入完成返回,验证指纹通过后,输入正确的支付密码,则开启指纹支 ...

  7. 指纹支付 android 9,华为G9青春版怎么设置指纹功能? 华为G9指纹支付解锁的教程...

    华为G9青春版设置指纹解锁,指纹触控,指纹支付,指纹进入扫码支付等功能. 一.指纹解锁屏幕 相信各位G9青春版玩家早已用起了指纹解锁吧,只需简单设置,轻松使用指纹解锁屏幕,妈妈再也不用担心我忘记密码啦 ...

  8. 项目总结24:海关179号(实时获取电商平台企业支付相关原始数据)开发流程和相关资料...

    项目总结24:海关179号(实时获取跨境电子商务平台企业支付相关原始数据接入)开发流程和相关资料 欢迎大家留言探讨 1.致谢 感谢:https://blog.csdn.net/ccbox_net/ar ...

  9. 华为电脑linux系统怎么设置指纹,华为M3平板怎么设置指纹支付/登陆?

    指纹识别到底是前置好还是后置好?导航功能键是实体键还是虚拟键好?曾经纠结过这些问题的人应该不在少数吧?如果这两个功能都变成同一个按键,是否还有讨论的必要呢?于是这个话题的终结者现身了--华为平板M3, ...

最新文章

  1. 1035 插入与归并
  2. ASP.NET通过递归添加树(Treeview)
  3. python【数据结构与算法】二分模板
  4. 【Eclipse 插件】JD-Eclipse
  5. Ubuntu安装源安装nodejs
  6. python supper_python supper()函数
  7. 最会数据分析的护士!全世界最有名的白衣天使是如何走上可视化之路的?
  8. mybaits延迟加载原理_Nginx缓存原理及机制
  9. python权威指南 pdf_Ansible权威指南pdf txt mobi下载及读书笔记
  10. PL/SQL程序设计(七)—— 触发器
  11. C++基础教程之类与对象
  12. 广播BroadcastReceiver(2)
  13. 移动端拖拽(模块化开发,触摸事件,webpack)
  14. spring cloud 搭建问题记录
  15. 新萝卜家园 ghost xp3 2013 5月纯净版
  16. 关于导出聊天记录这件事……
  17. Pandas 筛选数据的 8 个神操作
  18. Visio2019安装教程(与正版office同时使用)
  19. 5G网络普及提速,你身边的这些行业已经站上了风口
  20. 想成为精英,你的时间颗粒度够细吗?

热门文章

  1. mean shift应用_使用Google地图制作MEAN应用(第二部分)
  2. mysql三m架构为什么_AnalyticDB for MySQL 3.0 技术架构解析
  3. 【转】定员108的车厢号码分布图
  4. 轻松bypass360网站卫士WAFSQL注入防护
  5. 在ABAQUS中使用多孔介质模型
  6. 模型优化与tensorflow
  7. HTML是一种标识语音,HTML实现网页端语音输入(语音识别,语义理解,olami)
  8. 360云盘丢失资料,官方承诺的永不删除丢失和绝对保密纯属忽悠
  9. VM8 asdebug.js:1 GET http://192.168.1.106:7101/GOODS/G-F-Kill net::ERR_CONNECTION_REFUSED
  10. 软件开发中,站立会议的必要性