栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

OP-TEE内核学习笔记(一)(安全存储)—— GP 安全存储 API

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

OP-TEE内核学习笔记(一)(安全存储)—— GP 安全存储 API

存储文件基础操作
  • 一、基本文件操作流程
  • 二、 可信存储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 文件系统。读取文件以类似的方式处理。架构图如图所示:

二、 可信存储GP API

2.1 TEE_CreatePersistentObject

创建一个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);

NameDescription
storageID待访问的Trusted Storage Space。
objectIDobjectID。
objectIDLen用来控制打开object handle的访问权限和共享权限。
flagspersistent object的属性,可以为空。
attributespersistent object的属性,可以为空。
initialDatapersistent object的初始化数据。
initialDataLenpersistent object的初始化数据长度。
objec tobject handle,函数执行成功时其中包括打开文件的句柄,如果执行失败,则object为NULL。
2.2 TEE_CloseAndDeletePersistentObject

关闭并且删除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接口函数描述和入参解析

2.9 demo代码1 - 存储敏感数据

存储一段敏感数据,如密钥。

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;
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/859627.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号