介绍
Open Mobile API (OMAPI) 是用于与设备的安全元件通信的标准 API。在 Android 13 之前,只有应用程序和框架模块可以访问此接口。通过将其转换为供应商稳定接口,HAL 模块还能够通过 OMAPI 服务与安全元素进行通信。
在不修改当前现有接口中的任何 API 的情况下,为 HAL 模块添加了一个新的 OMAPI 访问入口。使用此接口的现有应用程序和框架模块无需修改。
作为Android Ready SE 计划的一部分,我们正在 Secure Elements 上提供 Keymaster、Keymint、Identity Credentials 和 Remote Key Provisioning 等核心 Android 安全功能。启用这些功能需要这些功能的 HAL(供应商组件)通过 OMAPI 供应商稳定接口与安全元件通信。
设计架构

将安全元件和 Android Ready SE 功能集成到其设备中的 OEM 需要启用此接口,因为它在默认情况下处于禁用状态。在此更新之前,安全元件访问规则由包名称或其签名哈希(设备应用程序参考)和 AID(SE 应用程序参考)定义。 HAL 模块没有像包名或签名证书这样的唯一标识符。现在在 Android 13 中,OMAPI 供应商稳定服务允许 HAL 模块访问安全元件。 SE 供应商可以定义一个 16 字节的唯一标识符 UUID。要将此访问规则应用于 HAL 模块,SE 供应商需要在其供应商 UUID 映射配置 XML 中将此 16 字节唯一标识符 UUID 映射到 HAL 模块 UID。
如有必要,OMAPI 供应商稳定服务用 FF 填充 UUID 使其成为 20 字节,根据第6.1 节,DeviceAppID-REF-DO 页面:66 ,并使用此 20 字节 UUID 作为设备应用程序参考定义安全元素中的访问规则。
供应商 UUID 映射文件名由预定义前缀hal_uuid_map_
组成,并附加系统属性ro.boot.product.hardware.sku
的值
hal_uuid_map_value_of_ro.boot.product.hardware.sku.xml
OMAPI Vendor Stable 服务在/odm/etc/
、 /vendor/etc/
和/etc/
文件夹下搜索此文件。此处提供了有关供应商 UUID 映射配置文件的详细说明。
执行
需要进行以下更改才能在目标构建上启用 OMAPI 供应商稳定服务功能。
安全元件
安全元件使用设备特定文件夹下的资源覆盖启用服务标志secure_element_vintf_enabled
。
<bool name="secure_element_vintf_enabled">true</bool>
为您的服务定义 UID 和 UUID 映射 xml。
<ref_do> <uuid_ref_do> <uids> <uid>0</uid> </uids> <uuid>9f36407ead0639fc966f14dde7970f68</uuid> </uuid_ref_do> <uuid_ref_do> <uids> <uid>1096</uid> <uid>1097</uid> </uids> <uuid>a9b7ba70783b317e9998dc4dd82eb3c5</uuid> </uuid_ref_do> </ref_do>
使用 UUID 作为设备应用程序引用为 HAL 服务提供安全元件 AR。在映射配置中添加一个映射条目,您可以在其中将此 UUID 映射到 HAL 模块 UID。通过此映射,供应商允许 HAL 模块访问安全元素。 OMAPI VTS 测试可用作在 HAL 模块中启用 OMAPI 供应商稳定服务的参考实现。
更新 HAL 模块 sepolicy:为 HAL 模块添加 sepolicy 规则,以允许其域访问 OMAPI 供应商稳定服务。
allow hal_module_label secure_element_service:service_manager find
连接到 OMAPI 供应商稳定服务:从 HAL 模块使用 OMAPI 供应商服务标签android.se.omapi.ISecureElementService/defaultandroid.se.omapi.ISecureElementService/default
连接到服务。
验证
通过运行OMAPI VTS 测试验证 OMAPI 供应商稳定服务是否已成功实施。
run vts -m VtsHalOmapiSeServiceV1_TargetTest run vts -m VtsHalOmapiSeAccessControlTestCases