文章目录
一、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()


7859

被折叠的 条评论
为什么被折叠?



