Android Basis - Google Keybox

news2024/11/25 18:38:08

什么是Keybox

Keybox 又称为Gooogle attestation key,是Google用于管理、统计运行GMS套件设备的一种手段。

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

1. fingerprint 

2. 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.

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

  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]);
    // TEE
    bool 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;
    else
        return 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]);
        // SB
        bool 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;
        else
            return 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;
}

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

Keybox的相关原理

Google attestation key是如何工作的?

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

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

相关文章

(done) AFL 都有哪些阶段? Stage progress

参考资料&#xff1a;https://afl-1.readthedocs.io/en/latest/user_guide.html 所有阶段如下&#xff0c;包括详细的解释

下载lombok.jar包,简化类的代码

Download (projectlombok.org) 去这个网站下载lombok.jar包 打开这个包文件的位置,拖到项目lib文件夹: 在这里右键添加为库(Add as library)。 添加这三个注解即可&#xff0c;类里面不需要其他东西了

基于Python的垃圾分类检测识别系统(Yolo4网络)【W8】

简介&#xff1a; 垃圾分类检测识别系统旨在利用深度学习和计算机视觉技术&#xff0c;实现对不同类别垃圾的自动识别和分类。应用环境包括Python编程语言、主流深度学习框架如TensorFlow或PyTorch&#xff0c;以及图像处理库OpenCV等&#xff0c;通过这些工具集成和优化模型&a…

物联网技术-第3章物联网感知技术-3.3传感技术

目录 1.1什么是传感器 1.1.1生活中的传感器 1.1.2人的五官与传感器 1.1.3传感器的定义 1.1.4传感器的组成 1.2传感器的特性 1.2.1传感器的静态特征 1、灵敏度&#xff08;静态灵敏度&#xff09; 2.精度 3.线性度&#xff08;非线性误差&#xff09; 4.最小检测量&a…

UITableView初识之分组显示数据Demo

基本介绍 继承自UIScrollView&#xff0c;因此可以滚动。 需要Datasource 遵循UITableViewDataSource协议的OC对象&#xff0c;都可以是UITableView的数据源&#xff0c;该协议中的方法告诉UITableView如何显示数据。 关于UITableView UITableView显示分组数据&#xff0c;对应…

【Android】使用SeekBar控制数据的滚动

项目需求 有一个文本数据比较长&#xff0c;需要在文本右侧加一个SeekBar&#xff0c;然后根据SeekBar的上下滚动来控制文本的滚动。 项目实现 我们使用TextView来显示文本&#xff0c;但是文本比较长的话&#xff0c;需要在TextView外面套一个ScrollView&#xff0c;但是我…

【 ARMv8/ARMv9 硬件加速系列 3.5.1 -- SVE 谓词寄存器有多少位?】

文章目录 SVE 谓词寄存器(predicate registers)简介SVE 谓词寄存器的位数SVE 谓词寄存器对向量寄存器的控制SVE 谓词寄存器位数计算SVE 谓词寄存器小结SVE 谓词寄存器(predicate registers)简介 ARMv9的Scalable Vector Extension (SVE) 引入了谓词寄存器(Predicate Register…

美团Meitu前端一面,期望27K

面经哥只做互联网社招面试经历分享&#xff0c;关注我&#xff0c;每日推送精选面经&#xff0c;面试前&#xff0c;先找面经哥 1、做的主要是什么项目&#xff0c;桌面端的吗&#xff1f; 2、用的主要是什么技术栈&#xff1f;vue有了解吗&#xff1f; 3、移动端开发一般怎么…

Tuxera NTFS与Paragon NTFS:两款NTFS驱动软件的深度对比 tuxera和paragon NTFS哪个好

在Mac上使用NTFS格式的磁盘&#xff0c;通常需要借助第三方的驱动软件。其中&#xff0c;Tuxera NTFS和Paragon NTFS是两款备受欢迎的选择。虽然它们的基本功能相似&#xff0c;但在细节和使用体验上却有所不同。本文将带你深入了解这两款软件的差异&#xff0c;帮助你做出更明…

三极管原理介绍

三极管 不同封装 基本定义 三极管&#xff0c;全称应为半导体三极管&#xff0c;也称双极型晶体管(BJT)、晶体三极管&#xff0c;是一种控制电流的半导体器件。其作用是把微弱信号放大成幅度值较大的电信号&#xff0c;也用作无触点开关。 三极管是半导体基本元器件之一&…

数据资产驱动的智能化决策:深度剖析数据资产在提升企业决策效率与准确性中的关键作用

在数字化、信息化日益普及的今天&#xff0c;数据已经成为企业发展的重要资产。数据资产不仅能够帮助企业更好地了解市场需求、优化业务流程&#xff0c;还能在决策过程中提供科学、精准的支持。本文将深入剖析数据资产在提升企业决策效率与准确性中的关键作用&#xff0c;探讨…

如何应对 CentOS 的停更?

文章目录 如何应对 CentOS 的停更&#xff1f;Linux发行版CentOS停更后&#xff0c;我们可选的替代品RHEL LinuxRocky Linux公有云 LinuxDebian 系 Linux 如何应对 CentOS 的停更&#xff1f; Linux发行版 Linux内核是开源的&#xff0c;任何人都可以获取源代码&#xff0c;进…

俄罗斯方块小游戏(附源码)

游戏展示 一.导包 import turtle import random 二.定义一个Block类 定义一个Block类&#xff0c;用于表示游戏中的方块&#xff0c;包含颜色和形状。 class Block:def __init__(self, color, tiles):self.color colorself.tiles tiles三.定义了7个不同的Block对象 定义了7…

全光万兆时代来临:信而泰如何推动F5G-A(50PONFTTR)技术发展

技术背景 F5G-A&#xff08;Fifth Generation Fixed Network-Advanced&#xff0c;第五代固定网络接入&#xff09;是固定网络技术的一次重大升级&#xff0c;代表了光纤网络技术的最新发展。F5G-A旨在提供更高的带宽、更低的延迟、更可靠的连接以及更广泛的应用场景。 F5G-A六…

Sunny v1.3.0 官方版 (简洁且漂亮截图应用)

前言 Sunny是一款漂亮又实用的“截图&钉图”的软件&#xff0c;亦支持“屏幕识图”和“OCR”的软件。 一、下载地址 下载链接&#xff1a;http://dygod/source 点击搜索&#xff1a;Sunny 二、安装步骤 1、解压后将Sunny.exe发送到桌面快捷方式 2、启动桌面图标 3、正…

相似性搜索揭秘:向量嵌入与机器学习应用

引言 在当今数据驱动的世界中&#xff0c;有效地检索和利用信息是一项关键挑战。在数据库、搜索引擎和众多应用程序中&#xff0c;寻找相似数据是一项基本操作。传统数据库中&#xff0c;基于固定数值标准的相似项搜索相对直接&#xff0c;通过查询语言即可实现&#xff0c;如…

每日一题——Python实现PAT甲级1144 The Missing Number(举一反三+思想解读+逐步优化)四千字好文

一个认为一切根源都是“自己不够强”的INTJ 个人主页&#xff1a;用哲学编程-CSDN博客专栏&#xff1a;每日一题——举一反三Python编程学习Python内置函数 Python-3.12.0文档解读 目录 我的写法 时间复杂度分析 空间复杂度分析 总体空间复杂度&#xff1a;O(N) 总结 我…

【Vue】——组件的注册与引用(二)

&#x1f4bb;博主现有专栏&#xff1a; C51单片机&#xff08;STC89C516&#xff09;&#xff0c;c语言&#xff0c;c&#xff0c;离散数学&#xff0c;算法设计与分析&#xff0c;数据结构&#xff0c;Python&#xff0c;Java基础&#xff0c;MySQL&#xff0c;linux&#xf…

软件加密的基本概念

软件加密作为信息安全领域的一项重要技术&#xff0c;随着数字化时代的到来&#xff0c;其重要性日益凸显。以下是关于软件加密的详细解析&#xff0c;旨在为读者提供全面且深入的了解。 一、软件加密的基本概念 软件加密&#xff0c;简而言之&#xff0c;就是在数据传输、存储…

在windows 台式机电脑部署GLM4大模型

参考这篇文章在windows笔记本电脑部署GLM4大模型_16g显卡本地部署glm4-CSDN博客 我的环境&#xff08;PC台式机电脑&#xff1a; 处理器 Intel(R) Core(TM) i9-14900K 3.20 GHz 机带 RAM 32.0 GB (31.8 GB 可用)、32G内存、NVIDIA RTX4080&#xff08;16G&#xff09;…