Android KeyStore流程

一、Keystore

keystore主要是对密钥库的控制操作,包括密钥的生成导入导出、加解密、签名验签、访问控制等。
概念的详细介绍就请看看google官网的介绍。本篇主要是想总结一下keystore的使用流程,貌似其他博客讲这个流程的不多,就整理一篇出来。

原创不易,转载请标明出处 https://blog.csdn.net/jackone12347/article/details/122252644

二、Keystore架构及接口函数

1. Keystore组件架构

keystore涉及到的模块之间的关系,一共有四个角色:

Andriod Keystore: 提供Android framework API,封装密钥库相关的接口;
Keystore:守护进程,通过Binder提供密钥库功能,通过AIDL与Framework keystore通讯;
HIDL Keymaster: HIDL进程,封装调用keymaster TA的密钥函数接口;如android.hardware.keymaster@xxx-xxx
KeyMaster TA: TEE中的TA,提供安全的密钥库操作和安全环境

架构图如下:
架构图

2. IKeymasterDevice.hal中的几个重要接口函数

需要看一下这几个相关的接口,HAL层的IKeymasterDevice.hal都有介绍,下面是我理解的几个,因为和接下来的章节中分析CTS问题是相关的。

2.1 begin函数

作用:使用指定的密钥开始加密操作。 如果一切顺利,begin() 必须返回 ErrorCode::OK 并创建一个操作句柄,该句柄必须传递给后续对 update()、finish() 或 abort() 的调用。
函数原型:

    begin(KeyPurpose purpose, vec<uint8_t> keyBlob, vec<KeyParameter> inParams,
          HardwareAuthToken authToken)
        generates (ErrorCode error, vec<KeyParameter> outParams, OperationHandle operationHandle);

2.2 update函数

作用:向正在进行的加密操作提供数据并可能从begin()接收输出。
函数原型:

    update(OperationHandle operationHandle, vec<KeyParameter> inParams, vec<uint8_t> input,
           HardwareAuthToken authToken, VerificationToken verificationToken)
        generates (ErrorCode error, uint32_t inputConsumed, vec<KeyParameter> outParams,
                   vec<uint8_t> output);

说明:
1、为了为缓冲区处理提供更大的灵活性,此方法的实现具有使用比提供的更少的数据的选项。
调用者负责循环到在后续调用中提供其余数据。 必须返回consumed的输入量在 inputConsumed 参数中。
实现必须始终至少消耗一个字节,除非operation不能再接受;

如果提供的字节多于0且0字节是消耗,调用者必须认为这是一个错误并中止操作

2、作为update的结果,实现还可以选择返回多少数据。 这仅与加密和解密操作相关,因为签名和验证在完成之前不会返回任何数据。 建议尽早返回数据,而不是缓冲它。

2.3 finish函数

作用:完成以 begin() 开始的加密操作并使 operationHandle 无效。此方法是操作中最后调用的方法,因此必须返回所有处理过的数据。
函数原型:

    finish(OperationHandle operationHandle, vec<KeyParameter> inParams, vec<uint8_t> input,
           vec<uint8_t> signature, HardwareAuthToken authToken, VerificationToken verificationToken)
        generates (ErrorCode error, vec<KeyParameter> outParams, vec<uint8_t> output);

2.4 abort函数

中止以 begin() 开始的加密操作,释放所有内部资源并使操作句柄无效。
函数原型:

abort(OperationHandle operationHandle) generates (ErrorCode error);

3. Keymaster TA

keymaster_operation_t结构体,TA中会反复用到这个结构体中的数据。

@ ta/include/operations.h
typedef struct {
   
   
        uint8_t key_id[TAG_LENGTH];
        keymaster_key_blob_t *key;
        keymaster_blob_t nonce;
        keymaster_blob_t last_block;
        keymaster_operation_handle_t op_handle;
        keymaster_purpose_t purpose;
        keymaster_padding_t padding;
        keymaster_block_mode_t mode;
        keymaster_blob_list_item_t *sf_item;/*sign/verify data*/
        TEE_Time *last_access;
        TEE_OperationHandle *operation;
        TEE_OperationHandle *digest_op;
        size_t prev_in_size;
        uint32_t min_sec;
        uint32_t mac_length;
        uint32_t digestLength;
        uint32_t a_data_length;
        uint8_t *a_data;
        bool do_auth;
        bool got_input;
        bool buffering;
        bool padded;
        bool first;
} keymaster_operation_t;

keymaster_blob_t结构体

typedef struct {
   
   
        uint8_t* data;
        size_t data_length;
} keymaster_blob_t;

4. 对称密码函数API

Cryptographic API调用流程

-   some_function()  
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值