- 一、基本文件操作流程
- 二、 可信存储GP API
- 2.1 `TEE_CreatePersistentObject`
- 2.2 `TEE_CloseAndDeletePersistentObject`
- 2.3 `TEE_OpenPersistentObject`
- 2.4 `TEE_ReadObjectData`
- 2.5 `TEE_WriteObjectData`
- 2.6 `TEE_SeekObjectData`
- 2.7 `TEE_InfoObjectData`
- 2.8 其它API描述
- 2.9 demo代码1 - 存储敏感数据
- 2.10 demo代码2 - 使用安全存储接口读写一个简单的文件
接上文:OP-TEE内核学习笔记(一)(安全存储)—— 密钥和文件结构
了解了以上基本概述后,我们接下来看一下详细的安全文件的基础操作,了解OPTEE是如何处理安全文件的数据的。
因为OPTEE中没有文件系统的功能,需要借助tee_supplicant守护进程来完成访问文件系统的工作。读写安全文件也是类似的过程,TA发送RPC请求给tee_supplicant,tee_supplicant完成参数的解析和数据操作。
一、基本文件操作流程当 TA 调用 GP 可信存储 API 提供的写入函数以将数据写入持久性对象时,将调用在 TEE 可信存储服务中实现的相应系统调用,而后者又会调用一系列 TEE 文件操作来存储数据。然后,TEE 文件系统将加密数据,并通过一系列 RPC 消息将 REE 文件操作命令和加密数据发送给 REE。REE将接收消息并相应地将加密数据存储到 Linux 文件系统。读取文件以类似的方式处理。架构图如图所示:
创建一个persistent object。
TEE_Result TEE_CreatePersistentObject(uint32_t storageID, void *objectID, size_t objectIDLen, uint32_t flags, TEE_ObjectHandle attributes, void *initialData, size_t initialDataLen, TEE_ObjectHandle *object);
| Name | Description |
|---|---|
| storageID | 待访问的Trusted Storage Space。 |
| objectID | objectID。 |
| objectIDLen | 用来控制打开object handle的访问权限和共享权限。 |
| flags | persistent object的属性,可以为空。 |
| attributes | persistent object的属性,可以为空。 |
| initialData | persistent object的初始化数据。 |
| initialDataLen | persistent object的初始化数据长度。 |
| objec t | object handle,函数执行成功时其中包括打开文件的句柄,如果执行失败,则object为NULL。 |
关闭并且删除object。
void TEE_CloseAndDeletePersistentObject( TEE_ObjectHandle object);2.3 TEE_OpenPersistentObject
打开一个persistent object。
TEE_Result TEE_OpenPersistentObject(uint32_t storageID, void *objectID, size_t objectIDLen, uint32_t flags, TEE_ObjectHandle* object);2.4 TEE_ReadObjectData
该函数从object的data stream读取size字节数据,放到buffer指针指定的buffer,操作完成后将实际读取值写到count。
TEE_Result TEE_ReadObjectData(TEE_ObjectHandle object, void *buffer, size_t size, uint32_t *count);2.5 TEE_WriteObjectData
该函数从buffer中写入size字节的数据到object的data stream。
TEE_Result TEE_WriteObjectData(TEE_ObjectHandle object, void* buffer, size_t size);2.6 TEE_SeekObjectData
TEE_Result TEE_SeekObjectData(TEE_ObjectHandle object, int32_t offset, TEE_Whence whence);2.7 TEE_InfoObjectData
该函数获取数据流读取的位置和文件大小。
TEE_Result TEE_InfoObjectData(TEE_ObjectHandle object, uint32_t *pos, uint32_t *len);2.8 其它API描述
参照:我上传的资料。 —————— 持续完善中。
GP接口函数描述和入参解析
存储一段敏感数据,如密钥。
TEE_Result secure_stroage_test_demo1(void *buffer, uint32_t len)
{
TEE_ObjectHandle transient_key;
TEE_ObjectHandle persistent_key;
TEE_Attribute aes_attribute = {0};
void *objectID = "sec_storage_data/storekey";
TEE_Result ret = TEE_AllocateTransientObject(TEE_TYPE_AES, 256, &transient_key);
if (ret != TEE_SUCCESS) {
return ret;
}
TEE_InitRefAttribute(&aes_attribute, TEE_ATTR_SECRET_VALUE, buffer, len);
ret = TEE_PopulateTransientObject(transient_key, &aes_attribute, 1);
if (ret != TEE_SUCCESS) {
TEE_FreeTransientObject(transient_key);
return ret;
}
// 存入密钥 transient_key
ret = TEE_CreatePersistentObject(TEE_OBJECT_STORAGE_PRIVATE, objectID, strlen(objectID),
TEE_DATA_FLAG_ACCESS_WRITE, transient_key, NULL, 0,
&persistent_key);
if (ret != TEE_SUCCESS) {
TEE_FreeTransientObject(transient_key);
return ret;
}
TEE_CloseObject(persistent_key);
return TEE_SUCCESS;
}
2.10 demo代码2 - 使用安全存储接口读写一个简单的文件
#define SECSTORAGE_DEMO_PATH "/data/01.txt"
#define SECSTORAGE_DEMO_PATH_NEW "/data/02.txt"
TEE_Result secure_stroage_test_demo2(void)
{
char *initial_data_buff = "1234567890abcdef";
TEE_ObjectHandle object = NULL;
TEE_Result ret;
uint32_t flags = TEE_DATA_FLAG_ACCESS_READ | TEE_DATA_FLAG_ACCESS_WRITE |
TEE_DATA_FLAG_ACCESS_WRITE_META;
ret = TEE_CreatePersistentObject(TEE_OBJECT_STORAGE_PRIVATE,
SECSTORAGE_DEMO_PATH, strlen(SECSTORAGE_DEMO_PATH),
, TEE_HANDLE_NULL,
initial_data_buff , strlen(initial_data_buff), &object);
if (ret != TEE_SUCCESS) {
return ret;
}
uint32_t real_read_len = 0;
char read_buff[128] = {0};
ret = TEE_ReadObjectData(object, read_buff, sizeof(read_buff), &real_read_len);
if (ret != TEE_SUCCESS) {
TEE_CloseObject(object);
return ret;
}
char *write_buff = "abcdef1234567890";
ret = TEE_WriteObjectData(object, write_buff, strlen(write_buff));
if (ret != TEE_SUCCESS) {
TEE_CloseObject(object);
return ret;
}
TEE_CloseObject(object);
ret = TEE_OpenPersistentObject(TEE_OBJECT_STORAGE_PRIVATE, SECSTORAGE_DEMO_PATH,
strlen(SECSTORAGE_DEMO_PATH), flags, &object);
if (ret != TEE_SUCCESS) {
return ret;
}
ret = TEE_RenamePersistentObject(object, SECSTORAGE_DEMO_PATH_NEW,
strlen(SECSTORAGE_DEMO_PATH_NEW));
TEE_CloseAndDeletePersistentObject(object);
return ret;
}



