Android Basis - Google Keybox

什么是Keybox

Android O 开始谷歌要求每台机器预制谷歌提供的 Attestion Key的需求,该需求要求,每台机器都预制谷歌提供的 key,因此需要 oem 厂商在工厂完成预制。没有预制该key 将直接导致机器 cts 相关测试项失败。Google attestation key的集合又称作为Google keybox。不同的attestation key通过DeviceID 来区分,在配置时选择不同的 DeviceID 可以进行不同的 attestion key 配置。Keybox包含若干组key, 每组key包含了ECDSA和RSA两种算法,KmInstallKeybox将每组key写入到手机的安全内存中,已知的地方有RPMB和Persist分区;
当Google GSM app或第三方APP需要使用key时,调用keymaster接口,使用该key进行签名、认证等

每条 Attestion key 由两条证书链组成,分别对应算法为 ECDSA和 RSA,证书链包括一个私钥和三级证书,以ECDSA算法为例,具体形式如下,其中有一个私钥和三组证书,具体内容如下:

通常我们会向Google申请keybox,结合可能得出货量,提供如下信息给到的Google。 

1. fingerprint : branch/deivce/product/user/build

2. device id 列表 : 这里的device id是一个临时定义的名称。

举个例子,我预计将要生产1KK的设备,并销往欧美。那么需要为10个device id申请keybox。由于单个device id的keybox可以生产并安装在100K的设备上,那么我们需要10个这样的device id。逻辑上讲,一种类型的设备,我为什么需要不同的device id?这里确实是个知识点,晚点提个google case 问一下。

Keybox内容

这里的DeviceID对应keybox中的DeviceID,通常就是对应key的名称。简单看一个我最新申请的keybox内容和简单的标注。

目前是单个Devcice ID可以在100K的设备上安装同一个keybox。那么n个Device ID也就是对应n*100K的设备。

Keybox 安装

KmInstallKeybox

由于使用的是QC code中自带的命令工具:KmInstallKeybox.

安装前提条件(RPMB 初始化)
在预制 attestion key 前需要保证 RPMB 已经初始化,否则 RPMB 无法使用会导致预制key 功能失效。

初始化 RPMB(手机连接电脑,确保 adb 可以使用)
adb root
adb shell

qseecom_sample_client smple64 v 14 1

一般情况下,安装步骤如下:

  1. adb root
  2. adb push keybox.xml data/
  3. adb shell LD_LIBIRARY_PATH=/vendor/lib64/hw KmInstallKeybox data/keybox.xml DeviceID false // 一共是5个参数,0,1,2,3,4

KminstallKeybox代码内容

using namespace keymasterdevice;
int main(int argc, char** argv) {if ((argc != 4) && (argc != 5) && (argc != 7) && (argc != 8)) {cout << "usage: LD_LIBRARY_PATH=/vendor/lib64/hw KmInstallKeybox Keybox_file Device_ID ""provision_device_ids(true/false)""Strongbox_Keybox_file Strongbox_Device_ID ""strongbox_provision_device_ids(true/false)"<< endl;cout << "e.g.,: LD_LIBRARY_PATH=/vendor/lib64/hw KmInstallKeybox keybox.xml ""mfgID_xxxx_0000 true""strongbox_keybox.xml strongbox_mfgID_xxxx_0000 true"<< endl;cout << "KmInstallKeybox will install the attestation""keys (both RSA and ECC) along with all the device identifiers\n""(brand, device, product, serial#, IMEI, MEID (if available), model""and manufacturer).\n""\n""The tool will use KM HAL API's to genrate RSA / ECC keys and\n""verify the attestation certificate signed with the provisioned keys.\n""If the validation is successful, the tool will set 'Provisioning Success'""to KM TA / KM Strongbox.\n""Else all the provisioned keys are deleted and it can be re-provisioned""\n""Once 'Provisioning Success' state is set in KM TA / Strongbox,\n""attestation keys / Device ID's cannot be re-provisioned\n""\n""\n""**RMA Use Case **\n""For RMA use case, OEM's can set the following devcfg parameter in ""'keymaster_oem_config.xml'\n""Please ensure to sign this debug devcfg with the serial# of the device as this ""will enable\n""re-provisioning of keys and if used incorrectly can open up the device to be ""re-provisioned.\n""<props name=\"allow_reprovision\" type=DALPROP_ATTR_TYPE_UINT32>\n""1""Strongbox provisioning is optional and is only supported on chipsets SPU/ ""strongbox is supported."<< endl;exit(-1);}std::string deviceId(argv[2]);// TEEbool provision_device_id = false;if (!memcmp(argv[3], "true", strlen("true")))provision_device_id = true;else if (!memcmp(argv[3], "false", strlen("false")))provision_device_id = false;elsereturn GENERIC_FAILURE;bool provision_only_device_id = false;if (argc==5 && !memcmp(argv[4], "rkp", strlen("rkp")))provision_only_device_id = true;else if (argc==8 && !memcmp(argv[7], "rkp", strlen("rkp")))provision_only_device_id = true;int ret = GENERIC_FAILURE;// This is required only for offtarget emulator, will be compiled out.SetUpOffTarget();KeymasterHalDevice device(KM_SECURITY_LEVEL_TRUSTED_ENVIRONMENT);SetUpOffTargetConfig(&device, 0, 0, 0);InstallKeybox installer(argv[1], deviceId, provision_device_id,KM_SECURITY_LEVEL_TRUSTED_ENVIRONMENT);PROV_EXIT(installer.ParseFile(provision_only_device_id));if (!provision_only_device_id)PROV_EXIT(installer.ValidateProvisionedKeys());cout << "TEE done" << endl;if (argc == 7 || argc == 8) {std::string deviceIdSb(argv[5]);// SBbool provision_device_sb_id = false;if (!memcmp(argv[6], "true", strlen("true")))provision_device_sb_id = true;else if (!memcmp(argv[6], "false", strlen("false")))provision_device_sb_id = false;elsereturn GENERIC_FAILURE;InstallKeybox installer_sb(argv[4], deviceIdSb, provision_device_sb_id,keymaster::KM_SECURITY_LEVEL_STRONGBOX);PROV_EXIT(installer_sb.ParseFile(false));PROV_EXIT(installer_sb.ValidateProvisionedKeys());}cout << "InstallKeybox is done!" << endl;return 0;
}

针对这个工具,其实我们也可以结合实际进行定制。

Attestation Key的相关使用

简单例子如下:

// 导入相关库
import android.hardware.biometrics.BiometricManager;
import android.security.KeyCharacteristics;
import android.security.keystore.KeyProperties;
import android.util.Base64;// ...
BiometricManager biometricManager = BiometricManager.from(context);
KeymasterArguments keygenArgs = new KeymasterArguments.Builder().setOperation(KeymasterOperation.KEY_GEN).setAlias("my_key").setLabels("application-specific", "encryption").setKeyProperties(new KeyProperties.Builder().setAlgorithm(KeyProperties.AES).setKeySize(256).setUserAuthenticationRequired(true).build()).build();// 请求用户输入密码
String password = getPasswordFromUser();// 执行密钥生成
try {KeymasterOperationResult result = KeymasterHelper.generateKey(context, keygenArgs, password);if (result.getResult()) {// 如果成功,获取并保存密钥byte[] key = result.getKey();String encryptedData = Base64.encodeToString(encryptData(key), Base64.DEFAULT);saveEncryptedDataToFile(encryptedData);} else {handleEncryptionError(result.getErrorCode());}
} catch (Exception e) {logError(e);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/32936.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring AI 介绍以及与 Spring Boot 项目整合

Spring AI 项目旨在简化使用 Spring Boot 开发包含人工智能功能的应用程序&#xff0c;提供抽象和支持多种模型提供商及矢量数据库提供商。 Spring AI 的功能特点 支持主流模型提供商&#xff1a;如 OpenAI、Microsoft、Amazon、Google 和 Huggingface 等。支持多种模型类型&a…

Retrieval-Augmented Generation for Large Language Models A Survey

Retrieval-Augmented Generation for Large Language Models: A Survey 文献综述 文章目录 Retrieval-Augmented Generation for Large Language Models: A Survey 文献综述 Abstract背景介绍 RAG概述原始RAG先进RAG预检索过程后检索过程 模块化RAGModules部分Patterns部分 RAG…

phpcms网站模板收费下载站素材图片网站源码

★模板介绍★ 本套源码&#xff0c;主要针对资源下载&#xff0c;素材/图片/模板/源码/插件/ 我们已经对源码进行了多处二次开发&#xff0c;对模板进行了深度优化&#xff0c;没有多余的无用代码。更符合收费下载站行业的标准&#xff0c;保证每位站长购买后多能直接用上&am…

Python | Leetcode Python题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; L 10 bin {A: 0, C: 1, G: 2, T: 3}class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n len(s)if n < L:return []ans []x 0for ch in s[:L - 1]:x (x << 2) | bin[ch]cnt defaultdict(int)for…

vue中用JSON格式查看数据(vue-json-viewer)

vue中把string用JSON格式展示数据 vue-json-viewer使用 官网地址&#xff1a;https://www.npmjs.com/package/vue-json-viewer 1. 安装插件vue-json-viewer //vue2 npm install vue-json-viewer2 --save //vue3 npm install vue-json-viewer3 --save2. 引入vue-json-viewer…

星闪指向遥控,做家电交互的破壁人

“面壁者罗辑&#xff0c;我是你的破壁人。” 科幻小说《三体》中&#xff0c;当人类的基础科学被三体人封锁&#xff0c;变得停步不前&#xff0c;人类启动了自救的面壁计划&#xff0c;通过一次又一次破壁&#xff0c;找到战胜三体人的办法。 现实中&#xff0c;有一点已经成…

Html去除a标签的默认样式

Html去除a标签的默认样式, a标签超链接字体默认蓝色带下划线; 去除可用: a{text-decoration:none;color:inherit;cursor:auto; }测试代码 <!DOCTYPE html> <html lang"zh-CN" dir"ltr"><head><meta charset"utf-8"/>&…

上海交大阿里巴巴推出虚拟试衣新里程碑式工作——AnyFit:任意场景、任意组合!

文章链接&#xff1a;https://arxiv.org/pdf/2405.18172 工程链接&#xff1a;https://colorful-liyu.github.io/anyfit-page/ 今天和大家一起学习的是一种名为AnyFit的新型虚拟试穿系统&#xff0c;旨在解决现有技术在处理不同场景和服饰组合时出现的衣物风格不匹配和质量下…

【MySQL】Linux中MySQL的使用及配置

一、字符集修改 1、MySQL8.0之前&#xff0c;字符集都默认是latin1&#xff0c;从MySQL8.0开始&#xff0c;字符集utf8mb4&#xff0c;这意味着&#xff0c;在默认情况下&#xff0c;MySQL8.0之前都是不支持中文的 # 查看字符集信息&#xff0c;主要是character_set_server和…

能正常执行但是 cion 标红/没有字段提示

ctrl q 退出 clion 找到工程根目录&#xff0c;删除隐藏文件 .idea 再重新打开 clion 标红消失&#xff0c;同时再次输入函数/类属性&#xff0c;出现字段提示 clion 的智能提示方案存储在 .idea 文件中&#xff0c;如果工程能够正常编译执行&#xff0c;那么说明是智能提示…

【JavaSE ⑧】P219 ~ 225 Date类‘’DateFormat类转化Date和字符串;Calendar类获得日历中某值,修改日历,日历转日期

目录 日期时间类1 Date类概述常用方法 2DateFormat类构造方法格式规则常用方法parse方法format方法 3 Calendar类概念获取方式常用方法get/set方法add方法getTime方法 ● 练习1.判断Date不同参数构造的输出2. 用日期时间相关的API&#xff0c;计算一个人已经出生了多少天。3. 获…

技术管理转型之战:解锁管理新境界——直觉决策的艺术与科学

文章目录 引言一、直觉决策的定义与特点二、直觉决策在管理中的价值三、直觉决策的来源1、潜意识的心里过程2、基于价值观或道德的决策3、基于经验的决策4、影响发动的决策5、基于认知的决策 四、如何培养直觉决策能力五、直觉决策的风险与应对结语 引言 在快速变化的商业环境…

[FreeRTOS 内部实现] 创建任务 xTaskCreate函数解析

文章目录 创建任务 xTaskCreate函数原型栈深度 usStackDepth 大小如何确定任务堆空间分配 任务控制块 TCB 创建任务 xTaskCreate函数原型 BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,const char * const pcName,const configSTACK_DEPTH_TYPE usStackDepth,void *…

JVM专题三:Java代码如何运行

通过前面的第一篇文章&#xff0c;对JVM整体脉络有了一个大概了解。第二篇文章我们通过对高级语言低级语言不同特性的探讨引出了Java的编译过程。有了前面的铺垫&#xff0c;咱们今天正式进入Java到底是如何运行起来的探讨。 目前大部分公司都是使用maven作为包管理工具&#x…

lvgl_micropython development for esp32

​​​​​​上一篇博客已经编译源码生成了ESP32C3的固件lvgl_micropy_ESP32_GENERIC_C3-4.bin&#xff0c;这篇博客开发一个界面。 一、开发环境 1、安装开发工具 Windows安装Thonny工具&#xff0c;官网链接&#xff1a;Thonny, Python IDE for beginners。 参考博客:用M…

游戏开发丨基于Tkinter的五子棋小游戏

文章目录 写在前面Tkinter五子棋系列文章写在后面 写在前面 本期内容&#xff1a;基于tkinter的五子棋小游戏 下载地址&#xff1a;https://download.csdn.net/download/m0_68111267/88700190 实验环境 python3.11及以上pycharmtkinter Tkinter Tkinter是Python的一个标准…

文件创建与查看

touch touch命令用于创建一个新的文件。 语法&#xff1a;touch Linux路径 其中路径可以是相对路径、绝对路径或者特殊路径符都可以。 改图展示了通过 touch test.txt 命令创建了一个 test.txt文件&#xff0c;其中深色的代表文件夹&#xff0c;白色的代表文件。 使用 ls -lh…

第一次接触Swing

学习java版的HslCommunication发现使用的是Swing&#xff0c;所以了解了一下~ 了解&#xff1a; Swing是Java的标准库&#xff08;Java Foundation Classes, JFC&#xff09;的一部分&#xff0c;用于构建桌面应用程序的图形用户界面&#xff08;GUI&#xff09;。它是Java AWT…

[每周一更]-(第102期):认识相机格式Exif

文章目录 EXIF数据包含的信息读取EXIF数据的工具和库EXIF数据读取示例&#xff08;Go语言&#xff09;想法参考 相机拍摄的照片&#xff0c;在照片展示行无水印信息&#xff0c;但是照片属性中会包含比较丰富的信息&#xff0c;相机品牌、型号、镜头信息等&#xff0c;这些我们…

基于SpringBoot+Vue大学毕业设计管理系统设计和实现(源码+LW+调试文档+讲解等)

&#x1f497;博主介绍&#xff1a;✌全网粉丝1W,CSDN作者、博客专家、全栈领域优质创作者&#xff0c;博客之星、平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌&#x1f497; &#x1f31f;文末获取源码数据库&#x1f31f; 感兴趣的可以先收藏起来&#xff0c;还…