Storage API和Crypto API中都会依赖TEE_ObjectHandle,该结构体可用于存储:

  • Secret key、Public keys、key-paris
  • Persistent data、Transient data

TEE_ObjectHandle在Crypto中的使用

TEE_ObjectHandle key;
res = TEE_AllocateTransientObject(TEE_TYPE_RSA_KEYPAIR, key_size, &key);

调用TEE_AllocateTransientObject,填充的TEE_ObjectHandle ,指向在TEE底层的struct tee_obj结构体。
事实上在TEE底层分配tee_obj结构体,然后将数据拷贝到user层的,如copy_kaddr_to_uref(obj, o), obj就被上层的TEE_ObjectHandle 所指向,o指向的TEE OS中的struct tee_obj结构体

struct tee_obj结构体的原型如下所示,void *attr有指向KEY数组,根据key_type的不同选择不同的数据类型

其实对于对称的密码算法,在底层对应的都是tee_cryp_obj_secret结构体:

也就是当我们调用TEE_AllocateTransientObject(TEE_TYPE_RSA_KEYPAIR, key_size, &key), 在TEE底层就根据key_type/key_size为我们分配好了数据类型.

那么如何获取和填充这些结构体呢? 可以使用TEE_GetObjectBufferAttributeTEE_InitRefAttribute两个函数.

TEE_Result TEE_GetObjectBufferAttribute(TEE_ObjectHandle object,uint32_t attributeID, void *buffer,uint32_t *size);TEE_Result TEE_GetObjectValueAttribute(TEE_ObjectHandle object,uint32_t attributeID, uint32_t *a,uint32_t *b);void TEE_InitRefAttribute(TEE_Attribute *attr, uint32_t attributeID,const void *buffer, uint32_t length);void TEE_InitValueAttribute(TEE_Attribute *attr, uint32_t attributeID,uint32_t a, uint32_t b);


例如这样调用,从TEE_ObjectHandle rsa_key 中获取d因子
res = TEE_GetObjectBufferAttribute(rsa_key, TEE_ATTR_RSA_MODULUS, addr, &read_bytes);

再例如使用TEE_ATTR_SECRET_VALUE将字符串类型的aeskey填入到TEE_ObjectHandle 结构体的使用示例:

TEE_ObjectHandle gen_key_aes_##name(char *key, size_t *key_sz)
{ TEE_Result res; TEE_Attribute attr; TEE_ObjectHandle aes_key; *key_sz = name / 8; generate_random(key, *key_sz); TEE_InitRefAttribute(&attr, TEE_ATTR_SECRET_VALUE, key, name / 8); res = TEE_AllocateTransientObject(TEE_TYPE_AES, name, &aes_key); if(res != TEE_SUCCESS) {return res;}res = TEE_PopulateTransientObject(aes_key, &attr, 1); if(res != TEE_SUCCESS) {return res;}return (res == TEE_SUCCESS) ? aes_key : NULL;
}

上面的示例中调用TEE_InitRefAttribute函数填充TEE_Attribute attr属性,事实上也可以直接填充,如下面这个示例;

 attr.attributeID = TEE_ATTR_SECRET_VALUE;attr.content.ref.buffer = aes_key;attr.content.ref.length = keysize / 8;res = TEE_PopulateTransientObject(hkey, &attr, 1);
(示例参考 : https://github.com/OP-TEE/optee_test/blob/master/ta/aes_perf/ta_aes_perf.c)

有关TEE_Attribute属性,原型如下:

(optee_os-3.12/out/arm/export-ta_arm64/include/tee_api_types.h)
typedef struct {uint32_t attributeID;union {struct {void *buffer;uint32_t length;} ref;struct {uint32_t a, b;} value;} content;
} TEE_Attribute;

前面的两个例子中分别:

  • 使用TEE_InitRefAttribute构造了一个TEE_Attribute,然后再使用TEE_PopulateTransientObject转换成TEE_ObjectHandle
  • 直接填充TEE_Attribute,然后再使用TEE_PopulateTransientObject转换成TEE_ObjectHandle

关于Transient Object类的API这里也做一个总结:


以下为代码导读

(optee_os-3.12/core/include/tee/tee_obj.h)
struct tee_obj {TAILQ_ENTRY(tee_obj) link;TEE_ObjectInfo info;bool busy;        /* true if used by an operation */uint32_t have_attrs;  /* bitfield identifying set properties */void *attr;size_t ds_pos;struct tee_pobj *pobj;    /* ptr to persistant object */struct tee_file_handle *fh;
};(optee_os-3.12/out/arm/export-ta_arm64/include/tee_api_types.h)
typedef struct {uint32_t objectType;__extension__ union {uint32_t keySize;  /* used in 1.1 spec */uint32_t objectSize;  /* used in 1.1.1 spec */};__extension__ union {uint32_t maxKeySize; /* used in 1.1 spec */uint32_t maxObjectSize;   /* used in 1.1.1 spec */};uint32_t objectUsage;uint32_t dataSize;uint32_t dataPosition;uint32_t handleFlags;
} TEE_ObjectInfo;
(optee_os-3.12/lib/libutee/tee_api_objects.c)
TEE_Result TEE_AllocateTransientObject(TEE_ObjectType objectType,uint32_t maxKeySize,TEE_ObjectHandle *object)
{TEE_Result res;uint32_t obj;__utee_check_out_annotation(object, sizeof(*object));res = _utee_cryp_obj_alloc(objectType, maxKeySize, &obj);if (res != TEE_SUCCESS &&res != TEE_ERROR_OUT_OF_MEMORY &&res != TEE_ERROR_NOT_SUPPORTED)TEE_Panic(res);if (res == TEE_SUCCESS)*object = (TEE_ObjectHandle)(uintptr_t)obj;return res;
}(optee_os-3.12/core/tee/tee_svc_cryp.c)
TEE_Result syscall_cryp_obj_alloc(unsigned long obj_type,unsigned long max_key_size, uint32_t *obj)
{struct ts_session *sess = ts_get_current_session();TEE_Result res = TEE_SUCCESS;struct tee_obj *o = NULL;o = tee_obj_alloc();if (!o)return TEE_ERROR_OUT_OF_MEMORY;res = tee_obj_set_type(o, obj_type, max_key_size);if (res != TEE_SUCCESS) {tee_obj_free(o);return res;}tee_obj_add(to_user_ta_ctx(sess->ctx), o);res = copy_kaddr_to_uref(obj, o);if (res != TEE_SUCCESS)tee_obj_close(to_user_ta_ctx(sess->ctx), o);return res;
}(optee_os-3.12/core/include/tee/tee_obj.h)
struct tee_obj {TAILQ_ENTRY(tee_obj) link;TEE_ObjectInfo info;bool busy;        /* true if used by an operation */uint32_t have_attrs;  /* bitfield identifying set properties */void *attr;size_t ds_pos;struct tee_pobj *pobj;    /* ptr to persistant object */struct tee_file_handle *fh;
};

TEE_ObjectHandle在Crypto中的使用相关推荐

  1. CTF Crypto中涉及的AES题目

    CTF Crypto中涉及的AES题目 单独涉及AES_ECB模式 单独涉及AES_CBC模式 ProblemProblemProblem AnalysisAnalysisAnalysis Solvi ...

  2. 攻防世界crypto中 banana-princess的 writeup,真是坑啊

    这个题折腾了好久都没有思路,pdf打不开,也没有任何的提示,后来实在没辙了,找了个pdf来对比,终于有了发现: 1.对比一个正常能打开的pdf和题目的pdf头,发现如下(notepad++打开的是正常 ...

  3. Linux内核 crypto文件夹 密码学知识学习

    密码算法分类 对称算法 非对称算法 消息摘要(单向哈希)算法 这些算法作为加密函数框架的最底层,提供加密和解密的实际操作.这些函数可以在内核crypto文件夹下,相应的文件中找到.不过内核模块不能直接 ...

  4. node.js中公培训笔记大全(讲的一般,小白基础入门)

    day01 本阶段的授课内容为 ES6 2天-3天 NodeJS 2天-3天 express 2天-3天 webpack 1天 MySQL数据库 2天 实战项目 2天 今天的授课内容为 1.ES5-严 ...

  5. Kernel Crypto框架

    随着数字时代的发展,每天都有海量的数据产生,并且用户也越来越重视个人隐私数据的安全,从某种意义上讲,用户个人数据的价值正逐步高于设备本身.实现数据安全保护的基础是[密钥 + 加密算法]:对于加密算法, ...

  6. CTF 中RSA的常见解析

    0x01 前言 这里就不讨论数论的基础了,进行RSA的题目解答,至少要懂得基本的数论知识的,如果不了解数论的基本知识的话,网上相关内容还是挺多的. RSA基于一个简单的数论事实,两个大素数相乘十分容易 ...

  7. Crypto++(一)Diffie-Hellman

    本文翻译自 https://www.cryptopp.com/wiki/Diffie-Hellman,本人英文水平有限,如有翻译不当之处请给出修改建议! 1. Diffie-Hellman 密钥协商算 ...

  8. 流动性视角中 CeFi 的功与过

    TL;DR Crypto 市场美元化之后,流动性(美元稳定币)主要是通过外部输入来供给,来支持行业内的投资.投机和经营需求.在 2017-2018 年 ICO 阶段,crypto 行业中主要的融资是通 ...

  9. AutoSAR Crypto Stack

    1 Stack Architecture The Crypto Service Manager (CSM) CSM控制一个或者多个Client对一个或者多个同步或异步加密服务.它提供了优先级队列来管理 ...

最新文章

  1. tomcat 中部署java web项目
  2. 文巾解题 319. 灯泡开关
  3. Linux之shell脚本遍历文件夹下所有文件
  4. json中omitempty字段的使用
  5. HALCON示例程序class_ndim_box.hdev基于多通道图像的分类
  6. 解决: VUE 项目中表单提交中文乱码、接口请求参数中文乱码
  7. lock字段mysql_MySQL的lock tables和unlock tables的用法(转载)
  8. html网页中使用mock,关于Mock.js使用
  9. 关于微信内置浏览器,打开图片上传功能,调用的问题
  10. java ocr linux_linux系统如何使用tess4j(java)进行ocr图片文字识别
  11. linux释放系统内存,系统运维
  12. CentOS 6.5 最小化安装zabbix
  13. 给android应用程序系统的签名
  14. guid会重复么_饿了么请你考虑一下消费者
  15. 'gbk' codec can't encode character解决方法
  16. 电脑全能工具箱,400+工具免费用
  17. PWM波、方波的输出与捕获
  18. OFFICE文档转换到PDF的几种方法与转换效率和性能的简单比较
  19. 解决windows10下总是很快自动黑屏进入睡眠问题
  20. python图标变成了白色_怎么解决图标变成白色图标的问题

热门文章

  1. php获取总共内存_php获取页面运行使用内存的两个函数
  2. python numpy库安装winerror5_(转载)Numpy安装中遇到的问题和解决方法
  3. 成功解决ModuleNotFoundError: No module named 'torch.utils.tensorboard'
  4. Java:Java的jar包之POI的简介、安装、使用方法(基于POI将Word、Excel、PPT转换为html)之详细攻略
  5. Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.
  6. 多线程学习笔记一之内置锁
  7. Python基础训练题-简单数学公式
  8. ADO.NET 【属性扩展】性别、年龄、编号
  9. 【CSS3】好玩的动画线框
  10. HDU2604 Queuing